diff --git a/.gitignore b/.gitignore index 1f9b9468..d7370a10 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,8 @@ target .factorypath log/ +logs/ *.factorypath -*.log lili-shop/src/main/java/cn/lili/generator/CodeGenerator.java lili-logs @@ -19,7 +19,6 @@ lili-logs ### STS ### .apt_generated .classpath -.factorypath .project .settings .springBeans @@ -28,7 +27,6 @@ lili-logs ### IntelliJ IDEA ### .idea *.iws -*.iml *.ipr ### NetBeans ### diff --git a/DB/README.md b/DB/README.md new file mode 100644 index 00000000..da94b706 --- /dev/null +++ b/DB/README.md @@ -0,0 +1,6 @@ +## PS:数据库位置 + +点击跳转 https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql 这里有与tag版本一致的sql,根据tag获取sql,如果使用master代码,则需要在lilishop项目根目录的update-sql目录中,获取对应的升级sql。 + + +使用master分支代码时,可能会无法运行,执行完初始化sql之后需要执行当前目录下'versiontXXXXtoMASTER.sql'。 \ No newline at end of file diff --git a/DB/li_notice_message.sql b/DB/li_notice_message.sql new file mode 100644 index 00000000..90de51ce --- /dev/null +++ b/DB/li_notice_message.sql @@ -0,0 +1,67 @@ +/* + Navicat MySQL Data Transfer + + Source Server : 192.168.0.116 + Source Server Type : MySQL + Source Server Version : 80023 + Source Host : 192.168.0.116:3306 + Source Schema : lilishop + + + Target Server Type : MySQL + Target Server Version : 80023 + File Encoding : 65001 + + Date: 27/07/2021 19:42:15 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_notice_message +-- ---------------------------- +DROP TABLE IF EXISTS `li_notice_message`; +CREATE TABLE `li_notice_message` ( + `id` bigint NOT NULL, + `create_by` varchar(255) DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `delete_flag` bit(1) DEFAULT NULL, + `update_by` varchar(255) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `notice_content` varchar(255) DEFAULT NULL, + `notice_node` varchar(255) DEFAULT NULL, + `notice_status` varchar(255) DEFAULT NULL, + `notice_title` varchar(255) DEFAULT NULL, + `variable` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of li_notice_message +-- ---------------------------- +BEGIN; +INSERT INTO `li_notice_message` VALUES (1, NULL, '2021-07-14 19:22:03.000000', NULL, NULL, '2021-07-14 19:22:09.000000', '订单 #{商品名称}已经提交成功,请及时付款哦~', '订单提交成功通知', 'OPEN', '订单提交成功通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (2, NULL, '2021-07-14 19:22:06.000000', NULL, NULL, '2021-07-14 19:22:11.000000', '订单#{商品名称}支付成功,我们将尽快为您安排发货哦~', '订单支付成功通知', 'OPEN', '订单支付成功通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (3, NULL, '2021-07-15 19:10:14.000000', NULL, NULL, '2021-07-15 19:10:17.000000', '订单#{商品名称}已发货,请注意物流进度哦~', '订单发货通知\n', 'OPEN', '订单发货通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (4, NULL, '2021-07-15 19:12:00.000000', NULL, NULL, '2021-07-15 19:12:02.000000', '订单#{商品名称}已完成,期待您分享商品评价与购物心得哦~', '订单完成通知', 'OPEN', '订单完成通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (5, NULL, '2021-07-15 19:14:01.000000', NULL, NULL, '2021-07-15 19:14:04.000000', '订单#{商品名称}已取消,取消原因为 #{取消原因},请及时关注您的订单状态哦~', '订单取消成功通知', 'OPEN', '订单取消通知', 'goods,cancel_reason'); +INSERT INTO `li_notice_message` VALUES (6, NULL, '2021-07-15 19:26:27.000000', NULL, NULL, '2021-07-15 19:26:34.000000', '商品#{商品名称}还没有收到您的评价呢,期待您与我们分享哦~', '订单评价提醒', 'OPEN', '订单评价提醒', 'goods'); +INSERT INTO `li_notice_message` VALUES (7, NULL, '2021-07-15 19:26:25.000000', NULL, NULL, '2021-07-15 19:26:37.000000', '恭喜,您的拼团#{商品名称}已成团,我们将尽快为您安排发货哦~', '拼团成功通知', 'OPEN', '拼团成功通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (8, NULL, '2021-07-15 19:31:45.000000', NULL, NULL, '2021-07-15 19:31:49.000000', '售后单 #{商品名称} 已经提交成功,需要商家审核,请耐心等待哦~', '售后提交成功通知', 'OPEN', '售后提交成功通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (9, NULL, '2021-07-15 19:32:44.000000', NULL, NULL, '2021-07-15 19:32:49.000000', '售后单 #{商品名称} 已通过退货审核,请尽快安排将货物退还至商家哦~', '退货审核通过通知', 'OPEN', '退货审核通过通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (10, NULL, '2021-07-15 19:32:46.000000', NULL, NULL, '2021-07-15 19:32:52.000000', '售后单 #{商品名称} 已通过退款审核,将在1-3个工作日内自动退款~', '退款审核通过通知', 'OPEN', '退款审核通过通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (11, NULL, '2021-07-15 19:36:48.000000', NULL, NULL, '2021-07-15 19:36:50.000000', '很抱歉,售后单#{商品名称}未通过商家退货审核,原因是:#{拒绝原因}', '退货审核未通过通知', 'OPEN', '退货审核未通过通知', 'goods,refuse'); +INSERT INTO `li_notice_message` VALUES (12, NULL, '2021-07-15 19:36:46.000000', NULL, NULL, '2021-07-15 19:36:52.000000', '很抱歉,售后单#{商品名称}未通过商家退款审核,原因是:#{拒绝原因}', '退款审核未通过通知', 'OPEN', '退款审核未通过通知', 'goods,refuse'); +INSERT INTO `li_notice_message` VALUES (13, NULL, '2021-07-15 19:39:31.000000', NULL, NULL, '2021-07-15 19:39:34.000000', '很抱歉,您的退货物品{退单第一行商品名称}被商家拒收,原因是:#{拒绝原因}', '退货物品拒收通知', 'OPEN', '退货物品拒收通知', 'goods,refuse'); +INSERT INTO `li_notice_message` VALUES (14, NULL, '2021-07-15 19:39:39.000000', NULL, NULL, '2021-07-15 19:39:43.000000', '订单 #{商品名称} 商家已签收哦,请关注后续退款状态,将在1-3个工作日内自动退款~', '退货物品签收通知', 'OPEN', '退货物品签收通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (15, NULL, '2021-07-15 19:44:38.000000', NULL, NULL, '2021-07-15 19:44:40.000000', '售后单 #{商品名称} 已经完成,请关注及时关注售后单状态~', '售后完成通知', 'OPEN', '售后完成通知', 'goods'); +INSERT INTO `li_notice_message` VALUES (16, NULL, '2021-07-15 19:47:27.000000', NULL, NULL, '2021-07-15 19:47:31.000000', '您当前到账{获得积分}积分,消费#{消费积分} 积分,积分可以抵现金哦,真的很棒棒呢~', '积分变更通知', 'OPEN', '积分变更通知', 'income_points,expenditure_points'); +INSERT INTO `li_notice_message` VALUES (17, NULL, '2021-07-15 19:53:10.000000', NULL, NULL, '2021-07-15 19:53:13.000000', '您的余额账户今日收入¥#{收入金额},支出¥#{支出金额},如遇异常变动,请及时联系我们哦~', '余额账户变更通知', 'OPEN', '余额账户变更通知', 'income,expenditure'); +INSERT INTO `li_notice_message` VALUES (18, NULL, '2021-07-15 19:57:01.000000', NULL, NULL, '2021-07-15 19:57:04.000000', '恭喜您,您的提处理成功,提现金额为¥#{收入金额},请及时关注余额变动哦~', '余额提现成功通知', 'OPEN', '余额提现成功通知', 'income'); +INSERT INTO `li_notice_message` VALUES (19, NULL, '2021-07-21 18:58:10.000000', NULL, NULL, '2021-07-21 18:58:13.000000', '恭喜您,您的提现金额为¥#{金额}的申请已经提交审核,请及时关注审核动态哦~', '提现申请提交成功通知', 'OPEN', '提现申请提交成功通知', 'price'); +INSERT INTO `li_notice_message` VALUES (20, NULL, '2021-07-21 19:16:58.000000', NULL, NULL, '2021-07-21 19:17:02.000000', '很抱歉,您的提现金额为¥#{金额}的申请已被拒绝,如有问题请及时联系管理员哦~', '提现申请驳回通知', 'OPEN', '提现申请驳回通知', 'price'); +INSERT INTO `li_notice_message` VALUES (21, NULL, '2021-07-26 18:59:00.000000', NULL, NULL, '2021-07-26 18:59:03.000000', '恭喜您,您的提处理成功,提现金额为¥#{收入金额},将在1-3个工作日内到账~', '微信提现成功通知', 'OPEN', '微信提现成功通知', 'income'); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/DB/version4.0to4.1.sql b/DB/version4.0to4.1.sql new file mode 100644 index 00000000..e27642ee --- /dev/null +++ b/DB/version4.0to4.1.sql @@ -0,0 +1,124 @@ +/** 修改文章表**/ +ALTER TABLE li_article DROP COLUMN open_status; +ALTER TABLE li_article ADD open_status bit ( 1 ); +UPDATE li_article SET open_status = 1; +/** 增加会员等级会员经验值**/ +ALTER TABLE li_member ADD grade_id VARCHAR ( 32 ); +ALTER TABLE li_member ADD experience BIGINT; +/**去除商品运费承担**/ +ALTER TABLE li_goods DROP COLUMN freight_payer; +/**添加商品类型**/ +ALTER TABLE li_goods ADD goods_type VARCHAR ( 32 ); +ALTER TABLE li_goods_sku ADD goods_type VARCHAR ( 32 ); +ALTER TABLE li_specification ADD spec_value text; +UPDATE li_goods SET goods_type = "PHYSICAL_GOODS"; +UPDATE li_goods_sku SET goods_type = "PHYSICAL_GOODS"; +/**增加优惠券有效期类型**/ +ALTER TABLE li_coupon ADD range_day_type VARCHAR ( 32 ); +ALTER TABLE li_coupon ADD effective_days INT; +/**秒杀增加显示商品数量**/ +ALTER TABLE li_seckill ADD goods_num INT; +/**商品参数增加字段**/ +ALTER TABLE li_goods_params ADD is_index INT; +/**添加优惠券活动、直播、积分商品菜单**/ +DELETE FROM li_menu WHERE id = '1372391359398281216'; +DELETE FROM li_menu WHERE id = '1372394573938032640'; +INSERT INTO `li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1403988156444962818, 'admin', '2021-06-13 16:10:36', b'0', 'admin', '2021-06-13 16:44:47', 'null', 'promotion/couponActivity/coupon', '', 2, 'coupon-activity', '1367049214198022144', 'coupon-activity', 0.00, '券活动', 'null'); +INSERT INTO `li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1407601962899230721, 'admin', '2021-06-23 15:30:35', b'0', NULL, NULL, NULL, 'Main', '', 1, 'liveManage', '1367040067201138688', '/', 2.00, '直播管理', NULL); +INSERT INTO `li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1407602049759072258, 'admin', '2021-06-23 15:30:55', b'0', NULL, NULL, NULL, 'promotion/live/live', '', 2, 'live', '1407601962899230721', 'live', 1.00, '直播管理', NULL); +INSERT INTO `li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1407602441964244994, 'admin', '2021-06-23 15:32:29', b'0', NULL, NULL, NULL, 'Main', '', 1, 'pointManage', '1367040067201138688', '/', 3.00, '积分活动', NULL); +INSERT INTO `li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1407602516912263170, 'admin', '2021-06-23 15:32:47', b'0', NULL, NULL, NULL, 'promotion/pointsGoods/pointsGoods', '', 2, 'pointsGoods', '1407602441964244994', 'pointsGoods', 1.00, '积分商品', NULL); +INSERT INTO `li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1407602673334636546, 'admin', '2021-06-23 15:33:24', b'0', NULL, NULL, NULL, 'promotion/pointsGoodsCategory/pointsGoodsCategory', '', 2, 'pointsGoodsCategory', '1407602441964244994', 'pointsGoodsCategory', 2.00, '积分分类', NULL); +/** 添加直播间**/ +CREATE TABLE `li_studio` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) DEFAULT NULL COMMENT '是否删除', + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改者', + `update_time` datetime(6) DEFAULT NULL COMMENT '修改时间', + `anchor_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '主播昵称', + `anchor_wechat` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '主播微信号', + `cover_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '背景图', + `end_time` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '结束时间', + `feeds_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '封面图', + `media_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '回放视频链接', + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '直播间名字', + `qr_code_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '小程序直播码', + `recommend` bit(1) DEFAULT NULL COMMENT '推荐直播间', + `room_goods_list` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT '直播间商品', + `room_goods_num` int DEFAULT NULL COMMENT '直播间商品数量', + `room_id` int DEFAULT NULL COMMENT '房间ID', + `share_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '分享图', + `start_time` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '开始时间', + `status` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '直播间状态', + `store_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '店铺ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +/**添加直播间商品**/ +CREATE TABLE `li_commodity` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) DEFAULT NULL COMMENT '是否删除', + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改者', + `update_time` datetime(6) DEFAULT NULL COMMENT '修改时间', + `audit_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '审核单ID', + `audit_status` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '审核状态', + `goods_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '商品ID', + `goods_image` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '图片', + `live_goods_id` int DEFAULT NULL COMMENT '微信程序直播商品ID', + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '商品名称', + `price` double DEFAULT NULL COMMENT '价格', + `price2` double DEFAULT NULL COMMENT '价格2', + `price_type` int DEFAULT NULL COMMENT '价格类型', + `sku_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '规格ID', + `store_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '店铺ID', + `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '商品详情页的小程序路径', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +/**添加小程序直播-商品关联 **/ +CREATE TABLE `li_studio_commodity` ( + `id` bigint NOT NULL COMMENT 'ID', + `goods_id` int DEFAULT NULL COMMENT '商品ID', + `room_id` int DEFAULT NULL COMMENT '房间ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +/**添加优惠券活动 **/ +CREATE TABLE `li_coupon_activity` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) DEFAULT NULL COMMENT '是否删除', + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改者', + `update_time` datetime(6) DEFAULT NULL COMMENT '修改时间', + `end_time` datetime(6) DEFAULT NULL COMMENT '结束时间', + `promotion_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '活动名称', + `promotion_status` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '活动状态', + `start_time` datetime(6) DEFAULT NULL COMMENT '开始时间', + `store_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '店铺ID', + `store_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '店铺名称', + `activity_scope` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '活动范围', + `activity_scope_info` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT '活动范围详细', + `coupon_activity_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '活动类型', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +/**添加优惠券活动-优惠券关联 **/ +CREATE TABLE `li_coupon_activity_item` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) DEFAULT NULL COMMENT '是否删除', + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改者', + `update_time` datetime(6) DEFAULT NULL COMMENT '修改时间', + `activity_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '活动ID', + `coupon_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '优惠券ID', + `num` int DEFAULT NULL COMMENT '优惠券数量', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +/** 修改商品模板详情字段类型**/ +ALTER TABLE `li_draft_goods` MODIFY COLUMN `intro` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL; +/** 添加秒杀设置**/ +INSERT INTO `li_setting` ( `id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `setting_value` ) VALUES ( 'SECKILL_SETTING', NULL, NULL, NULL, 'admin', '2021-06-04 09:58:39.384000', '{\"seckillRule\":\"秒杀规则\",\"hours\":\"9,10,11,12,13,14,15,21,22,23\"}' ); +/** 添加直播间商品默认数量**/ +alter table li_studio alter column room_goods_num set default 0; \ No newline at end of file diff --git a/DB/version4.1to4.2.sql b/DB/version4.1to4.2.sql new file mode 100644 index 00000000..f81d5751 --- /dev/null +++ b/DB/version4.1to4.2.sql @@ -0,0 +1,28 @@ +/** 添加分销员结算信息**/ +ALTER TABLE li_distribution ADD settlement_bank_account_name varchar ( 200 ); +ALTER TABLE li_distribution ADD settlement_bank_account_num varchar ( 200 ); +ALTER TABLE li_distribution ADD settlement_bank_branch_name varchar ( 200 ); + +/** 文章分类添加默认值**/ +ALTER TABLE li_article_category alter column sort set default 0; +/** 添加分销提现菜单**/ +INSERT INTO `rxshop`.`li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1410862675914764290, 'admin', '2021-07-02 15:27:29', b'0', 'admin', '2021-07-02 15:27:45', 'null', 'distribution/distributionCash', '', 2, 'distributionCash', '1374173575405109248', 'distributionCash', 5.00, '分销提现', 'null'); + +/** 促销商品添加商品类型**/ +ALTER TABLE li_promotion_goods ADD goods_type varchar (200); +/** 修改历史积分积分类型的字段类型 **/ +alter table li_member_points_history modify column point_type varchar(50); +update li_member_points_history set point_type = 'INCREASE' where point_type=1; +update li_member_points_history set point_type = 'REDUCE' where point_type=0; + +/** 添加分词管理菜单*/ +INSERT INTO `rxshop`.`li_menu` (`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1349247640584085511, 'admin', '2021-01-13 14:51:20', b'0', 'admin', '2021-02-25 09:02:59', 'null', 'customWords/index', 'ios-american-football', 2, 'customWords', '1349237129847005184', 'customWords', 8.00, '分词管理', 'null'); + +/** 修改会员评价店铺图片字段类型 **/ +alter table li_member_evaluation modify column reply_image text; + +/** 修改售后图片字段类型 **/ +alter table li_after_sale modify column after_sale_image text; + +/** 提现申请审核sql **/ +INSERT INTO `rxshop`.`li_menu`(`id`, `create_by`, `create_time`, `delete_flag`, `update_by`, `update_time`, `description`, `front_route`, `icon`, `level`, `name`, `parent_id`, `path`, `sort_order`, `title`, `front_component`) VALUES (1367042804944994305, 'admin', '2021-03-03 09:22:58', b'0', NULL, NULL, NULL, 'member/advance/withdrawApply', 'ios-alert', 2, 'withdrawApply', '1367042490443497472', 'withdrawApply', 1.00, '提现申请', NULL); diff --git a/DB/version4.2.2to4.2.3.sql b/DB/version4.2.2to4.2.3.sql new file mode 100644 index 00000000..c4003390 --- /dev/null +++ b/DB/version4.2.2to4.2.3.sql @@ -0,0 +1,2 @@ +/** 新增店铺客服字段 **/ +ALTER TABLE li_store ADD merchant_euid varchar(255) COMMENT '客服标识'; \ No newline at end of file diff --git a/DB/version4.2.3to4.2.4.sql b/DB/version4.2.3to4.2.4.sql new file mode 100644 index 00000000..c34d6097 --- /dev/null +++ b/DB/version4.2.3to4.2.4.sql @@ -0,0 +1,64 @@ +/** 新增已退货数量 **/ +ALTER TABLE li_order_item ADD return_goods_number int DEFAULT 0 COMMENT '退货数量 '; + + +-- 促销重构sql +ALTER TABLE li_coupon DROP COLUMN promotion_status; + +ALTER TABLE li_coupon_activity DROP COLUMN promotion_status; +ALTER TABLE li_coupon_activity ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '范围关联的ID'; +ALTER TABLE li_coupon_activity ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型'; + +ALTER TABLE li_full_discount DROP COLUMN promotion_status; +ALTER TABLE li_full_discount ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID'; +ALTER TABLE li_full_discount ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型'; + +ALTER TABLE li_kanjia_activity_goods DROP COLUMN promotion_status; +ALTER TABLE li_kanjia_activity_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID'; +ALTER TABLE li_kanjia_activity_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型'; +ALTER TABLE li_kanjia_activity_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL; + +ALTER TABLE li_pintuan DROP COLUMN promotion_status; +ALTER TABLE li_pintuan ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID'; +ALTER TABLE li_pintuan ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型'; + +ALTER TABLE li_points_goods DROP COLUMN promotion_status; +ALTER TABLE li_points_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID'; +ALTER TABLE li_points_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型'; +ALTER TABLE li_points_goods ADD `original_price` double(10,2) DEFAULT NULL COMMENT '原价'; +ALTER TABLE li_points_goods ADD `thumbnail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '缩略图'; +ALTER TABLE li_points_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品编号'; +ALTER TABLE li_points_goods ADD `goods_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '货品名称'; + +ALTER TABLE li_promotion_goods DROP COLUMN promotion_status; +ALTER TABLE li_promotion_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID'; +ALTER TABLE li_promotion_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型'; +ALTER TABLE li_promotion_goods ADD `original_price` double(10,2) DEFAULT NULL COMMENT '原价'; +ALTER TABLE li_promotion_goods ADD `points` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '兑换积分'; +ALTER TABLE li_promotion_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品编号'; + +ALTER TABLE li_seckill DROP COLUMN promotion_status; +ALTER TABLE li_seckill ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID'; +ALTER TABLE li_seckill ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型'; + +ALTER TABLE li_full_discount RENAME COLUMN is_coupon TO coupon_flag; +ALTER TABLE li_full_discount RENAME COLUMN is_free_freight TO free_freight_flag; +ALTER TABLE li_full_discount RENAME COLUMN is_full_minus TO full_minus_flag; +ALTER TABLE li_full_discount RENAME COLUMN is_full_rate TO full_rate_flag; +ALTER TABLE li_full_discount RENAME COLUMN is_gift TO gift_flag; +ALTER TABLE li_full_discount RENAME COLUMN is_point TO point_flag; + +ALTER TABLE li_member_coupon RENAME COLUMN is_platform TO platform_flag; + +ALTER TABLE li_goods RENAME COLUMN is_auth TO auth_flag; + +ALTER TABLE li_goods_sku RENAME COLUMN is_promotion TO promotion_flag; +ALTER TABLE li_goods_sku RENAME COLUMN is_auth TO auth_flag; + + +-- 增加会员表索引 +ALTER TABLE li_member ADD INDEX query_mobile (`mobile`) COMMENT 'query_member'; +-- 会员签到唯一索引 惠券查询索引 +ALTER TABLE li_member_sign ADD INDEX query_create_time (`create_time`) COMMENT 'query_create_time'; +ALTER TABLE li_member_sign ADD INDEX query_member_id (`member_id`) COMMENT 'query_member_id'; +ALTER TABLE li_member_sign add unique uk_member_day (member_id, create_time) COMMENT 'uk_member_day'; \ No newline at end of file diff --git a/DB/version4.2.4to4.2.5.sql b/DB/version4.2.4to4.2.5.sql new file mode 100644 index 00000000..875e53df --- /dev/null +++ b/DB/version4.2.4to4.2.5.sql @@ -0,0 +1,521 @@ +/**增加店铺发货信息**/ +ALTER TABLE li_store_detail ADD `sales_consignor_address_id` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货地址id'; +ALTER TABLE li_store_detail ADD `sales_consignor_address_path` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货地址名称'; +ALTER TABLE li_store_detail ADD `sales_consignor_detail` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货详细地址'; +ALTER TABLE li_store_detail ADD `sales_consignor_mobile` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货人手机'; +ALTER TABLE li_store_detail ADD `sales_consignor_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货人姓名'; + +/**增加电子面单店铺信息**/ +ALTER TABLE `li_store_logistics` ADD `customer_name` varchar(255) DEFAULT NULL COMMENT '客户代码'; +ALTER TABLE `li_store_logistics` ADD `customer_pwd` varchar(255) DEFAULT NULL COMMENT '客户密码'; +ALTER TABLE `li_store_logistics` ADD `month_code` varchar(255) DEFAULT NULL COMMENT '月结号/密钥'; +ALTER TABLE `li_store_logistics` ADD `send_site` varchar(255) DEFAULT NULL COMMENT '归属网点'; +ALTER TABLE `li_store_logistics` ADD `send_staff` varchar(255) DEFAULT NULL COMMENT '收件快递员'; +ALTER TABLE `li_store_logistics` ADD `face_sheet_flag` bit(1) DEFAULT NULL COMMENT '是否使用电子面单'; +ALTER TABLE `li_store_logistics` ADD `pay_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '支付方式'; +ALTER TABLE `li_store_logistics` ADD `exp_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '快递类型'; + +/** 店铺--默认页面是否开启**/ +ALTER TABLE li_store ADD page_show bit(1) DEFAULT NULL COMMENT '默认页面是否开启'; + +/** 创建店员表 **/ +/* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 03/03/2022 19:30:20 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_clerk +-- ---------------------------- +DROP TABLE IF EXISTS `li_clerk`; +CREATE TABLE `li_clerk` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(6) NULL DEFAULT NULL COMMENT '更新时间', + `clerk_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '店员名称', + `member_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '会员id', + `store_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '店铺id', + `department_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '部门id', + `role_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '角色', + `shopkeeper` bit(1) NULL DEFAULT NULL COMMENT '是否是店主', + `is_super` bit(1) NULL DEFAULT NULL COMMENT '是否是超级管理员 超级管理员/普通管理员', + `status` bit(1) NULL DEFAULT NULL COMMENT '状态', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; + + +/** 店员角色**/ +/* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 03/03/2022 19:30:39 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_clerk_role +-- ---------------------------- +DROP TABLE IF EXISTS `li_clerk_role`; +CREATE TABLE `li_clerk_role` ( + `id` bigint NOT NULL COMMENT 'ID', + `clerk_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '店员唯一id', + `role_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '角色唯一id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; + + +/** 店铺部门 **/ +/* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 03/03/2022 19:31:39 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_store_department +-- ---------------------------- +DROP TABLE IF EXISTS `li_store_department`; +CREATE TABLE `li_store_department` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(6) NULL DEFAULT NULL COMMENT '更新时间', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '部门名称', + `store_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '店铺id', + `parent_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '父id', + `sort_order` decimal(20, 2) NULL DEFAULT NULL COMMENT '排序值', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; + +/** 部门角色关联 **/ +/* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 03/03/2022 19:32:01 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_store_department_role +-- ---------------------------- +DROP TABLE IF EXISTS `li_store_department_role`; +CREATE TABLE `li_store_department_role` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(6) NULL DEFAULT NULL COMMENT '更新时间', + `role_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '角色id', + `department_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '部门id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; + +/**店铺角色菜单**/ +/* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 03/03/2022 19:34:42 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_store_menu_role +-- ---------------------------- +DROP TABLE IF EXISTS `li_store_menu_role`; +CREATE TABLE `li_store_menu_role` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(6) NULL DEFAULT NULL COMMENT '更新时间', + `role_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '角色id', + `menu_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '菜单', + `store_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '店铺id', + `is_super` bit(1) NULL DEFAULT NULL COMMENT '是否拥有操作数据权限,为否则只有查看权限', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; + + +/**店铺角色**/ + /* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 03/03/2022 19:32:59 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_store_role +-- ---------------------------- +DROP TABLE IF EXISTS `li_store_role`; +CREATE TABLE `li_store_role` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(6) NULL DEFAULT NULL COMMENT '更新时间', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '角色名称', + `store_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '店铺id', + `default_role` bit(1) NULL DEFAULT NULL COMMENT '是否为注册默认角色', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC; + +SET FOREIGN_KEY_CHECKS = 1; + + + /* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 02/03/2022 09:57:49 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_menu +-- ---------------------------- +DROP TABLE IF EXISTS `li_menu`; +CREATE TABLE `li_menu` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '说明备注', + `front_route` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '前端路由', + `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标', + `level` int NULL DEFAULT NULL COMMENT '层级', + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单/权限名称', + `parent_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父id', + `path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '赋权API地址,正则表达式', + `sort_order` decimal(10, 2) NULL DEFAULT NULL COMMENT '排序值', + `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单标题', + `front_component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件地址', + `permission` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限url', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of li_menu +-- ---------------------------- +INSERT INTO `li_menu` VALUES (1348810750596767744, 'admin', '2021-01-12 09:55:17', b'0', 'admin', '2021-01-15 09:42:50', 'null', '1', 'ios-american-football', 0, 'settings', '0', '1', 2.00, '设置', 'null', NULL); +INSERT INTO `li_menu` VALUES (1348810864748945408, 'admin', '2021-01-12 09:55:45', b'0', 'admin', '2021-03-15 20:57:12', 'null', 'null', 'ios-american-football', 0, 'log', '0', 'null', 3.00, '日志', 'null', '/manager/setting/log*'); +INSERT INTO `li_menu` VALUES (1349237129847005184, 'admin', '2021-01-13 14:09:34', b'0', 'admin', '2021-01-15 09:43:16', 'null', 'Main', 'ios-american-football', 1, 'sys', '1348810750596767744', '/sys', 1.00, '系统设置', 'null', NULL); +INSERT INTO `li_menu` VALUES (1349237207378714624, 'admin', '2021-01-13 14:09:53', b'0', 'admin', '2021-07-27 16:07:49', 'null', 'Main', 'ios-american-football', 1, 'member', '1348810750596767744', '/member', 0.00, '用户管理', 'null', '/manager/permission/department*,/manager/passport/user*,/manager/permission/role*,/manager/permission/menu*,/manager/passport/user/admin/edit*'); +INSERT INTO `li_menu` VALUES (1349237928434098176, 'admin', '2021-01-13 14:13:03', b'0', 'admin', '2021-07-27 16:09:11', 'null', 'Main', 'ios-american-football', 1, 'log', '1348810864748945408', '/log', 1.00, '系统监控', 'null', '/manager/log*'); +INSERT INTO `li_menu` VALUES (1349246048900243456, 'admin', '2021-01-13 14:45:00', b'0', 'admin', '2021-07-27 16:07:57', 'null', 'sys/setting-manage/settingManage', 'ios-american-football', 2, 'setting', '1349237129847005184', 'setting', 1.00, '系统设置', 'null', '/manager/system/setting/get*,/manager/system/setting/put*,/manager/setting/setting*'); +INSERT INTO `li_menu` VALUES (1349246347597602816, 'admin', '2021-01-13 14:46:12', b'0', 'admin', '2021-07-27 16:08:03', 'null', 'sys/oss-manage/ossManage', 'ios-american-football', 2, 'oss-manage', '1349237129847005184', 'oss-manage', 3.00, 'OSS资源', '', '/manager/common/file*'); +INSERT INTO `li_menu` VALUES (1349246468775239680, 'admin', '2021-01-13 14:46:41', b'0', 'admin', '2021-07-27 16:08:14', 'null', 'region/index', 'ios-american-football', 2, 'region', '1349237129847005184', 'region', 4.00, '行政地区', 'null', '/manager/region*'); +INSERT INTO `li_menu` VALUES (1349246671158796288, 'admin', '2021-01-13 14:47:29', b'0', 'admin', '2021-07-27 16:08:09', 'null', 'logistics/index', 'ios-american-football', 2, 'logistics', '1349237129847005184', 'logistics', 5.00, '物流公司', 'null', '/manager/other/logistics*'); +INSERT INTO `li_menu` VALUES (1349246896661356544, 'admin', '2021-01-13 14:48:23', b'0', 'admin', '2021-07-27 16:08:23', 'null', 'sys/setting-manage/settingManage', 'ios-american-football', 2, 'authLogin', '1349237129847005184', 'authLogin', 6.00, '信任登录', 'null', '/manager/system/setting/get*,/manager/system/setting/put*,/manager/setting/setting*\r\n'); +INSERT INTO `li_menu` VALUES (1349247081504333824, 'admin', '2021-01-13 14:49:07', b'0', 'admin', '2021-07-27 16:08:45', 'null', 'sys/setting-manage/settingManage', 'ios-american-football', 2, 'pay', '1349237129847005184', 'pay', 7.00, '支付设置', 'null', '/manager/system/setting/get*,/manager/system/setting/put*,/manager/system/setting*'); +INSERT INTO `li_menu` VALUES (1349247640584085504, 'admin', '2021-01-13 14:51:20', b'0', 'admin', '2021-07-27 16:08:56', 'null', 'sensitiveWords/index', 'ios-american-football', 2, 'sensitiveWords', '1349237129847005184', 'sensitiveWords', 8.00, '敏感词', 'null', '/manager/other/sensitiveWords*'); +INSERT INTO `li_menu` VALUES (1349254815809298432, 'admin', '2021-01-13 15:19:51', b'0', 'admin', '2021-01-15 11:15:40', 'null', 'sys/user-manage/userManage', 'ios-american-football', 2, 'user-manage', '1349237207378714624', 'user-manage', 1.00, '用户管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1349255214977015808, 'admin', '2021-01-13 15:21:26', b'0', 'admin', '2021-01-15 11:16:21', 'null', 'sys/department-manage/departmentManage', 'ios-american-football', 2, 'department-manage', '1349237207378714624', 'department-manage', 3.00, '部门管理', 'null', '/manager/permission/department*,/manager/permission/departmentRole*,'); +INSERT INTO `li_menu` VALUES (1349255404425338880, 'admin', '2021-01-13 15:22:11', b'0', 'admin', '2021-02-24 09:22:21', 'null', 'sys/role-manage/roleManage', 'ios-american-football', 2, 'role-manage', '1349237207378714624', 'role-manage', 4.00, '角色权限', 'null', '/manager/permission/role*,/manager/permission/roleMenu*'); +INSERT INTO `li_menu` VALUES (1349256082979840000, 'admin', '2021-01-13 15:24:53', b'0', 'admin', '2021-01-15 11:18:14', 'null', 'sys/log-manage/logManage', 'ios-american-football', 2, 'log-manage', '1349237928434098176', 'log-manage', 2.00, '日志管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1357584224760102912, 'admin', '2021-02-05 06:57:57', b'0', 'admin', '2021-07-27 16:09:02', 'null', 'sys/app-version/appVersion', 'ios-american-football', 2, 'appVersion', '1349237129847005184', 'appVersion', 9.00, 'APP版本', 'null', '/manager/other/appVersion*'); +INSERT INTO `li_menu` VALUES (1357873097859923969, 'admin', '2021-02-24 09:53:02', b'0', 'admin', '2021-02-24 09:53:12', NULL, 'sys/menu-manage/menuManage', 'ios-american-football', 2, 'menuManage', '1349237207378714624', 'menu-manage', 2.00, '菜单管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367038467288072192, 'admin', '2021-03-03 09:05:44', b'0', 'admin', '2021-03-03 09:09:27', 'null', 'null', 'ios-person-add', 0, 'member', '0', 'null', 0.00, '会员', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367039534616805376, 'admin', '2021-03-03 09:09:58', b'0', 'admin', '2021-05-18 10:51:12', 'null', 'null', 'md-reorder', 0, 'order', '0', 'null', 0.00, '订单', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367039950368800768, 'admin', '2021-03-03 09:11:37', b'0', NULL, NULL, NULL, NULL, 'ios-share', 0, 'goods', '0', NULL, 0.20, '商品', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367040067201138688, 'admin', '2021-03-03 09:12:05', b'0', 'admin', '2021-12-02 19:45:22', NULL, 'null', 'ios-hammer', 0, 'promotions', '0', 'null', 0.30, '促销', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1367040599596728320, 'admin', '2021-03-03 09:14:12', b'0', 'admin', '2021-03-03 09:52:13', 'null', 'null', 'ios-color-palette', 0, 'operate', '0', 'null', 0.50, '运营', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367040819248234496, 'admin', '2021-03-03 09:15:04', b'0', 'lili_ftyy', '2022-03-01 15:13:04', NULL, 'null', 'ios-stats', 0, 'statistics', '0', 'null', 0.70, '统计', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1367041332861730816, 'admin', '2021-03-03 09:17:07', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, '/', '1367038467288072192', '/', 0.00, '会员管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367041461194850304, 'admin', '2021-03-03 09:17:37', b'0', 'admin', '2021-07-27 16:02:17', NULL, 'member/list/index', 'ios-aperture', 2, 'memberList', '1367041332861730816', 'memberList', 0.00, '会员列表', NULL, '/manager/common/file*,/manager/passport/member*'); +INSERT INTO `li_menu` VALUES (1367041575619657728, 'admin', '2021-03-03 09:18:05', b'0', 'admin', '2021-07-27 15:59:50', NULL, 'member/list/memberRecycle', 'ios-aperture', 2, 'memberRecycle', '1367041332861730816', 'memberRecycle', 1.00, '回收站', NULL, '/manager/member*'); +INSERT INTO `li_menu` VALUES (1367042490443497472, 'admin', '2021-03-03 09:21:43', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, '/', '1367038467288072192', '/', 1.00, '预存款', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367042664410644480, 'admin', '2021-03-03 09:22:24', b'0', 'admin', '2021-07-27 16:02:44', 'null', 'member/advance/walletLog', 'ios-aperture', 2, 'walletLog', '1367042490443497472', 'walletLog', 0.00, '会员资金', 'null', '/manager/wallet/log*'); +INSERT INTO `li_menu` VALUES (1367042804944994304, 'admin', '2021-03-03 09:22:58', b'0', 'admin', '2021-07-27 16:02:48', NULL, 'member/advance/recharge', 'ios-alert', 2, 'recharge', '1367042490443497472', 'recharge', 1.00, '充值记录', NULL, '/manager/wallet/recharge*'); +INSERT INTO `li_menu` VALUES (1367042804944994305, 'admin', '2021-03-03 09:22:58', b'0', 'admin', '2021-07-27 16:02:52', NULL, 'member/advance/withdrawApply', 'ios-alert', 2, 'withdrawApply', '1367042490443497472', 'withdrawApply', 1.00, '提现申请', NULL, '/manager/wallet/withdrawApply*'); +INSERT INTO `li_menu` VALUES (1367042917113266176, 'admin', '2021-03-03 09:23:25', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, 'commont', '1367038467288072192', '/', 0.00, '评价', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367043020976816128, 'admin', '2021-03-03 09:23:49', b'0', 'admin', '2021-07-27 16:02:35', NULL, 'goods/goods-review/index', 'md-aperture', 2, 'goodsReview', '1367042917113266176', 'goodsReview', 0.00, '会员评价', NULL, '/manager/memberEvaluation*'); +INSERT INTO `li_menu` VALUES (1367043443917848576, 'admin', '2021-03-03 09:25:30', b'0', 'admin', '2021-07-27 16:03:00', NULL, 'Main', 'md-aperture', 1, 'order', '1367039534616805376', '/', 0.00, '订单', NULL, '/manager/orders*'); +INSERT INTO `li_menu` VALUES (1367043505771249664, 'admin', '2021-03-03 09:25:45', b'0', NULL, NULL, NULL, 'Main', 'md-aperture', 1, 'aftersale', '1367039534616805376', '/', 0.00, '售后', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367043642379730944, 'admin', '2021-03-03 09:26:17', b'0', NULL, NULL, NULL, 'order/order/orderList', 'ios-aperture', 2, 'orderList', '1367043443917848576', 'orderList', 0.00, '商品订单', NULL, '/manager/order/order*'); +INSERT INTO `li_menu` VALUES (1367043791105556480, 'admin', '2021-03-03 09:26:53', b'0', NULL, NULL, NULL, 'order/order/fictitiousOrderList', 'ios-aperture', 2, 'fictitiousOrderList', '1367043443917848576', 'fictitiousOrderList', 1.00, '虚拟订单', NULL, '/manager/order/order*'); +INSERT INTO `li_menu` VALUES (1367043980407078912, 'admin', '2021-03-03 09:27:38', b'0', 'admin', '2021-07-27 16:03:43', NULL, 'order/after-order/afterSaleOrder', 'md-alert', 2, 'afterSaleOrder', '1367043505771249664', 'afterSaleOrder', 0.00, '售后管理', NULL, '/manager/order/afterSale*'); +INSERT INTO `li_menu` VALUES (1367044121163726848, 'admin', '2021-03-03 09:28:12', b'0', 'admin', '2021-07-27 16:03:48', NULL, 'order/after-order/orderComplaint', 'md-alert', 2, 'orderComplaint', '1367043505771249664', 'orderComplaint', 2.00, '交易投诉', NULL, '/manager/order/complain*'); +INSERT INTO `li_menu` VALUES (1367044247978508288, 'admin', '2021-03-03 09:28:42', b'0', 'admin', '2021-07-27 16:03:52', NULL, 'order/after-order/afterSale', 'md-aperture', 2, 'afterSaleReason', '1367043505771249664', 'afterSaleReason', 3.00, '售后原因', NULL, '/manager/order/afterSaleReason*'); +INSERT INTO `li_menu` VALUES (1367044376391319552, 'admin', '2021-03-03 09:29:12', b'0', 'admin', '2021-07-27 16:04:08', NULL, 'Main', 'md-aperture', 1, 'goodsManager', '1367039950368800768', '/', 0.00, '商品管理', NULL, '/manager/goods*'); +INSERT INTO `li_menu` VALUES (1367044657296441344, 'admin', '2021-03-03 09:30:19', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, 'association', '1367039950368800768', '/', 1.00, '关联管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367045529720061952, 'admin', '2021-03-03 09:33:47', b'0', 'admin', '2021-07-27 15:38:46', NULL, 'goods/goods-info/goods', 'md-aperture', 2, 'managerGoods', '1367044376391319552', 'managerGoods', 0.00, '平台商品', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1367045630710513664, 'admin', '2021-03-03 09:34:11', b'0', 'admin', '2021-07-27 15:38:56', NULL, 'goods/goods-info/goodsApply', 'ios-alert', 2, 'applyGoods', '1367044376391319552', 'applyGoods', 1.00, '商品审核', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1367045794284175360, 'admin', '2021-03-03 09:34:50', b'0', 'admin', '2021-07-27 16:04:18', NULL, 'goods/goods-manage/category', 'md-alert', 2, 'goodsCategory', '1367044657296441344', 'goodsCategory', 0.00, '商品分类', NULL, '/manager/goods/category*,/manager/goods/brand*,/manager/goods/spec*,/manager/goods/parameters*'); +INSERT INTO `li_menu` VALUES (1367045921434501120, 'admin', '2021-03-03 09:35:21', b'0', 'admin', '2021-07-27 16:04:23', NULL, 'goods/goods-manage/brand', 'md-alert', 2, 'goodsBrand', '1367044657296441344', 'goodsBrand', 1.00, '品牌列表', NULL, '/manager/goods/brand*'); +INSERT INTO `li_menu` VALUES (1367046068369358848, 'admin', '2021-03-03 09:35:56', b'0', 'admin', '2021-07-27 16:04:27', NULL, 'goods/goods-manage/spec', 'md-aperture', 2, 'goodsSpec', '1367044657296441344', 'goodsSpec', 2.00, '规格列表', NULL, '/manager/goods/spec*'); +INSERT INTO `li_menu` VALUES (1367046266214678528, 'admin', '2021-03-03 09:36:43', b'0', 'admin', '2021-07-27 16:04:32', NULL, 'goods-unit/index', 'md-alert', 2, 'goodsUnit', '1367044657296441344', 'goodsUnit', 4.00, '计量单位', NULL, '/manager/goods/goodsUnit*'); +INSERT INTO `li_menu` VALUES (1367048084701315072, 'admin', '2021-03-03 09:43:57', b'0', 'admin', '2021-03-03 09:52:17', 'null', 'null', 'ios-pricetags', 0, 'shop', '0', 'null', 0.40, '店铺', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367048684339986432, 'admin', '2021-03-03 09:46:20', b'0', NULL, NULL, NULL, 'Main', 'md-aperture', 1, 'shopManager', '1367048084701315072', '/', 0.00, '店铺管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367048754229673984, 'admin', '2021-03-03 09:46:36', b'0', NULL, NULL, NULL, 'Main', 'md-aperture', 1, 'bill', '1367048084701315072', '/', 0.00, ' 店铺结算', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367048832210173952, 'admin', '2021-03-03 09:46:55', b'0', 'admin', '2021-07-27 16:05:30', NULL, 'seller/shop/shopList', 'md-aperture', 2, 'shopList', '1367048684339986432', 'shopList', 0.00, '店铺列表', NULL, '/manager/order/order*,/manager/store*'); +INSERT INTO `li_menu` VALUES (1367048967635861504, 'admin', '2021-03-03 09:47:27', b'0', 'admin', '2021-07-27 16:05:32', NULL, 'seller/shop/shopAuditList', 'md-alert', 2, 'shopAuth', '1367048684339986432', 'shopAuth', 1.00, '店铺审核', NULL, '/manager/store*'); +INSERT INTO `li_menu` VALUES (1367049068122996736, 'admin', '2021-03-03 09:47:51', b'0', 'admin', '2021-07-27 16:05:36', NULL, 'seller/bill/bill', 'md-alert', 2, 'billList', '1367048754229673984', 'billList', 0.00, '店铺结算', NULL, '/manager/order/bill*'); +INSERT INTO `li_menu` VALUES (1367049214198022144, 'admin', '2021-03-03 09:48:26', b'0', 'admin', '2021-12-02 19:45:28', NULL, 'Main', 'md-aperture', 1, 'promotionsManager', '1367040067201138688', '/', 0.00, '促销管理', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1367049384792948736, 'admin', '2021-03-03 09:49:07', b'0', 'admin', '2021-12-02 19:54:12', NULL, 'promotions/coupon/coupon', 'md-alert', 2, 'promotions/coupon', '1367049214198022144', 'promotions/coupon', 0.00, '优惠券', NULL, '/manager/promotion/coupon*'); +INSERT INTO `li_menu` VALUES (1367049500782231552, 'admin', '2021-03-03 09:49:34', b'0', 'admin', '2021-12-02 19:41:37', 'null', 'promotions/full-discount/full-discount', 'md-alert', 2, 'promotions/full-discount', '1367049214198022144', 'promotions/full-discount', 1.00, '满额活动', 'null', '/manager/promotion/fullDiscount*'); +INSERT INTO `li_menu` VALUES (1367049611578966016, 'admin', '2021-03-03 09:50:01', b'0', 'admin', '2021-12-02 20:16:10', 'null', 'promotions/seckill/seckill', 'md-alert', 2, 'promotions/seckill', '1367049214198022144', 'promotions/seckill', 2.00, '秒杀活动', 'null', '/manager/promotion/seckill*'); +INSERT INTO `li_menu` VALUES (1367049712657498112, 'admin', '2021-03-03 09:50:25', b'0', 'admin', '2021-12-02 20:22:04', 'null', 'promotions/pintuan/pintuan', 'md-alert', 2, 'promotions/pintuan', '1367049214198022144', 'promotions/pintuan', 3.00, '拼团活动', 'null', '/manager/promotion/pintuan*'); +INSERT INTO `li_menu` VALUES (1367050250249830400, 'admin', '2021-03-03 09:52:33', b'0', 'admin', '2021-03-22 20:38:14', 'null', 'Main', 'md-aperture', 1, 'document', '1367040599596728320', '/', 2.00, '文章管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367050320584114176, 'admin', '2021-03-03 09:52:50', b'0', 'admin', '2021-07-27 16:05:49', NULL, 'Main', 'md-aperture', 1, 'floor', '1367040599596728320', '/', 0.00, '楼层装修', NULL, '/manager/pageData*,/manager/file*,/manager/article-category*,/manager/article*,/manager/promotion*,/manager/goods*,/manager/store*'); +INSERT INTO `li_menu` VALUES (1367050530030878720, 'admin', '2021-03-03 09:53:40', b'0', 'admin', '2021-03-04 01:05:57', 'null', 'page-decoration/floorList', 'md-alert', 2, 'pcFloor', '1367050320584114176', 'pcFloor', 0.00, 'PC端', 'null', '/manager/other/pageData*'); +INSERT INTO `li_menu` VALUES (1367050673312497664, 'admin', '2021-03-03 09:54:14', b'0', 'admin', '2021-03-04 01:06:04', 'null', 'page-decoration/wap/wapList', 'md-aperture', 2, 'wapList', '1367050320584114176', 'wapList', 1.00, '移动端', 'null', '/manager/other/pageData*'); +INSERT INTO `li_menu` VALUES (1367050829697122304, 'admin', '2021-03-03 09:54:51', b'0', 'admin', '2021-07-27 16:06:32', 'null', 'page/article-manage/hotWords', 'md-aperture', 2, 'hotKeyWord', '1367050250249830400', 'hotKeyWord', 0.00, '搜索热词', 'null', '/manager/hotwords*'); +INSERT INTO `li_menu` VALUES (1367050939084570624, 'admin', '2021-03-03 09:55:17', b'0', 'admin', '2021-07-27 16:06:38', NULL, 'page/article-manage/ArticleCategory', 'md-aperture', 2, 'article-category', '1367050250249830400', 'article-category', 1.00, '文章分类', NULL, '/manager/other/articleCategory*'); +INSERT INTO `li_menu` VALUES (1367051048232943616, 'admin', '2021-03-03 09:55:43', b'0', 'admin', '2021-07-27 16:06:42', NULL, 'page/article-manage/articleList', 'md-alert', 2, 'articleList', '1367050250249830400', 'articleList', 3.00, '文章管理', NULL, '/manager/other/article*,/manager/other/articleCategory*'); +INSERT INTO `li_menu` VALUES (1367052616634204160, 'admin', '2021-03-03 10:01:57', b'0', 'admin', '2021-07-27 16:07:38', NULL, 'Main', 'md-aperture', 1, 'statistics', '1367040819248234496', '/', 0.00, '统计', NULL, '/manager/store*,/manager/member*'); +INSERT INTO `li_menu` VALUES (1367052705725415424, 'admin', '2021-03-03 10:02:18', b'0', 'admin', '2021-03-11 22:11:05', 'null', 'statistics/member', 'md-alert', 2, 'memberStatistics', '1367052616634204160', 'memberStatistics', 0.00, '会员统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367052805503713280, 'admin', '2021-03-03 10:02:42', b'0', 'admin', '2021-03-11 22:11:14', 'null', 'statistics/order', 'md-alert', 2, 'orderStatistics', '1367052616634204160', 'orderStatistics', 1.00, '订单统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367052915314786304, 'admin', '2021-03-03 10:03:08', b'0', 'admin', '2021-03-11 22:11:23', 'null', 'statistics/goods', 'md-alert', 2, 'goodsStatistics', '1367052616634204160', 'goodsStatistics', 2.00, '商品统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367053087121866752, 'admin', '2021-03-03 10:03:49', b'0', 'admin', '2021-03-11 22:11:34', 'null', 'statistics/traffic', 'md-alert', 2, 'trafficStatistics', '1367052616634204160', 'trafficStatistics', 4.00, '流量统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1372807928452481024, 'admin', '2021-03-19 02:11:30', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, 'flow', '1367039534616805376', '/', 3.00, '流水', NULL, NULL); +INSERT INTO `li_menu` VALUES (1372808148565360640, 'admin', '2021-03-19 02:12:23', b'0', 'admin', '2021-07-27 16:03:57', NULL, 'order/flow/paymentLog', 'md-alert', 2, 'paymentLog', '1372807928452481024', 'paymentLog', 1.00, '收款记录', NULL, '/manager/order/paymentLog*'); +INSERT INTO `li_menu` VALUES (1372808352295288832, 'admin', '2021-03-19 02:13:11', b'0', 'admin', '2021-07-27 16:04:01', NULL, 'order/flow/refundLog', 'ios-aperture', 2, 'refundLog', '1372807928452481024', 'refundLog', 2.00, '退款流水', NULL, '/manager/order/refundLog*'); +INSERT INTO `li_menu` VALUES (1373166892465782784, 'admin', '2021-03-20 01:57:54', b'0', 'admin', '2021-03-22 20:13:48', 'null', 'Main', 'ios-aperture', 1, '/', '1367038467288072192', '/', 0.00, '积分', 'null', NULL); +INSERT INTO `li_menu` VALUES (1373167227385151488, 'admin', '2021-03-20 01:59:14', b'0', 'admin', '2021-07-27 16:02:40', 'null', 'member/point/point', 'ios-aperture', 2, 'point', '1373166892465782784', 'point', 0.00, '积分历史', 'null', '/manager/member/memberPointsHistory*'); +INSERT INTO `li_menu` VALUES (1373791578371391488, 'admin', '2021-03-21 19:20:11', b'0', 'admin', '2021-07-27 16:05:38', NULL, 'seller/bill/accountStatementBill', 'md-alert', 2, 'accountStatementBill', '1367048754229673984', 'accountStatementBill', 0.00, '商家对账', NULL, '/manager/order/bill*'); +INSERT INTO `li_menu` VALUES (1374154349697040384, 'admin', '2021-03-22 19:21:42', b'0', 'admin', '2021-07-27 16:06:55', 'null', 'Main', 'md-aperture', 1, 'feedback', '1367040599596728320', '/', 3.00, '意见反馈', 'null', '/manager/other/feedback*'); +INSERT INTO `li_menu` VALUES (1374155741123837952, 'admin', '2021-03-22 19:27:14', b'0', 'admin', '2021-07-27 15:41:40', 'null', 'page/feedback/feedback', 'md-aperture', 2, 'feedback', '1374154349697040384', 'feedback', 0.00, '意见反馈', 'null', 'null'); +INSERT INTO `li_menu` VALUES (1374173575405109248, 'admin', '2021-03-22 20:38:06', b'0', 'admin', '2021-03-22 20:52:58', 'null', 'Main', 'ios-analytics', 1, 'distributionManager', '1367040599596728320', '/', 1.00, '分销管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1374177618072436736, 'admin', '2021-03-22 20:54:10', b'0', 'admin', '2021-07-27 16:05:58', 'null', 'distribution/distributionSetting', 'ios-basketball', 2, 'distributionSetting', '1374173575405109248', 'distributionSetting', 0.00, '分销设置', 'null', '/manager/system/setting/put/DISTRIBUTION_SETTING*,/manager/system/setting/get/DISTRIBUTION_SETTING*'); +INSERT INTO `li_menu` VALUES (1374177789581721600, 'admin', '2021-03-22 20:54:51', b'0', 'admin', '2021-07-27 16:06:15', 'null', 'distribution/distributionGoods', 'ios-chatbubbles', 2, 'distributionGoods', '1374173575405109248', 'distributionGoods', 3.00, '分销商品', 'null', '/manager/distribution/goods*'); +INSERT INTO `li_menu` VALUES (1374177910411231232, 'admin', '2021-03-22 20:55:19', b'0', 'admin', '2021-07-27 16:06:20', 'null', 'distribution/distributionOrder', 'ios-cloudy', 2, 'distributionOrder', '1374173575405109248', 'distributionOrder', 4.00, '分销订单', 'null', '/manager/distribution/order*,/manager/store*'); +INSERT INTO `li_menu` VALUES (1374178079181635584, 'admin', '2021-03-22 20:56:00', b'0', 'admin', '2021-07-27 16:06:05', 'null', 'distribution/distributionApply', 'md-egg', 2, 'distributionApply', '1374173575405109248', 'distributionApply', 1.00, '分销申请', 'null', '/manager/distribution*'); +INSERT INTO `li_menu` VALUES (1374178303975358464, 'admin', '2021-03-22 20:56:53', b'0', 'admin', '2021-07-27 16:06:08', 'null', 'distribution/distribution', 'md-person', 2, 'distribution', '1374173575405109248', 'distribution', 2.00, '分销员', 'null', '/manager/distribution*'); +INSERT INTO `li_menu` VALUES (1374916594269945856, 'admin', '2021-03-24 21:50:35', b'0', 'admin', '2021-07-27 16:08:51', NULL, 'sys/slider/slider', 'ios-aperture', 2, 'slider', '1349237129847005184', 'slider', 7.00, '验证码', NULL, '/manager/other/verificationSource*'); +INSERT INTO `li_menu` VALUES (1376450531517530112, 'admin', '2021-03-29 03:25:55', b'0', NULL, NULL, NULL, 'Main', 'md-basketball', 1, 'notice', '1367040599596728320', '/', 5.00, '站内信', NULL, NULL); +INSERT INTO `li_menu` VALUES (1376450662098796544, 'admin', '2021-03-29 03:26:26', b'0', 'admin', '2021-07-27 16:07:23', NULL, 'sys/message/noticeMessageTemplate', 'ios-american-football', 2, 'noticeMessageTemplate', '1376450531517530112', 'noticeMessageTemplate', 1.00, '站内信', NULL, '/manager/other/message*'); +INSERT INTO `li_menu` VALUES (1376450766817984512, 'admin', '2021-03-29 03:26:51', b'0', 'admin', '2021-03-29 03:27:25', 'null', 'Main', 'md-checkmark', 1, 'sms', '1367040599596728320', '/', 6.00, '短信管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1376450876423536640, 'admin', '2021-03-29 03:27:17', b'0', 'admin', '2021-07-27 16:07:29', NULL, 'sys/message/sms', 'ios-timer', 2, 'sms', '1376450766817984512', 'sms', 1.00, '短信', NULL, '/manager/sms/sms*,/manager/passport/member*'); +INSERT INTO `li_menu` VALUES (1384035281702748160, 'admin', '2021-04-19 14:45:00', b'0', 'admin', '2021-07-27 16:08:18', 'null', 'member/message-manage/weChatMessageManager', 'md-aperture', 2, 'message-manage', '1349237129847005184', 'message-manage', 5.00, '微信消息', 'null', '/manager/wechat/wechatMessage*'); +INSERT INTO `li_menu` VALUES (1403988156444962818, 'admin', '2021-06-13 16:10:36', b'0', 'admin', '2021-12-02 19:54:37', 'null', 'promotions/coupon-activity/coupon', '', 2, 'promotions/coupon-activity', '1367049214198022144', 'promotions/coupon-activity', 0.00, '券活动', 'null', '/manager/promotion/couponActivity*'); +INSERT INTO `li_menu` VALUES (1407601962899230721, 'admin', '2021-06-23 15:30:35', b'0', 'admin', '2021-07-27 16:05:08', NULL, 'Main', '', 1, 'liveManage', '1367040067201138688', '/', 2.00, '直播管理', NULL, '/manager/broadcast*'); +INSERT INTO `li_menu` VALUES (1407602049759072258, 'admin', '2021-06-23 15:30:55', b'0', 'admin', '2021-12-07 10:54:54', NULL, 'promotions/live/live', '', 2, 'promotions/live', '1407601962899230721', 'promotions/live', 1.00, '直播管理', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1407602441964244994, 'admin', '2021-06-23 15:32:29', b'0', NULL, NULL, NULL, 'Main', '', 1, 'pointManage', '1367040067201138688', '/', 3.00, '积分活动', NULL, NULL); +INSERT INTO `li_menu` VALUES (1407602516912263170, 'admin', '2021-06-23 15:32:47', b'0', 'admin', '2021-12-03 19:18:30', NULL, 'promotions/points-goods/points-goods', '', 2, 'promotions/points-goods', '1407602441964244994', 'promotions/points-goods', 1.00, '积分商品', NULL, '/manager/promotion/pointsGoods*,/manager/goods*'); +INSERT INTO `li_menu` VALUES (1407602673334636546, 'admin', '2021-06-23 15:33:24', b'0', 'admin', '2021-12-03 19:19:23', NULL, 'promotions/points-goods-category/points-goods-category', '', 2, 'promotions/points-goods-category', '1407602441964244994', 'promotions/points-goods-category', 2.00, '积分分类', NULL, '/manager/promotion/pointsGoodsCategory*'); +INSERT INTO `li_menu` VALUES (1410862675914764290, 'admin', '2021-07-02 15:27:29', b'0', 'admin', '2021-07-27 16:06:26', 'null', 'distribution/distributionCash', '', 2, 'distributionCash', '1374173575405109248', 'distributionCash', 5.00, '分销提现', 'null', '/manager/distribution/cash*'); +INSERT INTO `li_menu` VALUES (1419926569920536578, 'admin', '2021-07-27 15:44:10', b'0', 'admin', '2021-07-27 16:07:10', NULL, 'customWords/index', NULL, 2, 'customWords', '1367050250249830400', 'customWords', 4.00, 'ES分词', NULL, '/manager/other/customWords*'); +INSERT INTO `li_menu` VALUES (1430799171593535490, 'admin', '2021-08-26 15:48:00', b'0', 'admin', '2021-12-02 20:21:34', NULL, 'promotions/kanjia/kanjia-activity-goods', NULL, 2, 'promotions/kanjia', '1367049214198022144', 'promotions/kanjia', 6.00, '砍价活动', NULL, '/manager/promotion/kanJiaGoods*'); +INSERT INTO `li_menu` VALUES (1495665663207432193, 'admin', '2022-02-21 15:44:17', b'0', 'admin', '2022-02-21 15:45:44', NULL, 'distribution/distrbutionGrade', NULL, 2, 'distrbutionGrade', '1374173575405109248', 'distrbutionGrade', 0.00, '分销等级', NULL, '/manager/distrbutionGrade*'); + +SET FOREIGN_KEY_CHECKS = 1; + + + + /* + Navicat Premium Data Transfer + + Source Server : lilishop + Source Server Type : MySQL + Source Server Version : 80025 + Source Host : 192.168.0.116:3306 + Source Schema : zhimai1 + + Target Server Type : MySQL + Target Server Version : 80025 + File Encoding : 65001 + + Date: 01/03/2022 15:36:03 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for li_store_menu +-- ---------------------------- +DROP TABLE IF EXISTS `li_store_menu`; +CREATE TABLE `li_store_menu` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) NULL DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '说明备注', + `front_route` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '前端路由', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图标', + `level` int NULL DEFAULT NULL COMMENT '层级', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '菜单/权限名称', + `parent_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '父id', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '赋权API地址,正则表达式', + `sort_order` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '排序值', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '菜单标题', + `permission` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '权限url', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of li_store_menu +-- ---------------------------- +INSERT INTO `li_store_menu` VALUES (1348810750596767744, NULL, '2022-01-11 22:35:33.000000', b'0', NULL, '2022-01-11 22:36:52', NULL, 'Main', 'ios-american-football', 0, 'goods', '0', '/', '1', '商品', NULL); +INSERT INTO `li_store_menu` VALUES (1348810864748945408, NULL, '2022-01-11 22:35:37.000000', b'0', NULL, '2022-01-11 22:36:55', NULL, 'Main', 'ios-american-football', 1, 'Main', '1348810750596767744', '/', '1.1', '商品管理', ''); +INSERT INTO `li_store_menu` VALUES (1349237129847005184, NULL, '2022-01-11 22:35:40.000000', b'0', NULL, '2022-01-11 22:36:59', NULL, 'goods-operation', 'ios-american-football', 2, 'goods-operation', '1348810864748945408', '/goods-operation', '1.11', '商品发布', '/store/goods/category*,/store/goods/categorySpec*,/store/goods/categoryParameters*,/store/goods/draftGoods*,/store/goods/label*,/store/goods/goods*,/store/goods/goodsUnit*,/store/goods/spec*'); +INSERT INTO `li_store_menu` VALUES (1349237207378714624, NULL, '2022-01-11 22:35:42.000000', b'0', NULL, '2022-01-11 22:37:02', NULL, 'goods/goods-seller/goods', 'ios-american-football', 2, 'goods', '1348810864748945408', 'goods', '1.12', '商品列表', NULL); +INSERT INTO `li_store_menu` VALUES (1349237928434098176, NULL, '2022-01-11 22:35:45.000000', b'0', NULL, '2022-01-11 22:37:05', NULL, 'goods/goods-seller/draftGoods', 'ios-american-football', 2, 'template-goods', '1348810864748945408', 'template-goods', '1.13', '商品模板', NULL); +INSERT INTO `li_store_menu` VALUES (1349246048900243456, NULL, '2022-01-11 22:35:48.000000', b'0', NULL, '2022-01-11 22:37:08', NULL, 'goods/goods-manage/category', 'ios-american-football', 2, 'category', '1348810864748945408', 'category', '1.14', '店铺分类', NULL); +INSERT INTO `li_store_menu` VALUES (1349246347597602816, NULL, '2022-01-11 22:35:51.000000', b'0', NULL, '2022-01-11 22:37:11', NULL, 'Main', 'ios-american-football', 0, 'order', '0', '/', '2', '订单', NULL); +INSERT INTO `li_store_menu` VALUES (1349246468775239680, NULL, '2022-01-11 22:38:28.000000', b'0', NULL, '2022-01-11 22:38:31', NULL, 'Main', 'ios-american-football', 1, 'Main', '1349246347597602816', '/', '2.1', '订单管理', NULL); +INSERT INTO `li_store_menu` VALUES (1349246671158796288, NULL, '2022-01-11 22:38:42.000000', b'0', NULL, '2022-01-11 22:38:35', NULL, 'order/order/orderList', 'ios-american-football', 2, 'orderList', '1349246468775239680', 'orderList', '2.11', '商品订单', '/store/order/order*'); +INSERT INTO `li_store_menu` VALUES (1349246896661356544, NULL, '2022-01-11 22:40:27.000000', b'0', NULL, '2022-01-11 22:40:34', NULL, 'order/order/virtualOrderList', 'ios-american-football', 2, 'virtualOrderList', '1349246468775239680', 'virtualOrderList', '2.12', '虚拟订单', '/store/order/order*'); +INSERT INTO `li_store_menu` VALUES (1349247081504333824, NULL, '2022-01-11 22:41:47.000000', b'0', NULL, '2022-01-11 22:41:50', NULL, 'Main', 'ios-american-football', 1, 'Main', '1349246347597602816', '/', '2.2', '评价管理', NULL); +INSERT INTO `li_store_menu` VALUES (1349247640584085504, NULL, '2022-01-11 22:43:29.000000', b'0', NULL, '2022-01-11 22:45:47', NULL, 'member/memberComment', 'ios-american-football', 2, 'memberComment', '1349247081504333824', 'memberComment', '2.21', '评价管理', '/store/member/evaluation*'); +INSERT INTO `li_store_menu` VALUES (1349254815809298432, NULL, '2022-01-11 22:45:35.000000', b'0', NULL, '2022-01-11 22:45:50', NULL, 'Main', 'ios-american-football', 1, 'Main', '1349246347597602816', '/', '2.3', '售后管理', NULL); +INSERT INTO `li_store_menu` VALUES (1349255214977015808, NULL, '2022-01-11 22:49:22.000000', b'0', NULL, '2022-01-11 22:49:27', NULL, 'order/after-order/returnGoodsOrder', 'ios-american-football', 2, 'returnGoodsOrder', '1349254815809298432', 'returnGoodsOrder', '2.31', '退货管理', '/store/order/afterSale*'); +INSERT INTO `li_store_menu` VALUES (1349255404425338880, NULL, '2022-01-11 22:51:20.000000', b'0', NULL, '2022-01-11 22:51:22', NULL, 'order/after-order/returnMoneyOrder', 'ios-american-football', 2, 'returnMoneyOrder', '1349254815809298432', 'returnMoneyOrder', '2.32', '退款管理', '/store/order/afterSale*'); +INSERT INTO `li_store_menu` VALUES (1349256082979840000, NULL, '2022-01-11 22:52:50.000000', b'0', NULL, '2022-01-11 22:52:55', NULL, 'order/after-order/orderComplaint', 'ios-american-football', 2, 'orderComplaint', '1349254815809298432', 'orderComplaint', '2.33', '投诉管理', '/store/order/complain*'); +INSERT INTO `li_store_menu` VALUES (1357584224760102912, NULL, '2022-01-11 23:02:20.000000', b'0', NULL, '2022-01-11 23:02:25', NULL, 'Main', 'ios-american-football', 0, 'bill', '0', '/', '3', '财务', NULL); +INSERT INTO `li_store_menu` VALUES (1357873097859923969, NULL, '2022-01-11 23:04:13.000000', b'0', NULL, '2022-01-11 23:04:17', NULL, 'Main', 'ios-american-football', 1, 'Main', '1357584224760102912', '/', '3.1', '财务管理', ''); +INSERT INTO `li_store_menu` VALUES (1367038467288072192, NULL, '2022-01-11 23:06:11.000000', b'0', NULL, '2022-01-11 23:06:16', NULL, 'shop/bill/accountStatementBill', 'ios-american-football', 2, 'accountStatementBill', '1357873097859923969', 'accountStatementBill', '3.11', '财务对账', '/store/order/bill*'); +INSERT INTO `li_store_menu` VALUES (1367039534616805376, NULL, '2022-01-11 23:07:54.000000', b'0', NULL, '2022-01-11 23:07:57', NULL, 'shop/bill/storeBill', 'ios-american-football', 2, 'storeBill', '1357873097859923969', 'storeBill', '3.12', '店铺结算', '/store/order/bill*'); +INSERT INTO `li_store_menu` VALUES (1367039950368800768, NULL, '2022-01-11 23:09:26.000000', b'0', NULL, '2022-01-11 23:09:29', NULL, 'Main', 'ios-american-football', 1, 'Main', '1357584224760102912', '/', '3.2', '发票管理', NULL); +INSERT INTO `li_store_menu` VALUES (1367040067201138688, NULL, '2022-01-11 23:11:14.000000', b'0', NULL, '2022-01-11 23:11:18', NULL, 'order/receiptManager/receipt', 'ios-american-football', 2, 'receipt', '1367039950368800768', 'receipt', '3.21', '发票管理', '/store/trade/receipt*'); +INSERT INTO `li_store_menu` VALUES (1367040599596728320, NULL, '2022-01-11 23:12:49.000000', b'0', NULL, '2022-01-11 23:12:52', NULL, 'Main', 'ios-american-football', 0, 'promotion', '0', '/', '4', '营销', NULL); +INSERT INTO `li_store_menu` VALUES (1367040819248234496, NULL, '2022-01-11 23:14:35.000000', b'0', NULL, '2022-01-11 23:14:38', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367040599596728320', '/', '4.1', '平台活动', NULL); +INSERT INTO `li_store_menu` VALUES (1367041332861730816, NULL, '2022-01-11 23:15:42.000000', b'0', NULL, '2022-01-11 23:15:48', NULL, 'promotion/pintuan/pintuan', 'ios-american-football', 2, 'pintuan', '1367040819248234496', 'pintuan', '4.11', '拼团活动', '/store/promotion/pintuan*'); +INSERT INTO `li_store_menu` VALUES (1367041461194850304, NULL, '2022-01-11 23:17:32.000000', b'0', NULL, '2022-01-11 23:17:44', NULL, 'promotion/seckill/seckill', 'ios-american-football', 2, 'seckill', '1367040819248234496', 'seckill', '4.12', '秒杀活动', '/store/promotion/seckill*'); +INSERT INTO `li_store_menu` VALUES (1367041575619657728, NULL, '2022-01-11 23:20:19.000000', b'0', NULL, '2022-01-11 23:20:24', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367040599596728320', '/', '4.2', '直播活动', ''); +INSERT INTO `li_store_menu` VALUES (1367042490443497472, NULL, '2022-01-11 23:21:13.000000', b'0', NULL, '2022-01-11 23:21:22', NULL, 'promotion/live/live', 'ios-american-football', 2, 'live', '1367041575619657728', 'live', '4.21', '直播管理', '/store/broadcast/studio*'); +INSERT INTO `li_store_menu` VALUES (1367042664410644480, NULL, '2022-01-11 23:22:42.000000', b'0', NULL, '2022-01-11 23:22:59', NULL, 'promotion/live/liveGoods', 'ios-american-football', 2, 'liveGoods', '1367041575619657728', 'liveGoods', '4.22', '直播商品', '/store/broadcast/commodity*'); +INSERT INTO `li_store_menu` VALUES (1367042804944994304, NULL, '2022-01-11 23:24:24.000000', b'0', NULL, '2022-01-11 23:24:38', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367040599596728320', '/', '4.3', '商家活动', NULL); +INSERT INTO `li_store_menu` VALUES (1367042804944994305, NULL, '2022-01-11 23:24:29.000000', b'0', NULL, '2022-01-11 23:24:42', NULL, 'promotion/full-discount/full-discount', 'ios-american-football', 2, 'full-cut', '1367042804944994304', 'full-discount', '4.31', '满额活动', '/store/promotion/fullDiscount*'); +INSERT INTO `li_store_menu` VALUES (1367042917113266176, NULL, '2022-01-11 23:26:45.000000', b'0', NULL, '2022-01-11 23:26:50', NULL, 'promotion/coupon/coupon', 'ios-american-football', 2, 'coupon', '1367042804944994304', 'coupon', '4.32', '优惠券', '/store/promotion/coupon*'); +INSERT INTO `li_store_menu` VALUES (1367043020976816128, NULL, '2022-01-11 23:28:50.000000', b'0', NULL, '2022-01-11 23:29:02', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367040599596728320', '/', '4.4', '分销管理', NULL); +INSERT INTO `li_store_menu` VALUES (1367043443917848576, NULL, '2022-01-11 23:28:53.000000', b'0', NULL, '2022-01-11 23:29:04', NULL, 'distribution/distributionGoods', 'ios-american-football', 2, 'distributionGoods', '1367043020976816128', 'distributionGoods', '4.41', '分销商品', '/store/distribution/goods*'); +INSERT INTO `li_store_menu` VALUES (1367043505771249664, NULL, '2022-01-11 23:28:56.000000', b'0', NULL, '2022-01-11 23:29:07', NULL, 'distribution/distributionOrder', 'ios-american-football', 2, 'distributionOrder', '1367043020976816128', 'distributionOrderdistributionOrder', '4.42', '分销订单', '/store/distribution/order*'); +INSERT INTO `li_store_menu` VALUES (1367044121163726848, NULL, '2022-01-12 21:47:03.000000', b'0', NULL, '2022-01-12 21:47:25', NULL, 'Main', 'ios-american-football', 0, 'statistics', '0', '/', '5', '统计', NULL); +INSERT INTO `li_store_menu` VALUES (1367044247978508288, NULL, '2022-01-12 21:47:19.000000', b'0', NULL, '2022-01-12 21:47:28', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367044121163726848', '/', '5.1', '统计管理', NULL); +INSERT INTO `li_store_menu` VALUES (1367044376391319552, NULL, '2022-01-12 21:49:45.000000', b'0', NULL, '2022-01-12 21:50:01', NULL, 'statistics/goods', 'ios-american-football', 2, 'goodsStatistics', '1367044247978508288', 'goodsStatistics', '5.11', '商品统计', '/store/statistics/goods*'); +INSERT INTO `li_store_menu` VALUES (1367044657296441344, NULL, '2022-01-12 21:49:48.000000', b'0', NULL, '2022-01-12 21:49:58', NULL, 'statistics/order', 'ios-american-football', 2, 'orderStatistics', '1367044247978508288', 'orderStatistics', '5.12', '订单统计', '/store/statistics/order*,/store/statistics/order*,/store/statistics/order*,/store/statistics/order*'); +INSERT INTO `li_store_menu` VALUES (1367045529720061952, NULL, '2022-01-12 21:49:51.000000', b'0', NULL, '2022-01-12 21:50:03', NULL, 'statistics/traffic', 'ios-american-football', 2, 'trafficStatistics', '1367044247978508288', 'trafficStatistics', '5.13', '流量统计', '/store/statistics/view*'); +INSERT INTO `li_store_menu` VALUES (1367045630710513664, NULL, '2022-01-12 21:52:59.000000', b'0', NULL, '2022-01-12 21:53:09', NULL, 'Main', 'ios-american-football', 0, 'settings', '0', '/', '6', '设置', NULL); +INSERT INTO `li_store_menu` VALUES (1367045794284175360, NULL, '2022-01-12 21:53:03.000000', b'0', NULL, '2022-01-12 21:53:12', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367045630710513664', '/', '6.1', '配送设置', NULL); +INSERT INTO `li_store_menu` VALUES (1367045921434501120, NULL, '2022-01-12 21:55:49.000000', b'0', NULL, '2022-01-12 21:55:52', NULL, 'shop/ship/shipTemplate', 'ios-american-football', 2, 'shipTemplate', '1367045794284175360', 'shipTemplate', '6.11', '配送模板', '/store/setting/freightTemplate*'); +INSERT INTO `li_store_menu` VALUES (1367046068369358848, NULL, '2022-01-12 21:58:05.000000', b'0', NULL, '2022-01-12 21:58:13', NULL, 'shop/ship/logistics', 'ios-american-football', 2, 'logistics', '1367045794284175360', 'logistics', '6.12', '物流公司', '/store/other/logistics*'); +INSERT INTO `li_store_menu` VALUES (1367046266214678528, NULL, '2022-01-12 21:59:07.000000', b'0', NULL, '2022-01-12 21:59:43', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367045630710513664', '/', '6.2', '店铺管理', NULL); +INSERT INTO `li_store_menu` VALUES (1367048084701315072, NULL, '2022-01-12 21:59:32.000000', b'0', NULL, '2022-01-12 21:59:48', NULL, 'shop/shopSetting', 'ios-american-football', 2, 'shopSetting', '1367046266214678528', 'shopSetting', '6.21', '店铺设置', NULL); +INSERT INTO `li_store_menu` VALUES (1367048684339986432, NULL, '2022-01-12 21:59:36.000000', b'0', NULL, '2022-01-12 21:59:51', NULL, 'shop/shopAddress', 'ios-american-football', 2, 'shopAddress', '1367046266214678528', 'shopAddress', '6.22', '自提管理', '/store/member/storeAddress*'); +INSERT INTO `li_store_menu` VALUES (1367048754229673984, NULL, '2022-01-12 22:02:11.000000', b'0', NULL, '2022-01-12 22:04:36', NULL, 'Main', 'ios-american-football', 0, 'Main', '0', '/', '7', '消息', NULL); +INSERT INTO `li_store_menu` VALUES (1367048832210173952, NULL, '2022-01-12 22:02:49.000000', b'0', NULL, '2022-01-12 22:04:39', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367048754229673984', '/', '7.1', '系统消息', NULL); +INSERT INTO `li_store_menu` VALUES (1367048967635861503, NULL, '2022-02-18 16:08:30.000000', b'0', NULL, '2022-02-18 16:08:36', NULL, 'Main', 'ios-american-football', 1, 'Main', '1367045630710513664', '/', '6.3', '店员设置', ''); +INSERT INTO `li_store_menu` VALUES (1367048967635861504, NULL, '2022-01-12 22:02:51.000000', b'0', NULL, '2022-01-12 22:04:45', NULL, 'message', 'ios-american-football', 2, 'message_index', '1367048832210173952', 'message', '7.11', '系统消息', '/store/message/storeMessage*'); +INSERT INTO `li_store_menu` VALUES (1367048967635861505, NULL, '2022-02-18 16:12:18.000000', b'0', NULL, '2022-02-18 16:12:21', NULL, 'shop/system/clerk/clerkManage', 'ios-american-football', 2, '\nclerkManage', '1367048967635861503', '\nclerkManage', '6.31', '店员管理', '/store/department*,/store/clerk*,/store/role*,/store/department*'); +INSERT INTO `li_store_menu` VALUES (1367048967635861506, NULL, '2022-02-18 16:25:27.000000', NULL, NULL, '2022-02-18 16:25:31', NULL, 'shop/system/department/storeDepartmentManage', 'ios-american-football', 2, 'storeDepartmentManage', '1367048967635861503', 'storeDepartmentManage', '6.32', '部门管理', '/store/department*'); +INSERT INTO `li_store_menu` VALUES (1367048967635861507, NULL, '2022-02-18 16:27:28.000000', NULL, NULL, '2022-02-18 16:27:30', NULL, 'shop/system/role/storeRoleManage', 'ios-american-football', 2, 'storeRoleManage', '1367048967635861503', 'storeRoleManage', '6.33', '角色权限', '/store/role*'); +INSERT INTO `li_store_menu` VALUES (1367048967635861510, NULL, '2022-03-07 14:45:10.000000', b'0', NULL, '2022-03-07 14:45:13', NULL, 'shop/floorList', 'ios-american-football', 2, 'floorList', '1367046266214678528', 'floorList', '6.23', 'PC端', '/store/other/pageData*'); +INSERT INTO `li_store_menu` VALUES (1367048967635861511, NULL, '2022-03-07 15:13:52.000000', b'0', NULL, '2022-03-07 15:13:55', NULL, 'shop/wap/wapList', 'ios-american-football', 2, 'wapList', '1367046266214678528', 'wapList', '6.24', '移动端', '/store/other/pageData*'); + +SET FOREIGN_KEY_CHECKS = 1; + + +insert li_clerk(id,create_by,create_time,store_id,clerk_name,member_id,shopkeeper,is_super,`status`) select id,member_name,current_date(),id,member_name,member_id ,TRUE,TRUE,TRUE from li_store + + diff --git a/DB/version4.2.5toMASTER.sql b/DB/version4.2.5toMASTER.sql new file mode 100644 index 00000000..8170a2c5 --- /dev/null +++ b/DB/version4.2.5toMASTER.sql @@ -0,0 +1,91 @@ + +/** 优惠券活动增加领取周期字段 **/ +ALTER TABLE li_coupon_activity ADD coupon_frequency_enum varchar(255) COMMENT '领取周期'; +-- 会员优惠券标识 +CREATE TABLE `li_member_coupon_sign` ( + `id` bigint NOT NULL, + `coupon_activity_Id` bigint NULL DEFAULT NULL COMMENT '优惠券活动id', + `member_id` bigint NULL DEFAULT NULL COMMENT '会员id', + `invalid_time` datetime NULL DEFAULT NULL COMMENT '过期时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC; + +/** + IM聊天 + */ +CREATE TABLE `li_im_talk` ( + `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) DEFAULT NULL COMMENT '删除标志', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改者', + `update_time` datetime(6) DEFAULT NULL COMMENT '修改时间', + `user_id1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户1Id', + `user_id2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户2Id', + `name1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户1名称', + `name2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户2名称', + `face1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户1头像', + `face2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户2头像', + `top1` bit(1) DEFAULT NULL COMMENT '用户1置顶标识', + `top2` bit(1) DEFAULT NULL COMMENT '用户2置顶标识', + `disable1` bit(1) DEFAULT NULL COMMENT '用户1禁用标识', + `disable2` bit(1) DEFAULT NULL COMMENT '用户2禁用标识', + `store_flag1` bit(1) DEFAULT NULL COMMENT '用户1店铺标识', + `store_flag2` bit(1) DEFAULT NULL COMMENT '用户2店铺标识', + `last_talk_time` datetime DEFAULT NULL COMMENT '最后聊天时间', + `last_talk_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '最后的消息', + `last_message_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '最后消息类型', + `talk_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天Id', + `tenant_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '坐席Id', + `tenant_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '坐席名称', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + +/** + IM消息 + */ +CREATE TABLE `li_im_message` ( + `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) DEFAULT NULL COMMENT '删除标识', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改者', + `update_time` datetime(6) DEFAULT NULL COMMENT '修改标识', + `from_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发送用户Id', + `to_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '接收用户Id', + `is_read` bit(1) DEFAULT NULL COMMENT '已读标识', + `message_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天类型', + `text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '聊天内容', + `talk_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天Id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + + + +/** + 订单增加自提信息 + */ +ALTER TABLE li_order ADD `store_address_path` varchar(255) DEFAULT NULL; +ALTER TABLE li_order ADD `store_address_center` varchar(255) DEFAULT NULL; +ALTER TABLE li_order ADD `store_address_mobile` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL; + +/** + 店铺是否开启自提 + */ +ALTER TABLE li_store ADD `self_pick_flag` bit(1) DEFAULT NULL; +/** + 历史足迹增加店铺Id + */ +ALTER TABLE li_foot_print ADD `store_id` varchar(255) DEFAULT NULL COMMENT '店铺ID'; + + + +/** + 订单增加自提信息 + */ +ALTER TABLE li_member_withdraw_apply ADD `real_name` varchar(255) DEFAULT NULL; +ALTER TABLE li_member_withdraw_apply ADD `connect_number` varchar(255) DEFAULT NULL; +ALTER TABLE li_member_withdraw_apply ADD `error_message` text DEFAULT NULL; diff --git a/DB/version4.2to4.2.2.sql b/DB/version4.2to4.2.2.sql new file mode 100644 index 00000000..623d6754 --- /dev/null +++ b/DB/version4.2to4.2.2.sql @@ -0,0 +1,161 @@ +/* + Navicat Premium Data Transfer + + Source Server : 192.168.0.116 + Source Server Type : MySQL + Source Server Version : 80023 + Source Host : 192.168.0.116:3306 + Source Schema : lilishop + + Target Server Type : MySQL + Target Server Version : 80023 + File Encoding : 65001 + + Date: 27/07/2021 17:04:46 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; +/** 添加结算单积分、砍价结算价信息**/ +ALTER TABLE li_bill ADD point_settlement_price double DEFAULT 0.00 COMMENT '积分商品结算金额 '; +ALTER TABLE li_bill ADD kanjia_settlement_price double DEFAULT 0.00 COMMENT '砍价商品结算金额'; +ALTER TABLE li_store_flow ADD point_settlement_price double DEFAULT 0.00 COMMENT '积分商品结算金额'; +ALTER TABLE li_store_flow ADD kanjia_settlement_price double DEFAULT 0.00 COMMENT '砍价商品结算金额'; +ALTER TABLE li_order ADD order_promotion_type varchar(255) DEFAULT null COMMENT '订单促销类型'; + +/** 热词管理*/ +UPDATE `lilishop`.`li_menu` SET `create_by` = 'admin', `create_time` = '2021-03-03 09:54:51', `delete_flag` = b'0', `update_by` = 'admin', `update_time` = '2021-07-23 19:07:45', `description` = 'null', `front_route` = 'page/article-manage/hotWords', `icon` = 'md-aperture', `level` = 2, `name` = 'hotKeyWord', `parent_id` = '1367050250249830400', `path` = 'hotKeyWord', `sort_order` = 0.00, `title` = '搜索热词', `front_component` = 'null' WHERE `id` = 1367050829697122304; + +-- ---------------------------- +-- Table structure for li_menu +-- ---------------------------- +DROP TABLE IF EXISTS `li_menu`; +CREATE TABLE `li_menu` ( + `id` bigint NOT NULL COMMENT 'ID', + `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `delete_flag` bit(1) DEFAULT NULL COMMENT '删除标志 true/false 删除/未删除', + `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '说明备注', + `front_route` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '前端路由', + `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '图标', + `level` int DEFAULT NULL COMMENT '层级', + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单/权限名称', + `parent_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '父id', + `path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '赋权API地址,正则表达式', + `sort_order` decimal(10,2) DEFAULT NULL COMMENT '排序值', + `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单标题', + `front_component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件地址', + `permission` varchar(255) DEFAULT NULL COMMENT '权限url', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of li_menu +-- ---------------------------- +BEGIN; +INSERT INTO `li_menu` VALUES (1348810750596767744, 'admin', '2021-01-12 09:55:17', b'0', 'admin', '2021-01-15 09:42:50', 'null', '1', 'ios-american-football', 0, 'settings', '0', '1', 2.00, '设置', 'null', NULL); +INSERT INTO `li_menu` VALUES (1348810864748945408, 'admin', '2021-01-12 09:55:45', b'0', 'admin', '2021-03-15 20:57:12', 'null', 'null', 'ios-american-football', 0, 'log', '0', 'null', 3.00, '日志', 'null', NULL); +INSERT INTO `li_menu` VALUES (1349237129847005184, 'admin', '2021-01-13 14:09:34', b'0', 'admin', '2021-01-15 09:43:16', 'null', 'Main', 'ios-american-football', 1, 'sys', '1348810750596767744', '/sys', 1.00, '系统设置', 'null', NULL); +INSERT INTO `li_menu` VALUES (1349237207378714624, 'admin', '2021-01-13 14:09:53', b'0', 'admin', '2021-07-27 16:07:49', 'null', 'Main', 'ios-american-football', 1, 'member', '1348810750596767744', '/member', 0.00, '用户管理', 'null', '/manager/user*,/manager/department*,/manager/role*,/manager/menu*'); +INSERT INTO `li_menu` VALUES (1349237928434098176, 'admin', '2021-01-13 14:13:03', b'0', 'admin', '2021-07-27 16:09:11', 'null', 'Main', 'ios-american-football', 1, 'log', '1348810864748945408', '/log', 1.00, '系统监控', 'null', '/manager/log*'); +INSERT INTO `li_menu` VALUES (1349246048900243456, 'admin', '2021-01-13 14:45:00', b'0', 'admin', '2021-07-27 16:07:57', 'null', 'sys/setting-manage/settingManage', 'ios-american-football', 2, 'setting', '1349237129847005184', 'setting', 1.00, '系统设置', 'null', '/manager/system/setting/get*,/manager/system/setting/put*'); +INSERT INTO `li_menu` VALUES (1349246347597602816, 'admin', '2021-01-13 14:46:12', b'0', 'admin', '2021-07-27 16:08:03', 'null', 'sys/oss-manage/ossManage', 'ios-american-football', 2, 'oss-manage', '1349237129847005184', 'oss-manage', 3.00, 'OSS资源', '', '/manager/file*'); +INSERT INTO `li_menu` VALUES (1349246468775239680, 'admin', '2021-01-13 14:46:41', b'0', 'admin', '2021-07-27 16:08:14', 'null', 'region/index', 'ios-american-football', 2, 'region', '1349237129847005184', 'region', 4.00, '行政地区', 'null', '/manager/region*'); +INSERT INTO `li_menu` VALUES (1349246671158796288, 'admin', '2021-01-13 14:47:29', b'0', 'admin', '2021-07-27 16:08:09', 'null', 'logistics/index', 'ios-american-football', 2, 'logistics', '1349237129847005184', 'logistics', 5.00, '物流公司', 'null', '/manager/logistics*'); +INSERT INTO `li_menu` VALUES (1349246896661356544, 'admin', '2021-01-13 14:48:23', b'0', 'admin', '2021-07-27 16:08:23', 'null', 'sys/setting-manage/settingManage', 'ios-american-football', 2, 'authLogin', '1349237129847005184', 'authLogin', 6.00, '信任登录', 'null', '/manager/system/setting/get*,/manager/system/setting/put*'); +INSERT INTO `li_menu` VALUES (1349247081504333824, 'admin', '2021-01-13 14:49:07', b'0', 'admin', '2021-07-27 16:08:45', 'null', 'sys/setting-manage/settingManage', 'ios-american-football', 2, 'pay', '1349237129847005184', 'pay', 7.00, '支付设置', 'null', '/manager/system/setting/get*,/manager/system/setting/put*,/manager/system/setting*'); +INSERT INTO `li_menu` VALUES (1349247640584085504, 'admin', '2021-01-13 14:51:20', b'0', 'admin', '2021-07-27 16:08:56', 'null', 'sensitiveWords/index', 'ios-american-football', 2, 'sensitiveWords', '1349237129847005184', 'sensitiveWords', 8.00, '敏感词', 'null', '/manager/sensitiveWords*'); +INSERT INTO `li_menu` VALUES (1349254815809298432, 'admin', '2021-01-13 15:19:51', b'0', 'admin', '2021-01-15 11:15:40', 'null', 'sys/user-manage/userManage', 'ios-american-football', 2, 'user-manage', '1349237207378714624', 'user-manage', 1.00, '用户管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1349255214977015808, 'admin', '2021-01-13 15:21:26', b'0', 'admin', '2021-01-15 11:16:21', 'null', 'sys/department-manage/departmentManage', 'ios-american-football', 2, 'department-manage', '1349237207378714624', 'department-manage', 3.00, '部门管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1349255404425338880, 'admin', '2021-01-13 15:22:11', b'0', 'admin', '2021-02-24 09:22:21', 'null', 'sys/role-manage/roleManage', 'ios-american-football', 2, 'role-manage', '1349237207378714624', 'role-manage', 4.00, '角色权限', 'null', NULL); +INSERT INTO `li_menu` VALUES (1349256082979840000, 'admin', '2021-01-13 15:24:53', b'0', 'admin', '2021-01-15 11:18:14', 'null', 'sys/log-manage/logManage', 'ios-american-football', 2, 'log-manage', '1349237928434098176', 'log-manage', 2.00, '日志管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1357584224760102912, 'admin', '2021-02-05 06:57:57', b'0', 'admin', '2021-07-27 16:09:02', 'null', 'sys/app-version/appVersion', 'ios-american-football', 2, 'appVersion', '1349237129847005184', 'appVersion', 9.00, 'APP版本', 'null', '/manager/systems/app*'); +INSERT INTO `li_menu` VALUES (1357873097859923969, 'admin', '2021-02-24 09:53:02', b'0', 'admin', '2021-02-24 09:53:12', NULL, 'sys/menu-manage/menuManage', 'ios-american-football', 2, 'menuManage', '1349237207378714624', 'menu-manage', 2.00, '菜单管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367038467288072192, 'admin', '2021-03-03 09:05:44', b'0', 'admin', '2021-03-03 09:09:27', 'null', 'null', 'ios-person-add', 0, 'member', '0', 'null', 0.00, '会员', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367039534616805376, 'admin', '2021-03-03 09:09:58', b'0', 'admin', '2021-05-18 10:51:12', 'null', 'null', 'md-reorder', 0, 'order', '0', 'null', 0.00, '订单', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367039950368800768, 'admin', '2021-03-03 09:11:37', b'0', NULL, NULL, NULL, NULL, 'ios-share', 0, 'goods', '0', NULL, 0.20, '商品', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367040067201138688, 'admin', '2021-03-03 09:12:05', b'0', NULL, NULL, NULL, NULL, 'ios-hammer', 0, 'promotion', '0', NULL, 0.30, '促销', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367040599596728320, 'admin', '2021-03-03 09:14:12', b'0', 'admin', '2021-03-03 09:52:13', 'null', 'null', 'ios-color-palette', 0, 'operate', '0', 'null', 0.50, '运营', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367040819248234496, 'admin', '2021-03-03 09:15:04', b'0', NULL, NULL, NULL, NULL, 'ios-stats', 0, 'statistics', '0', NULL, 0.70, '统计', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367041332861730816, 'admin', '2021-03-03 09:17:07', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, '/', '1367038467288072192', '/', 0.00, '会员管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367041461194850304, 'admin', '2021-03-03 09:17:37', b'0', 'admin', '2021-07-27 16:02:17', NULL, 'member/list/index', 'ios-aperture', 2, 'memberList', '1367041332861730816', 'memberList', 0.00, '会员列表', NULL, '/manager/member*,/manager/orders*,/manager/wallet/log*,/manager/receipt*'); +INSERT INTO `li_menu` VALUES (1367041575619657728, 'admin', '2021-03-03 09:18:05', b'0', 'admin', '2021-07-27 15:59:50', NULL, 'member/list/memberRecycle', 'ios-aperture', 2, 'memberRecycle', '1367041332861730816', 'memberRecycle', 1.00, '回收站', NULL, '/manager/member*'); +INSERT INTO `li_menu` VALUES (1367042490443497472, 'admin', '2021-03-03 09:21:43', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, '/', '1367038467288072192', '/', 1.00, '预存款', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367042664410644480, 'admin', '2021-03-03 09:22:24', b'0', 'admin', '2021-07-27 16:02:44', 'null', 'member/advance/walletLog', 'ios-aperture', 2, 'walletLog', '1367042490443497472', 'walletLog', 0.00, '会员资金', 'null', '/manager/wallet/log*'); +INSERT INTO `li_menu` VALUES (1367042804944994304, 'admin', '2021-03-03 09:22:58', b'0', 'admin', '2021-07-27 16:02:48', NULL, 'member/advance/recharge', 'ios-alert', 2, 'recharge', '1367042490443497472', 'recharge', 1.00, '充值记录', NULL, '/manager/recharge*'); +INSERT INTO `li_menu` VALUES (1367042804944994305, 'admin', '2021-03-03 09:22:58', b'0', 'admin', '2021-07-27 16:02:52', NULL, 'member/advance/withdrawApply', 'ios-alert', 2, 'withdrawApply', '1367042490443497472', 'withdrawApply', 1.00, '提现申请', NULL, '/manager/members/withdraw-apply*'); +INSERT INTO `li_menu` VALUES (1367042917113266176, 'admin', '2021-03-03 09:23:25', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, 'commont', '1367038467288072192', '/', 0.00, '评价', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367043020976816128, 'admin', '2021-03-03 09:23:49', b'0', 'admin', '2021-07-27 16:02:35', NULL, 'goods/goods-review/index', 'md-aperture', 2, 'goodsReview', '1367042917113266176', 'goodsReview', 0.00, '会员评价', NULL, '/manager/memberEvaluation*'); +INSERT INTO `li_menu` VALUES (1367043443917848576, 'admin', '2021-03-03 09:25:30', b'0', 'admin', '2021-07-27 16:03:00', NULL, 'Main', 'md-aperture', 1, 'order', '1367039534616805376', '/', 0.00, '订单', NULL, '/manager/orders*'); +INSERT INTO `li_menu` VALUES (1367043505771249664, 'admin', '2021-03-03 09:25:45', b'0', NULL, NULL, NULL, 'Main', 'md-aperture', 1, 'aftersale', '1367039534616805376', '/', 0.00, '售后', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367043642379730944, 'admin', '2021-03-03 09:26:17', b'0', NULL, NULL, NULL, 'order/order/orderList', 'ios-aperture', 2, 'orderList', '1367043443917848576', 'orderList', 0.00, '商品订单', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367043791105556480, 'admin', '2021-03-03 09:26:53', b'0', NULL, NULL, NULL, 'order/order/fictitiousOrderList', 'ios-aperture', 2, 'fictitiousOrderList', '1367043443917848576', 'fictitiousOrderList', 1.00, '虚拟订单', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367043980407078912, 'admin', '2021-03-03 09:27:38', b'0', 'admin', '2021-07-27 16:03:43', NULL, 'order/after-order/afterSaleOrder', 'md-alert', 2, 'afterSaleOrder', '1367043505771249664', 'afterSaleOrder', 0.00, '售后管理', NULL, '/manager/afterSale*'); +INSERT INTO `li_menu` VALUES (1367044121163726848, 'admin', '2021-03-03 09:28:12', b'0', 'admin', '2021-07-27 16:03:48', NULL, 'order/after-order/orderComplaint', 'md-alert', 2, 'orderComplaint', '1367043505771249664', 'orderComplaint', 2.00, '交易投诉', NULL, '/manager/complain*'); +INSERT INTO `li_menu` VALUES (1367044247978508288, 'admin', '2021-03-03 09:28:42', b'0', 'admin', '2021-07-27 16:03:52', NULL, 'order/after-order/afterSale', 'md-aperture', 2, 'afterSaleReason', '1367043505771249664', 'afterSaleReason', 3.00, '售后原因', NULL, '/manager/afterSaleReason*'); +INSERT INTO `li_menu` VALUES (1367044376391319552, 'admin', '2021-03-03 09:29:12', b'0', 'admin', '2021-07-27 16:04:08', NULL, 'Main', 'md-aperture', 1, 'goodsManager', '1367039950368800768', '/', 0.00, '商品管理', NULL, '/manager/goods*'); +INSERT INTO `li_menu` VALUES (1367044657296441344, 'admin', '2021-03-03 09:30:19', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, 'association', '1367039950368800768', '/', 1.00, '关联管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367045529720061952, 'admin', '2021-03-03 09:33:47', b'0', 'admin', '2021-07-27 15:38:46', NULL, 'goods/goods-info/goods', 'md-aperture', 2, 'managerGoods', '1367044376391319552', 'managerGoods', 0.00, '平台商品', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1367045630710513664, 'admin', '2021-03-03 09:34:11', b'0', 'admin', '2021-07-27 15:38:56', NULL, 'goods/goods-info/goodsApply', 'ios-alert', 2, 'applyGoods', '1367044376391319552', 'applyGoods', 1.00, '商品审核', NULL, 'null'); +INSERT INTO `li_menu` VALUES (1367045794284175360, 'admin', '2021-03-03 09:34:50', b'0', 'admin', '2021-07-27 16:04:18', NULL, 'goods/goods-manage/category', 'md-alert', 2, 'goodsCategory', '1367044657296441344', 'goodsCategory', 0.00, '商品分类', NULL, '/manager/goods/category*,/manager/goods/brand*,/manager/goods/spec*,/manager/goods/parameters*'); +INSERT INTO `li_menu` VALUES (1367045921434501120, 'admin', '2021-03-03 09:35:21', b'0', 'admin', '2021-07-27 16:04:23', NULL, 'goods/goods-manage/brand', 'md-alert', 2, 'goodsBrand', '1367044657296441344', 'goodsBrand', 1.00, '品牌列表', NULL, '/manager/goods/brand*'); +INSERT INTO `li_menu` VALUES (1367046068369358848, 'admin', '2021-03-03 09:35:56', b'0', 'admin', '2021-07-27 16:04:27', NULL, 'goods/goods-manage/spec', 'md-aperture', 2, 'goodsSpec', '1367044657296441344', 'goodsSpec', 2.00, '规格列表', NULL, '/manager/goods/spec*'); +INSERT INTO `li_menu` VALUES (1367046266214678528, 'admin', '2021-03-03 09:36:43', b'0', 'admin', '2021-07-27 16:04:32', NULL, 'goods-unit/index', 'md-alert', 2, 'goodsUnit', '1367044657296441344', 'goodsUnit', 4.00, '计量单位', NULL, '/manager/goods/goodsUnit*'); +INSERT INTO `li_menu` VALUES (1367048084701315072, 'admin', '2021-03-03 09:43:57', b'0', 'admin', '2021-03-03 09:52:17', 'null', 'null', 'ios-pricetags', 0, 'shop', '0', 'null', 0.40, '店铺', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367048684339986432, 'admin', '2021-03-03 09:46:20', b'0', NULL, NULL, NULL, 'Main', 'md-aperture', 1, 'shopManager', '1367048084701315072', '/', 0.00, '店铺管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367048754229673984, 'admin', '2021-03-03 09:46:36', b'0', NULL, NULL, NULL, 'Main', 'md-aperture', 1, 'bill', '1367048084701315072', '/', 0.00, ' 店铺结算', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367048832210173952, 'admin', '2021-03-03 09:46:55', b'0', 'admin', '2021-07-27 16:05:30', NULL, 'seller/shop/shopList', 'md-aperture', 2, 'shopList', '1367048684339986432', 'shopList', 0.00, '店铺列表', NULL, '/manager/store*'); +INSERT INTO `li_menu` VALUES (1367048967635861504, 'admin', '2021-03-03 09:47:27', b'0', 'admin', '2021-07-27 16:05:32', NULL, 'seller/shop/shopAuditList', 'md-alert', 2, 'shopAuth', '1367048684339986432', 'shopAuth', 1.00, '店铺审核', NULL, '/manager/store*'); +INSERT INTO `li_menu` VALUES (1367049068122996736, 'admin', '2021-03-03 09:47:51', b'0', 'admin', '2021-07-27 16:05:36', NULL, 'seller/bill/bill', 'md-alert', 2, 'billList', '1367048754229673984', 'billList', 0.00, '店铺结算', NULL, '/manager/store/bill*'); +INSERT INTO `li_menu` VALUES (1367049214198022144, 'admin', '2021-03-03 09:48:26', b'0', NULL, NULL, NULL, 'Main', 'md-aperture', 1, 'promotionManager', '1367040067201138688', '/', 0.00, '促销管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1367049384792948736, 'admin', '2021-03-03 09:49:07', b'0', 'admin', '2021-07-27 16:04:42', NULL, 'promotion/coupon/coupon', 'md-alert', 2, 'coupon', '1367049214198022144', 'coupon', 0.00, '优惠券', NULL, '/manager/promotion/coupon*'); +INSERT INTO `li_menu` VALUES (1367049500782231552, 'admin', '2021-03-03 09:49:34', b'0', 'admin', '2021-07-27 16:04:53', 'null', 'promotion/fullCut/full-cut', 'md-alert', 2, 'fullCut', '1367049214198022144', 'fullCut', 1.00, '满额活动', 'null', '/manager/promotion/fullDiscount*'); +INSERT INTO `li_menu` VALUES (1367049611578966016, 'admin', '2021-03-03 09:50:01', b'0', 'admin', '2021-07-27 16:04:58', 'null', 'promotion/seckill/seckill', 'md-alert', 2, 'seckill', '1367049214198022144', 'seckill', 2.00, '秒杀活动', 'null', '/manager/promotion/seckill*'); +INSERT INTO `li_menu` VALUES (1367049712657498112, 'admin', '2021-03-03 09:50:25', b'0', 'admin', '2021-07-27 16:05:02', 'null', 'promotion/pintuan/pintuan', 'md-alert', 2, 'pintuan', '1367049214198022144', 'pintuan', 3.00, '拼团活动', 'null', '/manager/promotion/pintuan*'); +INSERT INTO `li_menu` VALUES (1367050250249830400, 'admin', '2021-03-03 09:52:33', b'0', 'admin', '2021-03-22 20:38:14', 'null', 'Main', 'md-aperture', 1, 'document', '1367040599596728320', '/', 2.00, '文章管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367050320584114176, 'admin', '2021-03-03 09:52:50', b'0', 'admin', '2021-07-27 16:05:49', NULL, 'Main', 'md-aperture', 1, 'floor', '1367040599596728320', '/', 0.00, '楼层装修', NULL, '/manager/pageData*,/manager/file*,/manager/article-category*,/manager/article*,/manager/promotion*,/manager/goods*,/manager/store*'); +INSERT INTO `li_menu` VALUES (1367050530030878720, 'admin', '2021-03-03 09:53:40', b'0', 'admin', '2021-03-04 01:05:57', 'null', 'lili-floor-renovation/floorList', 'md-alert', 2, 'pcFloor', '1367050320584114176', 'pcFloor', 0.00, 'PC端', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367050673312497664, 'admin', '2021-03-03 09:54:14', b'0', 'admin', '2021-03-04 01:06:04', 'null', 'lili-floor-renovation/wap/wapList', 'md-aperture', 2, 'wapList', '1367050320584114176', 'wapList', 1.00, '移动端', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367050829697122304, 'admin', '2021-03-03 09:54:51', b'0', 'admin', '2021-07-27 16:06:32', 'null', 'page/article-manage/hotWords', 'md-aperture', 2, 'hotKeyWord', '1367050250249830400', 'hotKeyWord', 0.00, '搜索热词', 'null', '/manager/hotwords*'); +INSERT INTO `li_menu` VALUES (1367050939084570624, 'admin', '2021-03-03 09:55:17', b'0', 'admin', '2021-07-27 16:06:38', NULL, 'page/article-manage/ArticleCategory', 'md-aperture', 2, 'article-category', '1367050250249830400', 'article-category', 1.00, '文章分类', NULL, '/manager/article-category*'); +INSERT INTO `li_menu` VALUES (1367051048232943616, 'admin', '2021-03-03 09:55:43', b'0', 'admin', '2021-07-27 16:06:42', NULL, 'page/article-manage/articleList', 'md-alert', 2, 'articleList', '1367050250249830400', 'articleList', 3.00, '文章管理', NULL, '/manager/article-category*,/manager/article*'); +INSERT INTO `li_menu` VALUES (1367052616634204160, 'admin', '2021-03-03 10:01:57', b'0', 'admin', '2021-07-27 16:07:38', NULL, 'Main', 'md-aperture', 1, 'statistics', '1367040819248234496', '/', 0.00, '统计', NULL, '/manager/store*,/manager/member*'); +INSERT INTO `li_menu` VALUES (1367052705725415424, 'admin', '2021-03-03 10:02:18', b'0', 'admin', '2021-03-11 22:11:05', 'null', 'statistics/member', 'md-alert', 2, 'memberStatistics', '1367052616634204160', 'memberStatistics', 0.00, '会员统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367052805503713280, 'admin', '2021-03-03 10:02:42', b'0', 'admin', '2021-03-11 22:11:14', 'null', 'statistics/order', 'md-alert', 2, 'orderStatistics', '1367052616634204160', 'orderStatistics', 1.00, '订单统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367052915314786304, 'admin', '2021-03-03 10:03:08', b'0', 'admin', '2021-03-11 22:11:23', 'null', 'statistics/goods', 'md-alert', 2, 'goodsStatistics', '1367052616634204160', 'goodsStatistics', 2.00, '商品统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1367053087121866752, 'admin', '2021-03-03 10:03:49', b'0', 'admin', '2021-03-11 22:11:34', 'null', 'statistics/traffic', 'md-alert', 2, 'trafficStatistics', '1367052616634204160', 'trafficStatistics', 4.00, '流量统计', 'null', NULL); +INSERT INTO `li_menu` VALUES (1372807928452481024, 'admin', '2021-03-19 02:11:30', b'0', NULL, NULL, NULL, 'Main', 'ios-aperture', 1, 'flow', '1367039534616805376', '/', 3.00, '流水', NULL, NULL); +INSERT INTO `li_menu` VALUES (1372808148565360640, 'admin', '2021-03-19 02:12:23', b'0', 'admin', '2021-07-27 16:03:57', NULL, 'order/flow/paymentLog', 'md-alert', 2, 'paymentLog', '1372807928452481024', 'paymentLog', 1.00, '收款记录', NULL, '/manager/paymentLog*'); +INSERT INTO `li_menu` VALUES (1372808352295288832, 'admin', '2021-03-19 02:13:11', b'0', 'admin', '2021-07-27 16:04:01', NULL, 'order/flow/refundLog', 'ios-aperture', 2, 'refundLog', '1372807928452481024', 'refundLog', 2.00, '退款流水', NULL, '/manager/refundLog*'); +INSERT INTO `li_menu` VALUES (1373166892465782784, 'admin', '2021-03-20 01:57:54', b'0', 'admin', '2021-03-22 20:13:48', 'null', 'Main', 'ios-aperture', 1, '/', '1367038467288072192', '/', 0.00, '积分', 'null', NULL); +INSERT INTO `li_menu` VALUES (1373167227385151488, 'admin', '2021-03-20 01:59:14', b'0', 'admin', '2021-07-27 16:02:40', 'null', 'member/point/point', 'ios-aperture', 2, 'point', '1373166892465782784', 'point', 0.00, '积分历史', 'null', '/manager/member/memberPointsHistory*'); +INSERT INTO `li_menu` VALUES (1373791578371391488, 'admin', '2021-03-21 19:20:11', b'0', 'admin', '2021-07-27 16:05:38', NULL, 'seller/bill/accountStatementBill', 'md-alert', 2, 'accountStatementBill', '1367048754229673984', 'accountStatementBill', 0.00, '商家对账', NULL, '/manager/store/bill*'); +INSERT INTO `li_menu` VALUES (1374154349697040384, 'admin', '2021-03-22 19:21:42', b'0', 'admin', '2021-07-27 16:06:55', 'null', 'Main', 'md-aperture', 1, 'feedback', '1367040599596728320', '/', 3.00, '意见反馈', 'null', '/manager/feedback*'); +INSERT INTO `li_menu` VALUES (1374155741123837952, 'admin', '2021-03-22 19:27:14', b'0', 'admin', '2021-07-27 15:41:40', 'null', 'page/feedback/feedback', 'md-aperture', 2, 'feedback', '1374154349697040384', 'feedback', 0.00, '意见反馈', 'null', 'null'); +INSERT INTO `li_menu` VALUES (1374173575405109248, 'admin', '2021-03-22 20:38:06', b'0', 'admin', '2021-03-22 20:52:58', 'null', 'Main', 'ios-analytics', 1, 'distributionManager', '1367040599596728320', '/', 1.00, '分销管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1374177618072436736, 'admin', '2021-03-22 20:54:10', b'0', 'admin', '2021-07-27 16:05:58', 'null', 'distribution/distributionSetting', 'ios-basketball', 2, 'distributionSetting', '1374173575405109248', 'distributionSetting', 0.00, '分销设置', 'null', '/manager/system/setting/put/DISTRIBUTION_SETTING*,/manager/system/setting/get/DISTRIBUTION_SETTING*'); +INSERT INTO `li_menu` VALUES (1374177789581721600, 'admin', '2021-03-22 20:54:51', b'0', 'admin', '2021-07-27 16:06:15', 'null', 'distribution/distributionGoods', 'ios-chatbubbles', 2, 'distributionGoods', '1374173575405109248', 'distributionGoods', 3.00, '分销商品', 'null', '/manager/distribution/goods*'); +INSERT INTO `li_menu` VALUES (1374177910411231232, 'admin', '2021-03-22 20:55:19', b'0', 'admin', '2021-07-27 16:06:20', 'null', 'distribution/distributionOrder', 'ios-cloudy', 2, 'distributionOrder', '1374173575405109248', 'distributionOrder', 4.00, '分销订单', 'null', '/manager/distribution/order*,/manager/store*'); +INSERT INTO `li_menu` VALUES (1374178079181635584, 'admin', '2021-03-22 20:56:00', b'0', 'admin', '2021-07-27 16:06:05', 'null', 'distribution/distributionApply', 'md-egg', 2, 'distributionApply', '1374173575405109248', 'distributionApply', 1.00, '分销申请', 'null', '/manager/distribution*'); +INSERT INTO `li_menu` VALUES (1374178303975358464, 'admin', '2021-03-22 20:56:53', b'0', 'admin', '2021-07-27 16:06:08', 'null', 'distribution/distribution', 'md-person', 2, 'distribution', '1374173575405109248', 'distribution', 2.00, '分销员', 'null', '/manager/distribution*'); +INSERT INTO `li_menu` VALUES (1374916594269945856, 'admin', '2021-03-24 21:50:35', b'0', 'admin', '2021-07-27 16:08:51', NULL, 'sys/slider/slider', 'ios-aperture', 2, 'slider', '1349237129847005184', 'slider', 7.00, '验证码', NULL, '/manager/verificationSource*'); +INSERT INTO `li_menu` VALUES (1376450531517530112, 'admin', '2021-03-29 03:25:55', b'0', NULL, NULL, NULL, 'Main', 'md-basketball', 1, 'notice', '1367040599596728320', '/', 5.00, '站内信', NULL, NULL); +INSERT INTO `li_menu` VALUES (1376450662098796544, 'admin', '2021-03-29 03:26:26', b'0', 'admin', '2021-07-27 16:07:23', NULL, 'sys/message/noticeMessageTemplate', 'ios-american-football', 2, 'noticeMessageTemplate', '1376450531517530112', 'noticeMessageTemplate', 1.00, '站内信', NULL, '/manager/noticeMessage*,/manager/message*,/manager/store*,/manager/member*'); +INSERT INTO `li_menu` VALUES (1376450766817984512, 'admin', '2021-03-29 03:26:51', b'0', 'admin', '2021-03-29 03:27:25', 'null', 'Main', 'md-checkmark', 1, 'sms', '1367040599596728320', '/', 6.00, '短信管理', 'null', NULL); +INSERT INTO `li_menu` VALUES (1376450876423536640, 'admin', '2021-03-29 03:27:17', b'0', 'admin', '2021-07-27 16:07:29', NULL, 'sys/message/sms', 'ios-timer', 2, 'sms', '1376450766817984512', 'sms', 1.00, '短信', NULL, '/manager/sms*,/manager/member*'); +INSERT INTO `li_menu` VALUES (1384035281702748160, 'admin', '2021-04-19 14:45:00', b'0', 'admin', '2021-07-27 16:08:18', 'null', 'member/message-manage/weChatMessageManager', 'md-aperture', 2, 'message-manage', '1349237129847005184', 'message-manage', 5.00, '微信消息', 'null', '/manager/message/wechat*,/manager/message/wechatMPMessage*'); +INSERT INTO `li_menu` VALUES (1403988156444962818, 'admin', '2021-06-13 16:10:36', b'0', 'admin', '2021-07-27 16:04:48', 'null', 'promotion/couponActivity/coupon', '', 2, 'coupon-activity', '1367049214198022144', 'coupon-activity', 0.00, '券活动', 'null', '/manager/promotion/couponActivity*'); +INSERT INTO `li_menu` VALUES (1407601962899230721, 'admin', '2021-06-23 15:30:35', b'0', 'admin', '2021-07-27 16:05:08', NULL, 'Main', '', 1, 'liveManage', '1367040067201138688', '/', 2.00, '直播管理', NULL, '/manager/broadcast*'); +INSERT INTO `li_menu` VALUES (1407602049759072258, 'admin', '2021-06-23 15:30:55', b'0', NULL, NULL, NULL, 'promotion/live/live', '', 2, 'live', '1407601962899230721', 'live', 1.00, '直播管理', NULL, NULL); +INSERT INTO `li_menu` VALUES (1407602441964244994, 'admin', '2021-06-23 15:32:29', b'0', NULL, NULL, NULL, 'Main', '', 1, 'pointManage', '1367040067201138688', '/', 3.00, '积分活动', NULL, NULL); +INSERT INTO `li_menu` VALUES (1407602516912263170, 'admin', '2021-06-23 15:32:47', b'0', 'admin', '2021-07-27 16:05:14', NULL, 'promotion/pointsGoods/pointsGoods', '', 2, 'pointsGoods', '1407602441964244994', 'pointsGoods', 1.00, '积分商品', NULL, '/manager/promotion/pointsGoods*,/manager/goods*'); +INSERT INTO `li_menu` VALUES (1407602673334636546, 'admin', '2021-06-23 15:33:24', b'0', 'admin', '2021-07-27 16:05:18', NULL, 'promotion/pointsGoodsCategory/pointsGoodsCategory', '', 2, 'pointsGoodsCategory', '1407602441964244994', 'pointsGoodsCategory', 2.00, '积分分类', NULL, '/manager/promotion/pointsGoodsCategory*'); +INSERT INTO `li_menu` VALUES (1410862675914764290, 'admin', '2021-07-02 15:27:29', b'0', 'admin', '2021-07-27 16:06:26', 'null', 'distribution/distributionCash', '', 2, 'distributionCash', '1374173575405109248', 'distributionCash', 5.00, '分销提现', 'null', '/manager/distribution/cash*'); +INSERT INTO `li_menu` VALUES (1419926569920536578, 'admin', '2021-07-27 15:44:10', b'0', 'admin', '2021-07-27 16:07:10', NULL, 'customWords/index', NULL, 2, 'customWords', '1367050250249830400', 'customWords', 4.00, 'ES分词', NULL, '/manager/manager/custom-words*'); +COMMIT; +SET FOREIGN_KEY_CHECKS = 1; + +/** 新增会员获的总积分 **/ +ALTER TABLE li_member ADD total_point bigint ( 20 ) DEFAULT 0 COMMENT '积分总数量'; \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..dbbe3558 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md index 3ac223be..a94031b2 100644 --- a/README.md +++ b/README.md @@ -1,204 +1,176 @@ ## Lilishop B2B2C商城系统 -### 介绍 +#### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,其他问题先看文档后提问) + +#### 不用削尖脑袋往老群里加,老群活跃度较低,很多潜水党,新群相对而言活跃一些 :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: + +#### PS: **演示站点所有环境均部署master分支。如果有演示站点问题,可以反馈,如果演示站点没问题本地运行有问题,需自行处理** + +##### 交流 qq 1群 961316482(已满) +##### 交流 qq 2群 875294241(已满) +##### 交流 qq 3群 263785057(已满) +##### 交流 qq 4群 674617534 (已满) +##### 交流 qq 5群 594675235 + +##### 体验 公众号/小程序/APP 体验,扫描二维码 + +![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png) + +[![star](https://gitee.com/beijing_hongye_huicheng/lilishop/badge/star.svg?theme=dark)](https://gitee.com/beijing_hongye_huicheng/lilishop/stargazers) +  ![github](https://img.shields.io/github/stars/hongyehuicheng/lilishop.svg?style=social&logo=#181717) + + +### 商城介绍 **官网**:https://pickmall.cn -Lilishop 是一款Java开发,基于SpringBoot的B2B2C多用户商城,前端使用 Vue、uniapp-app开发 **系统全端全部代码开源** +Lilishop商城系统支持商家入驻,后端基于SpringBoot 研发,前端使用 Vue、uniapp开发, **系统全端全部代码开源** -商城展示端包含 PC、H5、小程序、APP。 +前后端分离,支持分布式部署,支持Docker,各个API独立,并且有独立的消费者。 -商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、分销模块、文章模块、系统设置模块、流量分析模块 +### 商城 API/消费者 聚合版 +api不需要单独部署,只需启动一个jar包就可以正常运转 如有需要,可以点击跳转 +https://gitee.com/beijing_hongye_huicheng/lilishop-simplify -系统包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等,支持Docker,支持k8s。是一款高性能,支持高并发等商城系统。 +### 开发/使用/常见问题 帮助文档 -开箱即用,简单配置即可部署一套属于您的系统。 +https://docs.pickmall.cn -完美支持二开、学生毕业设计答辩等各个场景 +### 项目地址 -### 文档 +gitee : https://gitee.com/beijing_hongye_huicheng -**产品文档**(需求、架构、使用、部署、开发):https://docs.pickmall.cn +github 镜像: https://github.com/lilishop?tab=repositories +商城UI 项目下3个文件夹 +buyer:买家PC端,seller:商家端,manager:后台管理端 -### 项目链接 - -**Java后台**:https://gitee.com/beijing_hongye_huicheng/lili-shop.git - -**Vue后台前端**: https://gitee.com/beijing_hongye_huicheng/lili-shop-ui.git - -**Uni-app**:https://gitee.com/beijing_hongye_huicheng/lili-shop-uniapp.git - -**docker一键部署**:https://gitee.com/beijing_hongye_huicheng/docker.git ### 演示地址 +PS:手机验证码为 ‘111111’ -**运营后台**:https://admin-b2b2c.pickmall.cn 账号:admin/123456 +**平台管理端**:https://admin-b2b2c.pickmall.cn 账号:admin/123456 -**店铺后台**:https://store-b2b2c.pickmall.cn 账号:13011111111/111111 +**店铺管理端**:https://store-b2b2c.pickmall.cn 账号:13011111111/111111 -**用户前台**:https://pc-b2b2c.pickmall.cn +**商城PC页面**:https://pc-b2b2c.pickmall.cn -**移动端**:https://m-b2b2c.pickmall.cn +**商城 小程序/公众号/APP**:扫描二维码 -![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png) +![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png) -### 3行命令搭建本地环境 +### 快速本地部署 -#### 下载docker脚本 -`git clone https://gitee.com/beijing_hongye_huicheng/docker.git ` -##### 部署基础环境 -`docker-compose up -d` -##### 部署应用 -`docker-compose -f docker-compose-application.yml up -d` +[点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html) -### 交流群 +**商城数据库** +使用docker-compose部署数据库,自动初始化数据库,不需要手动下载等操作 -**QQ群**:961316482 - - - -### 技术选型 - -##### Java后台 - -| 说明 | 框架 | -| -------------- | --------------- | -| 基础框架 | Spring Boot | -| MVC框架 | Spring MVC | -| 持久框架 | Mybatis-Plus | -| 程序构建 | Maven | -| 关系型数据库 | MySQL | -| 消息中间件AMQP | RocketMQ | -| 缓存 | Redis +MongoDB | -| 搜索引擎 | Elasticsearch | -| 安全框架 | Spring Security | -| 数据库连接池 | Druid | -| 数据库分库分表 | sharding | -| 定时任务 | xxl-job | -| 负载均衡 | Nginx | -| 静态资源 | 阿里云OSS | -| 短信 | 阿里云短信 | -| 日志处理 | Log4j | -| 接口规范 | RESTful | -| 接口文档 | Swagger | -| 认证 | JWT | - -##### 前端-运营后台、店铺后台 - -| 说明 | 框架 | -| ---------- | ---------- | -| 构建工具 | webpack | -| JS版本 | ES6 | -| 基础JS框架 | Vue.js | -| 视频播放器 | Dplayer | -| 路由管理 | Vue Router | -| 状态管理 | Vuex | -| 基础UI库 | iView | -| UI界面基于 | iView | -| 网络请求 | axios | -| CSS预处理 | scss | -| 代码检查 | ESLint | -| 数据可视化 | AntV g2 | -| 地图引擎 | amap | - -##### 前端-移动端 - -| 说明 | 架构 | -| --------- | ------- | -| 基础UI库 | uViewui | -| 基础框架 | uni-app | -| CSS预处理 | scss | -| 地图引擎 | amap | +如果手动部署,才需要获取sql [点击跳转](https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql) (PS:这里有与tag版本一致的sql,如果是历史版本,则docker项目也切换至历史版本获取sql即可,历史版本升级则根据java相聚的根目录DB目录下的升级sql,按需执行)。 ### 功能列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
运营后台功能
首页平台统计、待办事项、流量统计
会员会员列表
评价列表
积分历史
会员资金
充值记录
订单商品订单
订单售后
交易投诉
售后原因
收款流水
退款流水
商品商品列表
商品审核
商品分类
商品品牌
商品规格
计量单位
促销优惠券
秒杀活动
拼团活动
积分商品
积分分类
店铺店铺管理
店铺结算
店铺结算
店铺结算
店铺对账
运营店铺对账
PC端楼层装修
移动端楼层装修
分销管理
文章管理
意见反馈
站内信
短信管理
APP版本管理
统计会员统计
订单统计
商品统计
流量统计
设置用户管理
菜单管理
部门管理
系统设置
OSS资源
行政地区
物流公司
信任登录
支付设置
验证码管理
敏感词管理
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
店铺后台功能列表
首页店铺信息
待办事项
平台公告
商品商品发布
商品列表
店铺商品分类
订单商品订单
退货管理
退款管理
投诉管理
评价管理
财务财务对账
店铺结算
发票管理
促销拼团管理
秒杀活动
满额活动
优惠券
分销商品
统计商品统计
订单统计
设置配送模板
物流公司
店铺设置
自提点管理
系统消息
-### 授权 -Lilishop学习免费,限制商用,如果需要商业使用请联系我们。QQ3409056806 \ No newline at end of file +#### 平台管理端功能 + +![平台管理端功能](https://static.pickmall.cn/images/other/managerList1.jpg) + + + +#### 卖家功能 + +![商家端功能](https://static.pickmall.cn/images/other/storeList.jpg) + + +### 商城前端功能展示 + +#### 商城移动端 + +移动端功能展示 + +#### 平台管理端 + +![管理端功能展示](https://static.pickmall.cn/images/other/manager.gif) + + +### 技术选型 + +#### 架构图 + +![技术选型](https://lili-system.oss-cn-beijing.aliyuncs.com/docs/%E6%9E%B6%E6%9E%84.png) + +##### 后台技术选型 + +| 说明 | 框架 | 说明 | | +| -------------- | --------------- | -------------- | ------------- | +| 基础框架 | Spring Boot | MVC框架 | Spring MVC | +| 持久框架 | Mybatis-Plus | 程序构建 | Maven | +| 关系型数据库 | MySQL | 消息中间件AMQP | RocketMQ | +| 缓存 | Redis +MongoDB | 搜索引擎 | Elasticsearch | +| 安全框架 | Spring Security | 数据库连接池 | Druid | +| 数据库分库分表 | sharding | 定时任务 | xxl-job | +| 负载均衡 | Nginx | 静态资源 | 阿里云OSS | +| 短信 | 阿里云短信 | 认证 | JWT | +| 日志处理 | Log4j | 接口规范 | RESTful | + +##### 前端-运营后台、店铺后台 + +| 说明 | 框架 | 说明 | 框架 | +| ---------- | ---------- | ---------- | ------- | +| 构建工具 | webpack | JS版本 | ES6 | +| 基础JS框架 | Vue.js | 视频播放器 | Dplayer | +| 路由管理 | Vue Router | 状态管理 | Vuex | +| 基础UI库 | iView | UI界面基于 | iView | +| 网络请求 | axios | | | + +##### 前端-移动端 + +| 说明 | 架构 | 说明 | 架构 | +| --------- | ------- | -------- | ------- | +| 基础UI库 | uViewui | 基础框架 | uni-app | +| CSS预处理 | scss | 地图引擎 | amap | + +### 版本升级 + +``` +系统后续会提供多场景解决方案。 +更多架构:微服务、Saas、中台等,都会支持。 支持差价升级商业授权 +``` + +### 商业授权 +商业版本与开源版本代码一致,没有区分 + +商业使用需要授权,授权方式可选择联系官网客服,或者qq群联系群主。 + +商业授权模式为永久授权,支持永久升级。 + +商业案例由于涉及部分多层二开关系,如需了解可以咨询销售。 + + +### 开源须知 +1.仅允许用于个人学习研究使用. + +2.禁止将本开源的代码和资源进行任何形式任何名义的出售. + +3.软件受国家计算机软件著作权保护(登记号:2021SR0805085)。 + +4.限制商用,如果需要商业使用请联系我们。QQ3409056806.或者加入qq群联系群主。 + + + +### 交流群 + +##### 交流 qq 1群 961316482(已满) +##### 交流 qq 2群 875294241(已满) +##### 交流 qq 3群 263785057(已满) +##### 交流 qq 4群 674617534(已满) +##### 交流 qq 5群 594675235 + +### 附录 +有人有自己的学习视频、学习记录文档、希望宣传关联开源项目等均可以私聊仓库所有者。 + +类似: + +清晨敲代码同学的分析: https://blog.csdn.net/vaevaevae233/category_12103567.html \ No newline at end of file diff --git a/admin/pom.xml b/admin/pom.xml index e188f455..8b4b5b9b 100644 --- a/admin/pom.xml +++ b/admin/pom.xml @@ -6,7 +6,8 @@ cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml admin @@ -15,7 +16,7 @@ de.codecentric spring-boot-admin-starter-server - 2.3.1 + ${spring-boot-admin} org.springframework.boot @@ -26,10 +27,15 @@ org.springframework.boot spring-boot-starter-security - - - - + + net.logstash.logback + logstash-logback-encoder + ${logstash-logback-encoder} + + + + + diff --git a/admin/src/main/java/cn/lili/admin/AdminApplication.java b/admin/src/main/java/cn/lili/admin/AdminApplication.java index d88d42e3..9d4c23b8 100644 --- a/admin/src/main/java/cn/lili/admin/AdminApplication.java +++ b/admin/src/main/java/cn/lili/admin/AdminApplication.java @@ -12,6 +12,12 @@ import org.springframework.security.web.authentication.SavedRequestAwareAuthenti import java.util.UUID; +/** + * Admin + * + * @author Chopper + * @since 2020/11/16 10:03 下午 + */ @Configuration @EnableAutoConfiguration @EnableAdminServer @@ -37,11 +43,11 @@ public class AdminApplication { successHandler.setDefaultTargetUrl(this.adminServer.path("/")); http.authorizeRequests().antMatchers("/instances**").permitAll(); http.authorizeRequests( - (authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll() // 授予公众对所有静态资产和登录页面的访问权限。 + (authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll() //授予公众对所有静态资产和登录页面的访问权限。 .antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated() //其他所有请求都必须经过验证。 ).formLogin( - (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and() // 配置登录和注销。 - ).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults()) // 启用HTTP基本支持。这是Spring Boot Admin Client注册所必需的。 + (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and() //配置登录和注销。 + ).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults()) //启用HTTP基本支持。这是Spring Boot Admin Client注册所必需的。 .csrf().disable() .rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600)); } diff --git a/admin/src/main/resources/application.properties b/admin/src/main/resources/application.properties index 8e6cdb8a..5f433f01 100644 --- a/admin/src/main/resources/application.properties +++ b/admin/src/main/resources/application.properties @@ -16,5 +16,6 @@ spring.mail.username=1814994716@qq.com spring.mail.password=abcdefg123456!@#$%^ # 日志文件路径 logging.file.path=lili-logs/admin +lili.data.logstash.server=106.124.130.167:4560 # 文件格式 logging.pattern.file=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx diff --git a/admin/src/main/resources/logback-spring.xml b/admin/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..a8d0eba6 --- /dev/null +++ b/admin/src/main/resources/logback-spring.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + + + ${LOGSTASH_SERVER} + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/buyer-api/pom.xml b/buyer-api/pom.xml index 7499e497..42426cbe 100644 --- a/buyer-api/pom.xml +++ b/buyer-api/pom.xml @@ -3,21 +3,19 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - 4.3 - buyer-api cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml cn.lili framework - 1.0.1 + ${revision} diff --git a/buyer-api/src/main/java/cn/lili/BuyerApiApplication.java b/buyer-api/src/main/java/cn/lili/BuyerApiApplication.java index 3e8f283b..c10d84f6 100644 --- a/buyer-api/src/main/java/cn/lili/BuyerApiApplication.java +++ b/buyer-api/src/main/java/cn/lili/BuyerApiApplication.java @@ -6,7 +6,6 @@ import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.core.task.TaskExecutor; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -14,10 +13,9 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; * 买家API * * @author Chopper - * @date 2020/11/16 10:03 下午 + * @since 2020/11/16 10:03 下午 */ @SpringBootApplication -@EnableJpaAuditing @EnableCaching @EnableAsync public class BuyerApiApplication { @@ -31,6 +29,7 @@ public class BuyerApiApplication { public static void main(String[] args) { System.setProperty("es.set.netty.runtime.available.processors", "false"); + System.setProperty("rocketmq.client.logUseSlf4j","true"); SpringApplication.run(BuyerApiApplication.class, args); } } diff --git a/buyer-api/src/main/java/cn/lili/controller/SwaggerBootstrapUiDemoApplication.java b/buyer-api/src/main/java/cn/lili/controller/SwaggerBootstrapUiDemoApplication.java deleted file mode 100644 index 446255b5..00000000 --- a/buyer-api/src/main/java/cn/lili/controller/SwaggerBootstrapUiDemoApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.lili.controller; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import springfox.documentation.spring.web.SpringfoxWebMvcConfiguration; - -/** - * SwaggerBootstrapUiDemoApplication - * - * @author Chopper - * @version v1.0 - * 2020-12-09 20:09 - */ -@ConditionalOnClass(SpringfoxWebMvcConfiguration.class) -public class SwaggerBootstrapUiDemoApplication implements WebMvcConfigurer { - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); - } -} \ No newline at end of file diff --git a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionBuyerController.java index d434ef12..c5332ed3 100644 --- a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionBuyerController.java @@ -1,19 +1,17 @@ package cn.lili.controller.distribution; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.Distribution; import cn.lili.modules.distribution.entity.dos.DistributionOrder; +import cn.lili.modules.distribution.entity.dto.DistributionApplyDTO; import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams; import cn.lili.modules.distribution.service.DistributionOrderService; import cn.lili.modules.distribution.service.DistributionService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,38 +20,34 @@ import org.springframework.web.bind.annotation.*; * 买家端,分销员接口 * * @author pikachu - * @date: 2020/11/16 10:03 下午 + * @since 2020/11/16 10:03 下午 */ @RestController @Api(tags = "买家端,分销员接口") -@RequestMapping("/buyer/distribution") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/distribution/distribution") public class DistributionBuyerController { /** * 分销员 */ - private final DistributionService distributionService; + @Autowired + private DistributionService distributionService; /** * 分销员订单 */ - private final DistributionOrderService distributionOrderService; + @Autowired + private DistributionOrderService distributionOrderService; - //申请分销员 @ApiOperation(value = "申请分销员") - @ApiImplicitParams({ - @ApiImplicitParam(name = "name", value = "姓名", required = true, paramType = "query", dataType = "String"), - @ApiImplicitParam(name = "idNumber", value = "身份证号", required = true, paramType = "query", dataType = "String") - }) @PostMapping - public ResultMessage applyDistribution(@RequestParam String name, @RequestParam String idNumber) { - return ResultUtil.data(distributionService.applyDistribution(name, idNumber)); + public ResultMessage applyDistribution(DistributionApplyDTO distributionApplyDTO) { + return ResultUtil.data(distributionService.applyDistribution(distributionApplyDTO)); } @ApiOperation(value = "获取分销员分页订单列表") @GetMapping("/distributionOrder") public ResultMessage> distributionOrderPage(DistributionOrderSearchParams distributionOrderSearchParams) { - distributionOrderSearchParams.setDistributionId(UserContext.getCurrentUser().getId()); + distributionOrderSearchParams.setDistributionId(distributionService.getDistribution().getId()); return ResultUtil.data(distributionOrderService.getDistributionOrderPage(distributionOrderSearchParams)); } @@ -65,4 +59,12 @@ public class DistributionBuyerController { return ResultUtil.data(distributionService.getDistribution()); } + + @ApiOperation(value = "绑定分销员") + @ApiImplicitParam(name = "distributionId", value = "分销员ID", required = true, paramType = "path") + @GetMapping("/bindingDistribution/{distributionId}") + public ResultMessage bindingDistribution(@PathVariable String distributionId){ + distributionService.bindingDistribution(distributionId); + return ResultUtil.success(); + } } diff --git a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionCashBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionCashBuyerController.java index d6038795..28994aad 100644 --- a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionCashBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionCashBuyerController.java @@ -1,6 +1,9 @@ package cn.lili.controller.distribution; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.DistributionCash; @@ -10,14 +13,16 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; @@ -25,32 +30,39 @@ import javax.validation.constraints.NotNull; * 买家端,分销商品佣金提现接口 * * @author pikachu - * @date: 2020/11/16 10:03 下午 + * @since 2020/11/16 10:03 下午 */ @RestController @Api(tags = "买家端,分销商品佣金提现接口") @RequestMapping("/buyer/distribution/cash") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Validated public class DistributionCashBuyerController { /** * 分销佣金 */ - private final DistributionCashService distributionCashService; + @Autowired + private DistributionCashService distributionCashService; /** * 分销员提现 */ - private final DistributionCashService distributorCashService; + @Autowired + private DistributionCashService distributorCashService; + @PreventDuplicateSubmissions @ApiOperation(value = "分销员提现") @ApiImplicitParams({ @ApiImplicitParam(name = "price", value = "申请金额", required = true, paramType = "query", dataType = "double") }) @PostMapping - public ResultMessage cash(@NotNull @ApiIgnore Double price) { - Boolean result = distributionCashService.cash(price); - return ResultUtil.data(result); + public ResultMessage cash(@Validated @Max(value = 9999, message = "提现金额单次最多允许提现9999元") + @Min(value = 1, message = "提现金额单次最少提现金额为1元") + @NotNull @ApiIgnore Double price) { + if (Boolean.TRUE.equals(distributionCashService.cash(price))) { + return ResultUtil.success(); + } + throw new ServiceException(ResultCode.ERROR); } @ApiOperation(value = "分销员提现历史") diff --git a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsBuyerController.java index b651ad41..31048556 100644 --- a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsBuyerController.java @@ -1,7 +1,9 @@ package cn.lili.controller.distribution; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dto.DistributionGoodsSearchParams; import cn.lili.modules.distribution.entity.vos.DistributionGoodsVO; @@ -10,8 +12,8 @@ import cn.lili.modules.distribution.service.DistributionSelectedGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -24,22 +26,23 @@ import javax.validation.constraints.NotNull; * 买家端,分销商品接口 * * @author Bulbasaur - * @date: 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ @RestController @Api(tags = "买家端,分销商品接口") -@RequestMapping("/buyer/distributionGoods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/distribution/goods") public class DistributionGoodsBuyerController { /** * 分销商品 */ - private final DistributionGoodsService distributionGoodsService; + @Autowired + private DistributionGoodsService distributionGoodsService; /** * 选择分销商品 */ - private final DistributionSelectedGoodsService distributionSelectedGoodsService; + @Autowired + private DistributionSelectedGoodsService distributionSelectedGoodsService; @ApiOperation(value = "获取分销商商品列表") @@ -48,14 +51,27 @@ public class DistributionGoodsBuyerController { return ResultUtil.data(distributionGoodsService.goodsPage(distributionGoodsSearchParams)); } + @PreventDuplicateSubmissions @ApiOperation(value = "选择分销商品") - @ApiImplicitParam(name = "distributionGoodsId", value = "分销ID", required = true, dataType = "String", paramType = "path") + @ApiImplicitParams({ + @ApiImplicitParam(name = "distributionGoodsId", value = "分销ID", required = true, dataType = "String", paramType = "path"), + @ApiImplicitParam(name = "checked", value = "是否选择", required = true, dataType = "boolean", paramType = "query") + }) @GetMapping(value = "/checked/{distributionGoodsId}") - public ResultMessage> distributionCheckGoods( - @NotNull(message = "分销商品不能为空") @PathVariable("distributionGoodsId") String distributionGoodsId) { - if (distributionSelectedGoodsService.add(distributionGoodsId)) { - return ResultUtil.success(ResultCode.SUCCESS); + public ResultMessage distributionCheckGoods( + @NotNull(message = "分销商品不能为空") @PathVariable("distributionGoodsId") String distributionGoodsId, Boolean checked) { + Boolean result = false; + if (checked) { + result = distributionSelectedGoodsService.add(distributionGoodsId); + } else { + result = distributionSelectedGoodsService.delete(distributionGoodsId); } - return ResultUtil.error(ResultCode.ERROR); + //判断操作结果 + if (result) { + return ResultUtil.success(ResultCode.SUCCESS); + } else { + throw new ServiceException(ResultCode.ERROR); + } + } } diff --git a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionOrderBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionOrderBuyerController.java index 4f8585a5..4c7c3ddd 100644 --- a/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionOrderBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/distribution/DistributionOrderBuyerController.java @@ -1,6 +1,6 @@ package cn.lili.controller.distribution; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams; @@ -9,7 +9,6 @@ import cn.lili.modules.distribution.service.DistributionService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,22 +19,23 @@ import org.springframework.web.bind.annotation.RestController; * 买家端,分销商品佣金提现接口 * * @author pikachu - * @date: 2020/11/16 10:03 下午 + * @since 2020/11/16 10:03 下午 */ @RestController @Api(tags = "买家端,分销订单接口") @RequestMapping("/buyer/distribution/order") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionOrderBuyerController { /** * 分销订单 */ - private final DistributionOrderService distributionOrderService; + @Autowired + private DistributionOrderService distributionOrderService; /** * 分销员 */ - private final DistributionService distributionService; + @Autowired + private DistributionService distributionService; @ApiOperation(value = "分销员订单") diff --git a/buyer-api/src/main/java/cn/lili/controller/goods/CategoryBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/goods/CategoryBuyerController.java index ced66375..37689867 100644 --- a/buyer-api/src/main/java/cn/lili/controller/goods/CategoryBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/goods/CategoryBuyerController.java @@ -1,13 +1,12 @@ package cn.lili.controller.goods; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.vos.CategoryVO; import cn.lili.modules.goods.service.CategoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -22,17 +21,17 @@ import java.util.List; * 买家端,商品分类接口 * * @author Chopper - * @date: 2020/11/16 10:05 下午 + * @since 2020/11/16 10:05 下午 */ @RestController @Api(tags = "买家端,商品分类接口") -@RequestMapping("/buyer/category") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/goods/category") public class CategoryBuyerController { /** * 商品分类 */ - private final CategoryService categoryService; + @Autowired + private CategoryService categoryService; @ApiOperation(value = "获取商品分类列表") @ApiImplicitParam(name = "parentId", value = "上级分类ID,全部分类为:0", required = true, dataType = "Long", paramType = "path") diff --git a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java index 81d61d89..19caa3e0 100644 --- a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java @@ -1,10 +1,10 @@ package cn.lili.controller.goods; -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.distribution.service.DistributionService; import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dto.GoodsSearchParams; import cn.lili.modules.goods.entity.vos.GoodsVO; @@ -14,16 +14,17 @@ import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.service.EsGoodsSearchService; +import cn.lili.modules.search.service.HotWordsService; import cn.lili.modules.statistics.aop.PageViewPoint; import cn.lili.modules.statistics.aop.enums.PageViewEnum; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -37,31 +38,32 @@ import java.util.Map; * 买家端,商品接口 * * @author Chopper - * @date 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ +@Slf4j @Api(tags = "买家端,商品接口") @RestController -@RequestMapping("/buyer/goods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/goods/goods") public class GoodsBuyerController { /** * 商品 */ - private final GoodsService goodsService; + @Autowired + private GoodsService goodsService; /** * 商品SKU */ - private final GoodsSkuService goodsSkuService; + @Autowired + private GoodsSkuService goodsSkuService; /** * ES商品搜索 */ - private final EsGoodsSearchService goodsSearchService; - /** - * 分销员 - */ - private final DistributionService distributionService; + @Autowired + private EsGoodsSearchService goodsSearchService; + @Autowired + private HotWordsService hotWordsService; @ApiOperation(value = "通过id获取商品信息") @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path", dataType = "Long") @@ -73,23 +75,24 @@ public class GoodsBuyerController { @ApiOperation(value = "通过id获取商品信息") @ApiImplicitParams({ @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path"), - @ApiImplicitParam(name = "skuId", value = "skuId", required = true, paramType = "path"), - @ApiImplicitParam(name = "distributionId", value = "分销员ID", dataType = "String", paramType = "query") + @ApiImplicitParam(name = "skuId", value = "skuId", required = true, paramType = "path") }) @GetMapping(value = "/sku/{goodsId}/{skuId}") @PageViewPoint(type = PageViewEnum.SKU, id = "#id") public ResultMessage> getSku(@NotNull(message = "商品ID不能为空") @PathVariable("goodsId") String goodsId, - @NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId, - String distributionId) { - - Map map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId); - - //判断如果传递分销员则进行记录 - if (CharSequenceUtil.isNotEmpty(distributionId)) { - distributionService.bindingDistribution(distributionId); + @NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId) { + try { + // 读取选中的列表 + Map map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId); + return ResultUtil.data(map); + } catch (ServiceException se) { + log.info(se.getMsg(), se); + throw se; + } catch (Exception e) { + log.error(ResultCode.GOODS_ERROR.message(), e); + return ResultUtil.error(ResultCode.GOODS_ERROR); } - return ResultUtil.data(map); } @ApiOperation(value = "获取商品分页列表") @@ -102,8 +105,7 @@ public class GoodsBuyerController { @GetMapping("/es") public ResultMessage> getGoodsByPageFromEs(EsGoodsSearchDTO goodsSearchParams, PageVO pageVO) { pageVO.setNotConvert(true); - Page esGoodsIndices = goodsSearchService.searchGoods(goodsSearchParams, pageVO); - return ResultUtil.data(esGoodsIndices); + return ResultUtil.data(goodsSearchService.searchGoodsByPage(goodsSearchParams, pageVO)); } @ApiOperation(value = "从ES中获取相关商品品牌名称,分类名称及属性") @@ -116,8 +118,8 @@ public class GoodsBuyerController { @ApiOperation(value = "获取搜索热词") @GetMapping("/hot-words") - public ResultMessage> getGoodsHotWords(Integer start, Integer end) { - List hotWords = goodsSearchService.getHotWords(start, end); + public ResultMessage> getGoodsHotWords(Integer count) { + List hotWords = hotWordsService.getHotWords(count); return ResultUtil.data(hotWords); } diff --git a/buyer-api/src/main/java/cn/lili/controller/member/FootprintController.java b/buyer-api/src/main/java/cn/lili/controller/member/FootprintController.java index 1f42daa2..480b8823 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/FootprintController.java +++ b/buyer-api/src/main/java/cn/lili/controller/member/FootprintController.java @@ -1,15 +1,17 @@ package cn.lili.controller.member; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dto.FootPrintQueryParams; import cn.lili.modules.member.service.FootprintService; import cn.lili.modules.search.entity.dos.EsGoodsIndex; +import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import org.apache.catalina.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,42 +23,40 @@ import java.util.List; * 买家端,浏览历史接口 * * @author Chopper - * @date: 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ @RestController @Api(tags = "买家端,浏览历史接口") -@RequestMapping("/buyer/footprint") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/member/footprint") public class FootprintController { /** * 会员足迹 */ - private final FootprintService footprintService; + @Autowired + private FootprintService footprintService; @ApiOperation(value = "分页获取") @GetMapping - public ResultMessage> getByPage(PageVO page) { - return ResultUtil.data(footprintService.footPrintPage(page)); + public ResultMessage> getByPage(FootPrintQueryParams params) { + params.setMemberId(UserContext.getCurrentUser().getId()); + return ResultUtil.data(footprintService.footPrintPage(params)); } @ApiOperation(value = "根据id删除") @ApiImplicitParam(name = "ids", value = "商品ID", required = true, allowMultiple = true, dataType = "String", paramType = "path") @DeleteMapping(value = "/delByIds/{ids}") public ResultMessage delAllByIds(@NotNull(message = "商品ID不能为空") @PathVariable("ids") List ids) { - if (footprintService.deleteByIds(ids)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + footprintService.deleteByIds(ids); + return ResultUtil.success(); + } @ApiOperation(value = "清空足迹") @DeleteMapping public ResultMessage deleteAll() { - if (footprintService.clean()) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + footprintService.clean(); + return ResultUtil.success(); } @ApiOperation(value = "获取当前会员足迹数量") @@ -65,4 +65,10 @@ public class FootprintController { return ResultUtil.data(footprintService.getFootprintNum()); } + + @GetMapping("/history") + @ApiOperation(value = "获取会员的历史足迹") + public ResultMessage> getMemberHistory(FootPrintQueryParams params) { + return ResultUtil.data(footprintService.footPrintPage(params)); + } } diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java index c890b208..fdd8e297 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java @@ -1,42 +1,39 @@ package cn.lili.controller.member; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.base.service.RegionService; import cn.lili.modules.member.entity.dos.MemberAddress; -import cn.lili.modules.promotion.service.MemberAddressService; +import cn.lili.modules.member.service.MemberAddressService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.Objects; /** * 买家端,会员地址接口 * * @author Bulbasaur - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,会员地址接口") -@RequestMapping("/buyer/memberAddress") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/member/address") public class MemberAddressBuyerController { /** * 会员收件地址 */ - private final MemberAddressService memberAddressService; - - private final RegionService regionService; + @Autowired + private MemberAddressService memberAddressService; @ApiOperation(value = "获取会员收件地址分页列表") @GetMapping @@ -61,15 +58,18 @@ public class MemberAddressBuyerController { @PostMapping public ResultMessage addShippingAddress(@Valid MemberAddress shippingAddress) { //添加会员地址 - shippingAddress.setMemberId(UserContext.getCurrentUser().getId()); + shippingAddress.setMemberId(Objects.requireNonNull(UserContext.getCurrentUser()).getId()); + if(shippingAddress.getIsDefault()==null){ + shippingAddress.setIsDefault(false); + } return ResultUtil.data(memberAddressService.saveMemberAddress(shippingAddress)); } @ApiOperation(value = "修改会员收件地址") @PutMapping public ResultMessage editShippingAddress(@Valid MemberAddress shippingAddress) { - //修改会员地址 - shippingAddress.setMemberId(UserContext.getCurrentUser().getId()); + OperationalJudgment.judgment(memberAddressService.getById(shippingAddress.getId())); + shippingAddress.setMemberId(Objects.requireNonNull(UserContext.getCurrentUser()).getId()); return ResultUtil.data(memberAddressService.updateMemberAddress(shippingAddress)); } @@ -77,10 +77,9 @@ public class MemberAddressBuyerController { @ApiImplicitParam(name = "id", value = "会员地址ID", dataType = "String", paramType = "path") @DeleteMapping(value = "/delById/{id}") public ResultMessage delShippingAddressById(@PathVariable String id) { - if (memberAddressService.removeMemberAddress(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + OperationalJudgment.judgment(memberAddressService.getById(id)); + memberAddressService.removeMemberAddress(id); + return ResultUtil.success(); } } diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionController.java b/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionController.java deleted file mode 100644 index 13065f9a..00000000 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionController.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.lili.controller.member; - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.member.service.GoodsCollectionService; -import cn.lili.modules.member.service.StoreCollectionService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.NotNull; - -/** - * 买家端,会员收藏接口 - * - * @author Chopper - * @date: 2020/11/17 2:32 下午 - */ -@RestController -@Api(tags = "买家端,会员收藏接口") -@RequestMapping("/buyer/member/collection") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MemberCollectionController { - - /** - * 会员商品收藏 - */ - private final GoodsCollectionService goodsCollectionService; - /** - * 会员店铺 - */ - private final StoreCollectionService storeCollectionService; - - @ApiOperation(value = "查询会员收藏列表") - @ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺") - @GetMapping("/{type}") - public ResultMessage goodsList(@PathVariable String type, PageVO page) { - if (type.equals("GOODS")) { - return ResultUtil.data(goodsCollectionService.goodsCollection(page)); - } - return ResultUtil.data(storeCollectionService.storeCollection(page)); - } - - @ApiOperation(value = "添加会员收藏") - @ApiImplicitParams({ - @ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"), - @ApiImplicitParam(name = "num", value = "值", dataType = "Long", paramType = "path") - }) - @PostMapping("/add/{type}/{id}") - public ResultMessage addGoodsCollection(@PathVariable String type, - @NotNull(message = "值不能为空") @PathVariable String id) { - if (type.equals("GOODS")) { - return ResultUtil.data(goodsCollectionService.addGoodsCollection(id)); - } - return ResultUtil.data(storeCollectionService.addStoreCollection(id)); - - } - - @ApiOperation(value = "删除会员收藏") - @ApiImplicitParams({ - @ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"), - @ApiImplicitParam(name = "num", value = "值", dataType = "Long", paramType = "path") - }) - @DeleteMapping(value = "/delete/{type}/{id}") - public ResultMessage deleteGoodsCollection(@PathVariable String type, - @NotNull(message = "值不能为空") @PathVariable String id) { - if (type.equals("GOODS")) { - return ResultUtil.data(goodsCollectionService.deleteGoodsCollection(id)); - } - return ResultUtil.data(storeCollectionService.deleteStoreCollection(id)); - } - - @ApiOperation(value = "查询会员是否收藏") - @ApiImplicitParams({ - @ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"), - @ApiImplicitParam(name = "id", value = "值", dataType = "String", paramType = "path") - }) - @GetMapping(value = "/isCollection/{type}/{id}") - public ResultMessage isCollection(@PathVariable String type, - @NotNull(message = "值不能为空") @PathVariable String id) { - if (type.equals("GOODS")) { - return ResultUtil.data(this.goodsCollectionService.isCollection(id)); - } - return ResultUtil.data(this.storeCollectionService.isCollection(id)); - } -} diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionGoodsController.java b/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionGoodsController.java new file mode 100644 index 00000000..c8e53e2d --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionGoodsController.java @@ -0,0 +1,68 @@ +package cn.lili.controller.member; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.service.GoodsCollectionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; + +/** + * 买家端,会员收藏接口 + * + * @author Chopper + * @since 2020/11/17 2:32 下午 + */ +@RestController +@Api(tags = "买家端,会员商品收藏接口") +@RequestMapping("/buyer/member/collection") +public class MemberCollectionGoodsController { + + /** + * 会员商品收藏 + */ + @Autowired + private GoodsCollectionService goodsCollectionService; + + @ApiOperation(value = "查询会员收藏列表") + @GetMapping("/GOODS") + public ResultMessage goodsList(PageVO page) { + return ResultUtil.data(goodsCollectionService.goodsCollection(page)); + } + + @ApiOperation(value = "添加会员收藏") + @ApiImplicitParams({ + @ApiImplicitParam(name = "num", value = "值", dataType = "Long", paramType = "path") + }) + @PostMapping("/add/GOODS/{id}") + public ResultMessage addGoodsCollection(@NotNull(message = "值不能为空") @PathVariable String id) { + return ResultUtil.data(goodsCollectionService.addGoodsCollection(id)); + + } + + @ApiOperation(value = "删除会员收藏") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"), + @ApiImplicitParam(name = "num", value = "值", dataType = "Long", paramType = "path") + }) + @DeleteMapping(value = "/delete/GOODS/{id}") + public ResultMessage deleteGoodsCollection(@NotNull(message = "值不能为空") @PathVariable String id) { + return ResultUtil.data(goodsCollectionService.deleteGoodsCollection(id)); + } + + @ApiOperation(value = "查询会员是否收藏") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "类型", dataType = "String", paramType = "path", example = "GOODS:商品,STORE:店铺"), + @ApiImplicitParam(name = "id", value = "值", dataType = "String", paramType = "path") + }) + @GetMapping(value = "/isCollection/GOODS/{id}") + public ResultMessage isCollection(@NotNull(message = "值不能为空") @PathVariable String id) { + return ResultUtil.data(this.goodsCollectionService.isCollection(id)); + } +} \ No newline at end of file diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionStoreController.java b/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionStoreController.java new file mode 100644 index 00000000..d73708bd --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/member/MemberCollectionStoreController.java @@ -0,0 +1,66 @@ +package cn.lili.controller.member; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.service.StoreCollectionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; + +/** + * 买家端,会员收藏接口 + * + * @author Chopper + * @since 2020/11/17 2:32 下午 + */ +@RestController +@Api(tags = "买家端,会员店铺收藏接口") +@RequestMapping("/buyer/member/storeCollection") +public class MemberCollectionStoreController { + + /** + * 会员店铺 + */ + @Autowired + private StoreCollectionService storeCollectionService; + + @ApiOperation(value = "查询会员收藏列表") + @GetMapping("/STORE") + public ResultMessage goodsList(PageVO page) { + return ResultUtil.data(storeCollectionService.storeCollection(page)); + } + + @ApiOperation(value = "添加会员收藏") + @ApiImplicitParams({ + @ApiImplicitParam(name = "num", value = "值", dataType = "Long", paramType = "path") + }) + @PostMapping("/add/STORE/{id}") + public ResultMessage addGoodsCollection(@NotNull(message = "值不能为空") @PathVariable String id) { + return ResultUtil.data(storeCollectionService.addStoreCollection(id)); + + } + + @ApiOperation(value = "删除会员收藏") + @ApiImplicitParams({ + @ApiImplicitParam(name = "num", value = "值", dataType = "Long", paramType = "path") + }) + @DeleteMapping(value = "/delete/STORE/{id}") + public ResultMessage deleteGoodsCollection(@NotNull(message = "值不能为空") @PathVariable String id) { + return ResultUtil.data(storeCollectionService.deleteStoreCollection(id)); + } + + @ApiOperation(value = "查询会员是否收藏") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "值", dataType = "String", paramType = "path") + }) + @GetMapping(value = "/isCollection/STORE/{id}") + public ResultMessage isCollection(@NotNull(message = "值不能为空") @PathVariable String id) { + return ResultUtil.data(this.storeCollectionService.isCollection(id)); + } +} diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberEvaluationBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/member/MemberEvaluationBuyerController.java index c30c6f63..26285f54 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberEvaluationBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/member/MemberEvaluationBuyerController.java @@ -1,7 +1,9 @@ package cn.lili.controller.member; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.enums.SwitchEnum; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.entity.dto.EvaluationQueryParams; @@ -13,7 +15,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -24,29 +25,30 @@ import javax.validation.constraints.NotNull; * 买家端,会员商品评价接口 * * @author Bulbasaur - * @date: 2020/11/16 10:08 下午 + * @since 2020/11/16 10:08 下午 */ @RestController @Api(tags = "买家端,会员商品评价接口") -@RequestMapping("/buyer/memberEvaluation") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/member/evaluation") public class MemberEvaluationBuyerController { /** * 会员商品评价 */ - private final MemberEvaluationService memberEvaluationService; + @Autowired + private MemberEvaluationService memberEvaluationService; + @PreventDuplicateSubmissions @ApiOperation(value = "添加会员评价") @PostMapping public ResultMessage save(@Valid MemberEvaluationDTO memberEvaluationDTO) { - return ResultUtil.data(memberEvaluationService.addMemberEvaluation(memberEvaluationDTO)); + return ResultUtil.data(memberEvaluationService.addMemberEvaluation(memberEvaluationDTO, true)); } @ApiOperation(value = "查看会员评价详情") @ApiImplicitParam(name = "id", value = "评价ID", required = true, paramType = "path") @GetMapping(value = "/get/{id}") - public ResultMessage save(@NotNull(message = "评价ID不能为空") @PathVariable("id") String id) { + public ResultMessage get(@NotNull(message = "评价ID不能为空") @PathVariable("id") String id) { return ResultUtil.data(memberEvaluationService.queryById(id)); } @@ -56,7 +58,7 @@ public class MemberEvaluationBuyerController { public ResultMessage> queryMineEvaluation(EvaluationQueryParams evaluationQueryParams) { //设置当前登录会员 evaluationQueryParams.setMemberId(UserContext.getCurrentUser().getId()); - return ResultUtil.data(memberEvaluationService.queryByParams(evaluationQueryParams)); + return ResultUtil.data(memberEvaluationService.managerQuery(evaluationQueryParams)); } @ApiOperation(value = "查看某一个商品的评价列表") @@ -66,7 +68,8 @@ public class MemberEvaluationBuyerController { @NotNull @PathVariable("goodsId") String goodsId) { //设置查询查询商品 evaluationQueryParams.setGoodsId(goodsId); - return ResultUtil.data(memberEvaluationService.queryByParams(evaluationQueryParams)); + evaluationQueryParams.setStatus(SwitchEnum.OPEN.name()); + return ResultUtil.data(memberEvaluationService.managerQuery(evaluationQueryParams)); } @ApiOperation(value = "查看某一个商品的评价数量") diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberSignBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/member/MemberSignBuyerController.java index f6c091ae..ea358e94 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberSignBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/member/MemberSignBuyerController.java @@ -1,12 +1,13 @@ package cn.lili.controller.member; -import cn.lili.common.utils.ResultUtil; +import cn.lili.cache.limit.annotation.LimitPoint; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.MemberSign; import cn.lili.modules.member.service.MemberSignService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -19,16 +20,17 @@ import java.util.List; * 会员签到控制器 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,会员签到API") @RequestMapping("/buyer/members/sign") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberSignBuyerController { + @Autowired + private MemberSignService memberSignService; - private final MemberSignService memberSignService; + @PreventDuplicateSubmissions @PostMapping @ApiOperation(value = "会员签到") public ResultMessage memberSign() { diff --git a/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java index 505407b8..7924f3ee 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/member/PointsHistoryBuyerController.java @@ -1,8 +1,8 @@ package cn.lili.controller.member; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.MemberPointsHistory; @@ -13,9 +13,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,15 +23,14 @@ import org.springframework.web.bind.annotation.RestController; * 买家端,会员积分历史接口 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "买家端,会员积分历史接口") @RequestMapping("/buyer/member/memberPointsHistory") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PointsHistoryBuyerController { - - private final MemberPointsHistoryService memberPointsHistoryService; + @Autowired + private MemberPointsHistoryService memberPointsHistoryService; @ApiOperation(value = "分页获取") @GetMapping(value = "/getByPage") @@ -39,7 +38,7 @@ public class PointsHistoryBuyerController { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(MemberPointsHistory::getMemberId, UserContext.getCurrentUser().getId()); - + queryWrapper.orderByDesc(MemberPointsHistory::getCreateTime); return ResultUtil.data(memberPointsHistoryService.page(PageUtil.initPage(page), queryWrapper)); } @@ -48,4 +47,6 @@ public class PointsHistoryBuyerController { public ResultMessage getMemberPointsHistoryVO() { return ResultUtil.data(memberPointsHistoryService.getMemberPointsHistoryVO(UserContext.getCurrentUser().getId())); } + + } diff --git a/buyer-api/src/main/java/cn/lili/controller/member/ServiceNoticeBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/member/ServiceNoticeBuyerController.java deleted file mode 100644 index 66b7c54a..00000000 --- a/buyer-api/src/main/java/cn/lili/controller/member/ServiceNoticeBuyerController.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.lili.controller.member; - -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.system.entity.dos.ServiceNotice; -import cn.lili.modules.system.service.ServiceNoticeService; -import com.baomidou.mybatisplus.core.metadata.IPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -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; - - -/** - * 买家端,会员站服务消息接口 - * - * @author Chopper - * @date: 2020/11/17 2:31 下午 - */ -@RestController -@RequestMapping("/service/notice") -@Api(tags = "买家端,会员站服务消息接口") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ServiceNoticeBuyerController { - - /** - * 服务消息 - */ - private final ServiceNoticeService serviceNoticeService; - - @ApiOperation(value = "获取消息详情") - @ApiImplicitParam(name = "id", value = "商品ID", required = true, dataType = "Long", paramType = "path") - @GetMapping(value = "/{id}") - public ResultMessage get(@PathVariable String id) { - ServiceNotice serviceNotice = serviceNoticeService.getById(id); - return ResultUtil.data(serviceNotice); - } - - @ApiOperation(value = "分页获取服务消息") - @GetMapping - @ApiImplicitParam(name = "storeId", value = "商家id,默认为-1,代表平台消息,如果查询某商家发布的消息,传递商家id即可", dataType = "int", paramType = "query") - public ResultMessage> getByPage(PageVO page, String storeId) { - ServiceNotice serviceNotice = new ServiceNotice(); - if (storeId == null) { - storeId = "-1"; - } - serviceNotice.setStoreId(storeId); - IPage data = serviceNoticeService.page(PageUtil.initPage(page)); - return ResultUtil.data(data); - } -} diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberMessageBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/message/MemberMessageBuyerController.java similarity index 58% rename from buyer-api/src/main/java/cn/lili/controller/member/MemberMessageBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/message/MemberMessageBuyerController.java index 58b5c15f..726b31f0 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberMessageBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/message/MemberMessageBuyerController.java @@ -1,17 +1,17 @@ -package cn.lili.controller.member; +package cn.lili.controller.message; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.message.entity.dos.MemberMessage; import cn.lili.modules.message.entity.enums.MessageStatusEnum; -import cn.lili.modules.member.entity.dos.MemberMessage; -import cn.lili.modules.member.entity.vo.MemberMessageQueryVO; -import cn.lili.modules.member.service.MemberMessageService; +import cn.lili.modules.message.entity.vos.MemberMessageQueryVO; +import cn.lili.modules.message.service.MemberMessageService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,37 +19,39 @@ import org.springframework.web.bind.annotation.*; * 买家端,会员站内消息接口 * * @author Bulbasaur - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,会员站内消息接口") -@RequestMapping("/buyer/member/message") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/message/member") public class MemberMessageBuyerController { /** * 会员站内消息 */ - private final MemberMessageService memberMessageService; + @Autowired + private MemberMessageService memberMessageService; @ApiOperation(value = "分页获取会员站内消息") @GetMapping public ResultMessage> page(MemberMessageQueryVO memberMessageQueryVO, PageVO page) { + memberMessageQueryVO.setMemberId(UserContext.getCurrentUser().getId()); return ResultUtil.data(memberMessageService.getPage(memberMessageQueryVO, page)); } @ApiOperation(value = "消息已读") @ApiImplicitParam(name = "messageId", value = "会员消息id", required = true, paramType = "path") - @PutMapping - public ResultMessage read(@PathVariable String messageId) { + @PutMapping("/{message_id}") + public ResultMessage read(@PathVariable("message_id") String messageId) { return ResultUtil.data(memberMessageService.editStatus(MessageStatusEnum.ALREADY_READY.name(), messageId)); } - @ApiOperation(value = "消息删除") + @ApiOperation(value = "消息放入回收站") @ApiImplicitParam(name = "messageId", value = "会员消息id", required = true, paramType = "path") - @DeleteMapping - public ResultMessage deleteMessage(@PathVariable String messageId) { - return ResultUtil.data(memberMessageService.deleteMessage(messageId)); + @DeleteMapping("/{message_id}") + public ResultMessage deleteMessage(@PathVariable("message_id") String messageId) { + return ResultUtil.data(memberMessageService.editStatus(MessageStatusEnum.ALREADY_REMOVE.name(), messageId)); + } diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/AfterSaleBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java similarity index 79% rename from buyer-api/src/main/java/cn/lili/controller/trade/AfterSaleBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java index 6f913497..4f4b8026 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/AfterSaleBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java @@ -1,24 +1,25 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.order.entity.dos.AfterSale; -import cn.lili.modules.order.order.entity.dos.AfterSaleReason; -import cn.lili.modules.order.order.entity.dto.AfterSaleDTO; -import cn.lili.modules.order.order.entity.vo.AfterSaleApplyVO; -import cn.lili.modules.order.order.entity.vo.AfterSaleSearchParams; -import cn.lili.modules.order.order.entity.vo.AfterSaleVO; -import cn.lili.modules.order.order.service.AfterSaleReasonService; -import cn.lili.modules.order.order.service.AfterSaleService; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason; +import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO; +import cn.lili.modules.order.aftersale.service.AfterSaleLogService; +import cn.lili.modules.order.aftersale.service.AfterSaleReasonService; +import cn.lili.modules.order.aftersale.service.AfterSaleService; import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; -import cn.lili.modules.order.trade.entity.dos.AfterSaleLog; -import cn.lili.modules.order.order.service.AfterSaleLogService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*; @@ -31,34 +32,35 @@ import java.util.List; * 买家端,售后管理接口 * * @author Chopper - * @date 2020/11/16 10:02 下午 + * @since 2020/11/16 10:02 下午 */ @RestController @Api(tags = "买家端,售后管理接口") -@RequestMapping("/buyer/afterSale") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/order/afterSale") public class AfterSaleBuyerController { /** * 售后 */ - private final AfterSaleService afterSaleService; - + @Autowired + private AfterSaleService afterSaleService; /** * 售后原因 */ - private final AfterSaleReasonService afterSaleReasonService; - + @Autowired + private AfterSaleReasonService afterSaleReasonService; /** * 售后日志 */ - private final AfterSaleLogService afterSaleLogService; + @Autowired + private AfterSaleLogService afterSaleLogService; @ApiOperation(value = "查看售后服务详情") @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") @GetMapping(value = "/get/{sn}") public ResultMessage get(@NotNull(message = "售后单号") @PathVariable("sn") String sn) { - return ResultUtil.data(afterSaleService.getAfterSale(sn)); + AfterSaleVO afterSale = OperationalJudgment.judgment(afterSaleService.getAfterSale(sn)); + return ResultUtil.data(afterSale); } @ApiOperation(value = "分页获取售后服务") @@ -73,9 +75,10 @@ public class AfterSaleBuyerController { }) @GetMapping(value = "/applyAfterSaleInfo/{sn}") public ResultMessage applyAfterSaleInfo(@PathVariable String sn) { - return ResultUtil.data(afterSaleService.getAfterSaleDTO(sn)); + return ResultUtil.data(afterSaleService.getAfterSaleVO(sn)); } + @PreventDuplicateSubmissions @PostMapping(value = "/save/{orderItemSn}") @ApiImplicitParam(name = "orderItemSn", value = "订单货物编号", required = true, paramType = "query") @ApiOperation(value = "申请售后") @@ -100,6 +103,7 @@ public class AfterSaleBuyerController { return ResultUtil.data(afterSaleService.buyerDelivery(afterSaleSn, logisticsNo, logisticsId, mDeliverTime)); } + @PreventDuplicateSubmissions @ApiOperation(value = "售后,取消售后") @ApiImplicitParams({ @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, dataType = "String", paramType = "path") diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/CartController.java b/buyer-api/src/main/java/cn/lili/controller/order/CartController.java similarity index 73% rename from buyer-api/src/main/java/cn/lili/controller/trade/CartController.java rename to buyer-api/src/main/java/cn/lili/controller/order/CartController.java index 22d2ea00..005a1c0c 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/CartController.java +++ b/buyer-api/src/main/java/cn/lili/controller/order/CartController.java @@ -1,8 +1,9 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; @@ -13,7 +14,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; @@ -26,19 +26,19 @@ import javax.validation.constraints.NotNull; * 买家端,购物车接口 * * @author Chopper - * @date 2020/11/16 10:04 下午 + * @since 2020/11/16 10:04 下午 */ @Slf4j @RestController @Api(tags = "买家端,购物车接口") @RequestMapping("/buyer/trade/carts") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CartController { /** * 购物车 */ - private final CartService cartService; + @Autowired + private CartService cartService; @ApiOperation(value = "向购物车中添加一个产品") @@ -51,8 +51,17 @@ public class CartController { public ResultMessage add(@NotNull(message = "产品id不能为空") String skuId, @NotNull(message = "购买数量不能为空") @Min(value = 1, message = "加入购物车数量必须大于0") Integer num, String cartType) { - cartService.add(skuId, num, cartType); - return ResultUtil.success(ResultCode.SUCCESS); + try { + //读取选中的列表 + cartService.add(skuId, num, cartType, false); + return ResultUtil.success(); + } catch (ServiceException se) { + log.info(se.getMsg(), se); + throw se; + } catch (Exception e) { + log.error(ResultCode.CART_ERROR.message(), e); + throw new ServiceException(ResultCode.CART_ERROR); + } } @@ -85,8 +94,8 @@ public class CartController { @PostMapping(value = "/sku/num/{skuId}") public ResultMessage update(@NotNull(message = "产品id不能为空") @PathVariable(name = "skuId") String skuId, Integer num) { - cartService.updateNum(skuId, num); - return ResultUtil.success(ResultCode.SUCCESS); + cartService.add(skuId, num, CartTypeEnum.CART.name(), true); + return ResultUtil.success(); } @@ -98,7 +107,7 @@ public class CartController { public ResultMessage updateChecked(@NotNull(message = "产品id不能为空") @PathVariable(name = "skuId") String skuId, boolean checked) { cartService.checked(skuId, checked); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @@ -106,7 +115,7 @@ public class CartController { @PostMapping(value = "/sku/checked", produces = MediaType.APPLICATION_JSON_VALUE) public ResultMessage updateAll(boolean checked) { cartService.checkedAll(checked); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @@ -119,7 +128,7 @@ public class CartController { @PostMapping(value = "/store/{storeId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResultMessage updateStoreAll(@NotNull(message = "卖家id不能为空") @PathVariable(name = "storeId") String storeId, boolean checked) { cartService.checkedStore(storeId, checked); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @@ -127,7 +136,7 @@ public class CartController { @DeleteMapping() public ResultMessage clean() { cartService.clean(); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @@ -138,7 +147,7 @@ public class CartController { @DeleteMapping(value = "/sku/remove") public ResultMessage delete(String[] skuIds) { cartService.delete(skuIds); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @@ -149,13 +158,14 @@ public class CartController { @GetMapping("/checked") public ResultMessage cartChecked(@NotNull(message = "读取选中列表") String way) { try { - // 读取选中的列表 + //读取选中的列表 return ResultUtil.data(this.cartService.getCheckedTradeDTO(CartTypeEnum.valueOf(way))); - } catch (ServiceException e) { - throw e; + } catch (ServiceException se) { + log.error(se.getMsg(), se); + throw se; } catch (Exception e) { log.error(ResultCode.CART_ERROR.message(), e); - return ResultUtil.error(ResultCode.CART_ERROR); + throw new ServiceException(ResultCode.CART_ERROR); } } @@ -169,13 +179,33 @@ public class CartController { String way) { try { cartService.shippingAddress(shippingAddressId, way); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } catch (ServiceException se) { log.error(ResultCode.SHIPPING_NOT_APPLY.message(), se); - return ResultUtil.error(ResultCode.SHIPPING_NOT_APPLY); + throw new ServiceException(ResultCode.SHIPPING_NOT_APPLY); } catch (Exception e) { log.error(ResultCode.CART_ERROR.message(), e); - return ResultUtil.error(ResultCode.CART_ERROR); + throw new ServiceException(ResultCode.CART_ERROR); + } + } + + @ApiOperation(value = "选择自提地址") + @ApiImplicitParams({ + @ApiImplicitParam(name = "storeAddressId", value = "自提地址id ", required = true, paramType = "query"), + @ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query") + }) + @GetMapping("/storeAddress") + public ResultMessage shippingSelfPickAddress(@NotNull(message = "自提地址ID不能为空") String storeAddressId, + String way) { + try { + cartService.shippingSelfAddress(storeAddressId, way); + return ResultUtil.success(); + } catch (ServiceException se) { + log.error(ResultCode.SHIPPING_NOT_APPLY.message(), se); + throw new ServiceException(ResultCode.SHIPPING_NOT_APPLY); + } catch (Exception e) { + log.error(ResultCode.CART_ERROR.message(), e); + throw new ServiceException(ResultCode.CART_ERROR); } } @@ -184,19 +214,35 @@ public class CartController { @ApiImplicitParam(name = "shippingMethod", value = "配送方式:SELF_PICK_UP(自提)," + "LOCAL_TOWN_DELIVERY(同城配送)," + "LOGISTICS(物流) ", required = true, paramType = "query"), - @ApiImplicitParam(name = "selleId", value = "店铺id", paramType = "query"), @ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query") }) - @GetMapping("/shippingMethod") + @PutMapping("/shippingMethod") public ResultMessage shippingMethod(@NotNull(message = "配送方式不能为空") String shippingMethod, - String selleId, String way) { try { - cartService.shippingMethod(selleId, shippingMethod, way); - return ResultUtil.success(ResultCode.SUCCESS); + cartService.shippingMethod( shippingMethod, way); + return ResultUtil.success(); + } catch (ServiceException se) { + log.error(se.getMsg(), se); + throw se; } catch (Exception e) { log.error(ResultCode.CART_ERROR.message(), e); - return ResultUtil.error(ResultCode.CART_ERROR); + throw new ServiceException(ResultCode.CART_ERROR); + } + } + + @ApiOperation(value = "获取用户可选择的物流方式") + @ApiImplicitParams({ + @ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query") + }) + @GetMapping("/shippingMethodList") + public ResultMessage shippingMethodList(String way) { + try { + return ResultUtil.data(cartService.shippingMethodList(way)); + } + catch (Exception e) { + e.printStackTrace(); + return ResultUtil.error(ResultCode.ERROR); } } @@ -207,7 +253,7 @@ public class CartController { @GetMapping("/select/receipt") public ResultMessage selectReceipt(String way, ReceiptVO receiptVO) { this.cartService.shippingReceipt(receiptVO, way); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "选择优惠券") @@ -219,22 +265,23 @@ public class CartController { @GetMapping("/select/coupon") public ResultMessage selectCoupon(String way, @NotNull(message = "优惠券id不能为空") String memberCouponId, boolean used) { this.cartService.selectCoupon(memberCouponId, way, used); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + @PreventDuplicateSubmissions @ApiOperation(value = "创建交易") @PostMapping(value = "/create/trade", consumes = "application/json", produces = "application/json") public ResultMessage crateTrade(@RequestBody TradeParams tradeParams) { try { - // 读取选中的列表 + //读取选中的列表 return ResultUtil.data(this.cartService.createTrade(tradeParams)); + } catch (ServiceException se) { + log.info(se.getMsg(), se); + throw se; } catch (Exception e) { log.error(ResultCode.ORDER_ERROR.message(), e); - if (e.getMessage().equals(ResultCode.SHIPPING_NOT_APPLY.message())) { - return ResultUtil.error(ResultCode.SHIPPING_NOT_APPLY); - } - return ResultUtil.error(ResultCode.ORDER_ERROR); + throw e; } } } diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/OrderBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/order/OrderBuyerController.java similarity index 70% rename from buyer-api/src/main/java/cn/lili/controller/trade/OrderBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/order/OrderBuyerController.java index 77c3958a..3e62ecc4 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/OrderBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/order/OrderBuyerController.java @@ -1,9 +1,12 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dto.OrderSearchParams; @@ -16,35 +19,35 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.util.Objects; /** * 买家端,订单接口 * * @author Chopper - * @date 2020/11/16 10:08 下午 + * @since 2020/11/16 10:08 下午 */ @RestController @Api(tags = "买家端,订单接口") -@RequestMapping("/buyer/orders") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/order/order") public class OrderBuyerController { /** * 订单 */ - private final OrderService orderService; + @Autowired + private OrderService orderService; @ApiOperation(value = "查询会员订单列表") @GetMapping public ResultMessage> queryMineOrder(OrderSearchParams orderSearchParams) { - AuthUser currentUser = UserContext.getCurrentUser(); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); orderSearchParams.setMemberId(currentUser.getId()); return ResultUtil.data(orderService.queryByParams(orderSearchParams)); } @@ -55,9 +58,12 @@ public class OrderBuyerController { }) @GetMapping(value = "/{orderSn}") public ResultMessage detail(@NotNull(message = "订单编号不能为空") @PathVariable("orderSn") String orderSn) { - return ResultUtil.data(orderService.queryDetail(orderSn)); + OrderDetailVO orderDetailVO = orderService.queryDetail(orderSn); + OperationalJudgment.judgment(orderDetailVO.getOrder()); + return ResultUtil.data(orderDetailVO); } + @PreventDuplicateSubmissions @ApiOperation(value = "确认收货") @ApiImplicitParams({ @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, paramType = "path") @@ -66,16 +72,17 @@ public class OrderBuyerController { public ResultMessage receiving(@NotNull(message = "订单编号不能为空") @PathVariable("orderSn") String orderSn) { Order order = orderService.getBySn(orderSn); if (order == null) { - return ResultUtil.error(ResultCode.ORDER_NOT_EXIST); + throw new ServiceException(ResultCode.ORDER_NOT_EXIST); } //判定是否是待收货状态 if (!order.getOrderStatus().equals(OrderStatusEnum.DELIVERED.name())) { - return ResultUtil.error(ResultCode.ORDER_DELIVERED_ERROR); + throw new ServiceException(ResultCode.ORDER_DELIVERED_ERROR); } orderService.complete(orderSn); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + @PreventDuplicateSubmissions @ApiOperation(value = "取消订单") @ApiImplicitParams({ @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path"), @@ -84,17 +91,19 @@ public class OrderBuyerController { @PostMapping(value = "/{orderSn}/cancel") public ResultMessage cancel(@ApiIgnore @PathVariable String orderSn, @RequestParam String reason) { orderService.cancel(orderSn, reason); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + @PreventDuplicateSubmissions @ApiOperation(value = "删除订单") @ApiImplicitParams({ @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") }) @DeleteMapping(value = "/{orderSn}") public ResultMessage deleteOrder(@PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); orderService.deleteOrder(orderSn); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "查询物流踪迹") @@ -103,18 +112,30 @@ public class OrderBuyerController { }) @PostMapping(value = "/getTraces/{orderSn}") public ResultMessage getTraces(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); return ResultUtil.data(orderService.getTraces(orderSn)); } + @ApiOperation(value = "查询地图版物流踪迹") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") + }) + @PostMapping(value = "/getMapTraces/{orderSn}") + public ResultMessage getMapTraces(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); + return ResultUtil.data(orderService.getMapTraces(orderSn)); + } + + @PreventDuplicateSubmissions @ApiOperation(value = "开票") @ApiImplicitParams({ @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") }) @PostMapping(value = "/receipt/{orderSn}") public ResultMessage invoice(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); return ResultUtil.data(orderService.invoice(orderSn)); } - } diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/OrderComplaintBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/order/OrderComplaintBuyerController.java similarity index 72% rename from buyer-api/src/main/java/cn/lili/controller/trade/OrderComplaintBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/order/OrderComplaintBuyerController.java index 482e7c89..1d26fef2 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/OrderComplaintBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/order/OrderComplaintBuyerController.java @@ -1,9 +1,10 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.OrderComplaint; @@ -19,11 +20,11 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.Objects; /** * 买家端,交易投诉接口 @@ -33,36 +34,40 @@ import javax.validation.Valid; **/ @RestController @Api(tags = "买家端,交易投诉接口") -@RequestMapping("/buyer/complain") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/order/complain") public class OrderComplaintBuyerController { /** * 交易投诉 */ - private final OrderComplaintService orderComplaintService; + @Autowired + private OrderComplaintService orderComplaintService; /** * 交易投诉沟通 */ - private final OrderComplaintCommunicationService orderComplaintCommunicationService; + @Autowired + private OrderComplaintCommunicationService orderComplaintCommunicationService; @ApiOperation(value = "通过id获取") @ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path") @GetMapping(value = "/{id}") public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(orderComplaintService.getOrderComplainById(id)); + OrderComplaintVO orderComplaintVO = OperationalJudgment.judgment(orderComplaintService.getOrderComplainById(id)); + return ResultUtil.data(orderComplaintVO); } @ApiOperation(value = "分页获取") @GetMapping public ResultMessage> get(OrderComplaintSearchParams searchParams, PageVO pageVO) { - searchParams.setMemberId(UserContext.getCurrentUser().getId()); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + searchParams.setMemberId(currentUser.getId()); return ResultUtil.data(orderComplaintService.getOrderComplainByPage(searchParams, pageVO)); } + @PreventDuplicateSubmissions @ApiOperation(value = "添加交易投诉") @PostMapping public ResultMessage add(@Valid OrderComplaintDTO orderComplaintDTO) { @@ -76,23 +81,19 @@ public class OrderComplaintBuyerController { }) @PostMapping("/communication") public ResultMessage addCommunication(@RequestParam String complainId, @RequestParam String content) { - AuthUser currentUser = UserContext.getCurrentUser(); - OrderComplaintCommunicationVO communicationVO = new OrderComplaintCommunicationVO(complainId, content, CommunicationOwnerEnum.BUYER.name(), currentUser.getId(), currentUser.getNickName()); - if (orderComplaintCommunicationService.addCommunication(communicationVO)) { - return ResultUtil.data(communicationVO); - - } - return ResultUtil.error(ResultCode.ERROR); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + OrderComplaintCommunicationVO communicationVO = new OrderComplaintCommunicationVO(complainId, content, CommunicationOwnerEnum.BUYER.name(), currentUser.getNickName(), currentUser.getId()); + orderComplaintCommunicationService.addCommunication(communicationVO); + return ResultUtil.data(communicationVO); } + @PreventDuplicateSubmissions @ApiOperation(value = "取消售后") @ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path") @PutMapping(value = "/status/{id}") public ResultMessage cancel(@PathVariable String id) { - if (orderComplaintService.cancel(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + orderComplaintService.cancel(id); + return ResultUtil.success(); } diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/ReceiptBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/order/ReceiptBuyerController.java similarity index 86% rename from buyer-api/src/main/java/cn/lili/controller/trade/ReceiptBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/order/ReceiptBuyerController.java index 000cf305..66253078 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/ReceiptBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/order/ReceiptBuyerController.java @@ -1,6 +1,7 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.Receipt; @@ -10,7 +11,6 @@ import cn.lili.modules.order.order.service.ReceiptService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -25,10 +25,10 @@ import javax.validation.Valid; @RestController @Api(tags = "买家端,发票接口") @RequestMapping("/buyer/trade/receipt") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ReceiptBuyerController { - private final ReceiptService receiptService; + @Autowired + private ReceiptService receiptService; @ApiOperation(value = "获取发票详情") @GetMapping("/{id}") @@ -42,6 +42,7 @@ public class ReceiptBuyerController { return ResultUtil.data(this.receiptService.getReceiptData(searchParams, pageVO)); } + @PreventDuplicateSubmissions @ApiOperation(value = "保存发票信息") @PostMapping public ResultMessage save(@Valid Receipt receipt) { diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/RechargeTradeBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/order/RechargeTradeBuyerController.java similarity index 61% rename from buyer-api/src/main/java/cn/lili/controller/trade/RechargeTradeBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/order/RechargeTradeBuyerController.java index cc98621c..7ea39171 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/RechargeTradeBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/order/RechargeTradeBuyerController.java @@ -1,16 +1,16 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.trade.entity.dos.Recharge; -import cn.lili.modules.order.trade.service.RechargeService; +import cn.lili.modules.wallet.entity.dos.Recharge; +import cn.lili.modules.wallet.service.RechargeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -22,23 +22,27 @@ import javax.validation.constraints.Min; * 买家端,预存款充值记录接口 * * @author paulG - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,预存款充值记录接口") @RequestMapping("/buyer/trade/recharge") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Validated public class RechargeTradeBuyerController { - private final RechargeService rechargeService; + @Autowired + private RechargeService rechargeService; + @PreventDuplicateSubmissions @PostMapping @ApiOperation(value = "创建余额充值订单") @ApiImplicitParams({ @ApiImplicitParam(name = "price", value = "充值金额", required = true, dataType = "double", paramType = "query") }) - public ResultMessage create(@Max(value = 10000, message = "充值金额单次最多允许充值10000元") @Min(value = 1, message = "充值金额单次最少充值金额为1元") Double price) { + public ResultMessage create( + @Max(value = 10000, message = "充值金额单次最多允许充值10000元") + @Min(value = 1, message = "充值金额单次最少充值金额为1元") + Double price) { Recharge recharge = this.rechargeService.recharge(price); return ResultUtil.data(recharge); } diff --git a/buyer-api/src/main/java/cn/lili/controller/other/AppVersionBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/other/AppVersionBuyerController.java new file mode 100644 index 00000000..ccf080ad --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/other/AppVersionBuyerController.java @@ -0,0 +1,50 @@ +package cn.lili.controller.other; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.system.entity.dos.AppVersion; +import cn.lili.modules.system.service.AppVersionService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +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; + +/** + * 买家端,APP版本 + * + * @author Bulbasaur + * @since 2021/5/21 11:15 上午 + */ +@RestController +@Api(tags = "买家端,APP版本") +@RequestMapping("/buyer/other/appVersion") +public class AppVersionBuyerController { + + @Autowired + private AppVersionService appVersionService; + + + @ApiOperation(value = "获取版本号") + @ApiImplicitParam(name = "appType", value = "app类型", required = true, paramType = "path") + @GetMapping("/{appType}") + public ResultMessage getAppVersion(@PathVariable String appType) { + return ResultUtil.data(appVersionService.getAppVersion(appType)); + } + + @ApiOperation(value = "获取版本号列表") + @ApiImplicitParam(name = "appType", value = "app类型", required = true, paramType = "path") + @GetMapping("/appVersion/{appType}") + public ResultMessage> appVersion(@PathVariable String appType, PageVO pageVO) { + + IPage page = appVersionService.page(PageUtil.initPage(pageVO), new LambdaQueryWrapper().eq(AppVersion::getType, appType)); + return ResultUtil.data(page); + } +} diff --git a/buyer-api/src/main/java/cn/lili/controller/other/ArticleBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/other/ArticleBuyerController.java index d3591e59..1142e47e 100644 --- a/buyer-api/src/main/java/cn/lili/controller/other/ArticleBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/other/ArticleBuyerController.java @@ -1,6 +1,6 @@ package cn.lili.controller.other; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.Article; import cn.lili.modules.page.entity.dto.ArticleSearchParams; @@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -26,23 +25,24 @@ import java.util.List; * 买家端,文章接口 * * @author Chopper - * @date: 2020/11/16 10:02 下午 + * @since 2020/11/16 10:02 下午 */ @RestController @Api(tags = "买家端,文章接口") -@RequestMapping("/buyer/article") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/other/article") public class ArticleBuyerController { /** * 文章 */ - private final ArticleService articleService; + @Autowired + private ArticleService articleService; /** * 文章分类 */ - private final ArticleCategoryService articleCategoryService; + @Autowired + private ArticleCategoryService articleCategoryService; @ApiOperation(value = "获取文章分类列表") @GetMapping(value = "/articleCategory/list") diff --git a/buyer-api/src/main/java/cn/lili/controller/other/FeedbackBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/other/FeedbackBuyerController.java index 9d1243ba..cb79f43a 100644 --- a/buyer-api/src/main/java/cn/lili/controller/other/FeedbackBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/other/FeedbackBuyerController.java @@ -1,44 +1,44 @@ package cn.lili.controller.other; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.Feedback; import cn.lili.modules.page.service.FeedbackService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.validation.Valid; + /** * 买家端,意见反馈接口 * * @author Bulbasaur - * @date 2020-05-5 15:10:16 + * @since 2020-05-5 15:10:16 */ @RestController @Api(tags = "买家端,意见反馈接口") -@RequestMapping("/buyer/feedback") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/other/feedback") public class FeedbackBuyerController { /** * 意见反馈 */ - private final FeedbackService feedbackService; + @Autowired + private FeedbackService feedbackService; + @PreventDuplicateSubmissions @ApiOperation(value = "添加意见反馈") @PostMapping() - public ResultMessage save(Feedback feedback) { + public ResultMessage save(@Valid Feedback feedback) { feedback.setUserName(UserContext.getCurrentUser().getNickName()); - if (feedbackService.save(feedback)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + feedbackService.save(feedback); + return ResultUtil.success(); } } diff --git a/buyer-api/src/main/java/cn/lili/controller/other/LogisticsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/other/LogisticsBuyerController.java index 2e1c3010..b44aabd5 100644 --- a/buyer-api/src/main/java/cn/lili/controller/other/LogisticsBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/other/LogisticsBuyerController.java @@ -1,12 +1,11 @@ package cn.lili.controller.other; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.system.entity.dos.Logistics; import cn.lili.modules.system.service.LogisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -18,15 +17,15 @@ import java.util.List; * 买家端,物流公司接口 * * @author Bulbasaur - * @date 2020-05-5 15:10:16 + * @since 2020-05-5 15:10:16 */ @RestController @Api(tags = "买家端,物流公司接口") -@RequestMapping("/buyer/logistics") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/other/logistics") public class LogisticsBuyerController { - private final LogisticsService logisticsService; + @Autowired + private LogisticsService logisticsService; @ApiOperation(value = "分页获取物流公司") diff --git a/buyer-api/src/main/java/cn/lili/controller/other/PageBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/other/PageBuyerController.java index 0e424d96..419fb77a 100644 --- a/buyer-api/src/main/java/cn/lili/controller/other/PageBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/other/PageBuyerController.java @@ -1,48 +1,98 @@ package cn.lili.controller.other; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.page.entity.dos.PageData; import cn.lili.modules.page.entity.dto.PageDataDTO; import cn.lili.modules.page.entity.enums.PageEnum; import cn.lili.modules.page.entity.vos.PageDataVO; import cn.lili.modules.page.service.PageDataService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 买家端,页面接口 * * @author Chopper - * @date 2020/11/16 10:08 下午 + * @since 2020/11/16 10:08 下午 */ @RestController @Api(tags = "买家端,页面接口") -@RequestMapping("/buyer/pageData") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/other/pageData") public class PageBuyerController { /** * 页面管理 */ - private final PageDataService pageService; + @Autowired + private PageDataService pageService; @ApiOperation(value = "获取首页数据") @GetMapping("/getIndex") public ResultMessage getIndex(@RequestParam String clientType) { PageDataDTO pageDataDTO = new PageDataDTO(PageEnum.INDEX.name()); pageDataDTO.setPageClientType(clientType); - return ResultUtil.data(pageService.getPageData(pageDataDTO)); + PageDataVO pageDataVO=pageService.getPageData(pageDataDTO); + return ResultUtil.data(pageDataVO); } @ApiOperation(value = "获取页面数据") @GetMapping public ResultMessage get(PageDataDTO pageDataDTO) { - return ResultUtil.data(pageService.getPageData(pageDataDTO)); + PageDataVO pageDataVO=pageService.getPageData(pageDataDTO); + return ResultUtil.data(pageDataVO); + } + + @ApiOperation(value = "获取店铺首页") + @GetMapping("/getStore") + public ResultMessage getShopPage(@RequestParam String clientType,String storeId) { + PageDataDTO pageDataDTO = new PageDataDTO(PageEnum.STORE.name()); + pageDataDTO.setPageClientType(clientType); + pageDataDTO.setNum(storeId); + PageDataVO pageDataVO=pageService.getPageData(pageDataDTO); + return ResultUtil.data(pageDataVO); + } + + @ApiOperation(value = "获取页面数据") + @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "String", paramType = "path") + @GetMapping("/get/{id}") + public ResultMessage getPage(@PathVariable("id") String id) { + return ResultUtil.data(pageService.getSpecial(id)); + } + + @ApiOperation(value = "获取专题页面数据(根据消息内容得知)") + @GetMapping("/getSpecial") + public ResultMessage getSpecial(@RequestParam String body) { + String name = ""; + if (body.indexOf("』") >= 0 && body.indexOf("『") >= 0) { + name = body.substring(body.indexOf("『") + 1, body.lastIndexOf("』")); + } else if (body.indexOf("〉") >= 0 && body.indexOf("〈") >= 0) { + name = body.substring(body.indexOf("〈") + 1, body.lastIndexOf("〉")); + } else if (body.indexOf("」") >= 0 && body.indexOf("「") >= 0) { + name = body.substring(body.indexOf("「") + 1, body.lastIndexOf("」")); + } else if (body.indexOf("》") >= 0 && body.indexOf("《") >= 0) { + name = body.substring(body.indexOf("《") + 1, body.lastIndexOf("》")); + } else if (body.indexOf(")") >= 0 && body.indexOf("(") >= 0) { + name = body.substring(body.indexOf("(") + 1, body.lastIndexOf(")")); + } else if (body.indexOf("】") >= 0 && body.indexOf("【") >= 0) { + name = body.substring(body.indexOf("【") + 1, body.lastIndexOf("】")); + } else if (body.indexOf("}") >= 0 && body.indexOf("{") >= 0) { + name = body.substring(body.indexOf("{") + 1, body.lastIndexOf("}")); + } else if (body.indexOf("!") >= 0) { + name = body.substring(body.indexOf("!") + 1, body.lastIndexOf("!")); + } else if (body.indexOf("|") >= 0) { + name = body.substring(body.indexOf("|") + 1, body.lastIndexOf("|")); + } + + PageData pageData = pageService.getOne( + new LambdaQueryWrapper() + .eq(PageData::getPageType, PageEnum.SPECIAL.name()) + .eq(PageData::getName, name)); + return ResultUtil.data(pageData); + } } diff --git a/buyer-api/src/main/java/cn/lili/controller/other/broadcast/StudioController.java b/buyer-api/src/main/java/cn/lili/controller/other/broadcast/StudioController.java new file mode 100644 index 00000000..1c03c9e9 --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/other/broadcast/StudioController.java @@ -0,0 +1,48 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.goods.entity.vos.StudioVO; +import cn.lili.modules.goods.service.StudioService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 买家端,直播间接口 + * + * @author Bulbasaur + * @since 2021/5/20 12:03 下午 + */ +@RestController +@Api(tags = "买家端,直播间接口") +@RequestMapping("/buyer/broadcast/studio") +public class StudioController { + + @Autowired + private StudioService studioService; + + @ApiOperation(value = "获取店铺直播间列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "recommend", value = "是否推荐", paramType = "query", dataType = "int"), + @ApiImplicitParam(name = "status", value = "直播间状态", paramType = "query", dataType = "String") + }) + @GetMapping + public ResultMessage> page(PageVO pageVO, Integer recommend, String status) { + return ResultUtil.data(studioService.studioList(pageVO, recommend, status)); + } + + @ApiOperation(value = "获取店铺直播间回放地址") + @GetMapping("/getLiveInfo/{roomId}") + public ResultMessage getLiveInfo(Integer roomId) { + return ResultUtil.data(studioService.getLiveInfo(roomId)); + } + +} diff --git a/buyer-api/src/main/java/cn/lili/controller/purchase/PurchaseBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/other/purchase/PurchaseBuyerController.java similarity index 68% rename from buyer-api/src/main/java/cn/lili/controller/purchase/PurchaseBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/other/purchase/PurchaseBuyerController.java index 05bea31a..58e6b1b2 100644 --- a/buyer-api/src/main/java/cn/lili/controller/purchase/PurchaseBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/other/purchase/PurchaseBuyerController.java @@ -1,18 +1,22 @@ -package cn.lili.controller.purchase; +package cn.lili.controller.other.purchase; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.goods.entity.dos.GoodsUnit; +import cn.lili.modules.goods.service.GoodsUnitService; import cn.lili.modules.purchase.entity.dos.PurchaseOrder; import cn.lili.modules.purchase.entity.params.PurchaseOrderSearchParams; import cn.lili.modules.purchase.entity.vos.PurchaseOrderVO; import cn.lili.modules.purchase.service.PurchaseOrderService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,22 +26,34 @@ import javax.validation.constraints.NotNull; * 买家端,采购接口 * * @author Chopper - * @date: 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ @Api(tags = "买家端,采购接口") @RestController -@RequestMapping("/buyer/purchase") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/other/purchase/purchase") public class PurchaseBuyerController { /** * 采购单 */ - private final PurchaseOrderService purchaseOrderService; + @Autowired + private PurchaseOrderService purchaseOrderService; + @Autowired + private GoodsUnitService goodsUnitService; + + + @ApiOperation(value = "分页获取商品计量单位") + @GetMapping("/goodsUnit") + public ResultMessage> goodsUnitPage(PageVO pageVO) { + return ResultUtil.data(goodsUnitService.page(PageUtil.initPage(pageVO))); + } + + + @PreventDuplicateSubmissions @ApiOperation(value = "添加采购单") @PostMapping - public ResultMessage addPurchaseOrderVO(PurchaseOrderVO purchaseOrderVO) { + public ResultMessage addPurchaseOrderVO(@RequestBody PurchaseOrderVO purchaseOrderVO) { return ResultUtil.data(purchaseOrderService.addPurchaseOrder(purchaseOrderVO)); } @@ -61,15 +77,13 @@ public class PurchaseBuyerController { return ResultUtil.data(purchaseOrderService.page(purchaseOrderSearchParams)); } + @PreventDuplicateSubmissions @ApiOperation(value = "关闭采购单") @ApiImplicitParam(name = "id", value = "采购单ID", required = true, dataType = "Long", paramType = "path") @PutMapping("/{id}") public ResultMessage close(@NotNull @PathVariable String id) { - - if (purchaseOrderService.close(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + purchaseOrderService.close(id); + return ResultUtil.success(ResultCode.SUCCESS); } } diff --git a/buyer-api/src/main/java/cn/lili/controller/purchase/PurchaseQuotedController.java b/buyer-api/src/main/java/cn/lili/controller/other/purchase/PurchaseQuotedController.java similarity index 64% rename from buyer-api/src/main/java/cn/lili/controller/purchase/PurchaseQuotedController.java rename to buyer-api/src/main/java/cn/lili/controller/other/purchase/PurchaseQuotedController.java index 3642a66f..1bc03ae7 100644 --- a/buyer-api/src/main/java/cn/lili/controller/purchase/PurchaseQuotedController.java +++ b/buyer-api/src/main/java/cn/lili/controller/other/purchase/PurchaseQuotedController.java @@ -1,14 +1,18 @@ -package cn.lili.controller.purchase; +package cn.lili.controller.other.purchase; -import cn.lili.common.utils.ResultUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.purchase.entity.dos.PurchaseOrder; import cn.lili.modules.purchase.entity.dos.PurchaseQuoted; import cn.lili.modules.purchase.entity.vos.PurchaseQuotedVO; +import cn.lili.modules.purchase.service.PurchaseOrderService; import cn.lili.modules.purchase.service.PurchaseQuotedService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,22 +23,31 @@ import java.util.List; * 买家端,采购报价接口 * * @author Bulbasaur - * @date: 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ @Api(tags = "买家端,采购报价接口") @RestController -@RequestMapping("/buyer/purchaseQuoted") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/other/purchase/purchaseQuoted") public class PurchaseQuotedController { /** * 采购单报价 */ - private final PurchaseQuotedService purchaseQuotedService; + @Autowired + private PurchaseQuotedService purchaseQuotedService; + /** + * 采购单 + */ + @Autowired + private PurchaseOrderService purchaseOrderService; @ApiOperation(value = "添加采购单报价") @PostMapping - public ResultMessage addPurchaseOrderVO(PurchaseQuotedVO purchaseQuotedVO) { + public ResultMessage addPurchaseOrderVO(@RequestBody PurchaseQuotedVO purchaseQuotedVO) { + PurchaseOrder purchaseOrder=purchaseOrderService.getById(purchaseQuotedVO.getPurchaseOrderId()); + if(DateUtil.compare(purchaseOrder.getDeadline(),new DateTime())< 0){ + ResultUtil.error(ResultCode.PURCHASE_ORDER_DEADLINE_ERROR); + } return ResultUtil.data(purchaseQuotedService.addPurchaseQuoted(purchaseQuotedVO)); } diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java index ecee45fa..8615bf34 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java @@ -1,44 +1,122 @@ package cn.lili.controller.passport; import cn.lili.common.enums.ResultCode; -import cn.lili.common.sms.SmsUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.verification.enums.VerificationEnums; -import cn.lili.common.verification.service.VerificationService; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dto.MemberEditDTO; +import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum; +import cn.lili.modules.member.entity.vo.QRLoginResultVo; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.sms.SmsUtil; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; import javax.validation.constraints.NotNull; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + /** * 买家端,会员接口 * * @author Chopper - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ +@Slf4j @RestController @Api(tags = "买家端,会员接口") -@RequestMapping("/buyer/members") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/passport/member") public class MemberBuyerController { + @Autowired + private MemberService memberService; + @Autowired + private SmsUtil smsUtil; + @Autowired + private VerificationService verificationService; + + + @ApiOperation(value = "web-获取登录二维码") + @PostMapping(value = "/pc_session", produces = "application/json;charset=UTF-8") + public ResultMessage createPcSession() { + return ResultUtil.data(memberService.createPcSession()); + } + + /** - * 会员 + * 长轮询:参考nacos + * + * @param token + * @param beforeSessionStatus 上次记录的session状态 + * @return */ - private final MemberService memberService; + @ApiOperation(value = "web-二维码登录") + @PostMapping(value = "/session_login/{token}", produces = "application/json;charset=UTF-8") + public Object loginWithSession(@PathVariable("token") String token, Integer beforeSessionStatus) { + log.info("receive login with session key {}", token); + ResponseEntity> timeoutResponseEntity = + new ResponseEntity<>(ResultUtil.error(ResultCode.ERROR), HttpStatus.OK); + int timeoutSecond = 20; + DeferredResult> deferredResult = new DeferredResult<>(timeoutSecond * 1000L, timeoutResponseEntity); + CompletableFuture.runAsync(() -> { + try { + int i = 0; + while (i < timeoutSecond) { + QRLoginResultVo queryResult = memberService.loginWithSession(token); + int status = queryResult.getStatus(); + if (status == beforeSessionStatus + && (QRCodeLoginSessionStatusEnum.WAIT_SCANNING.getCode() == status + || QRCodeLoginSessionStatusEnum.SCANNING.getCode() == status)) { + //睡眠一秒种,继续等待结果 + TimeUnit.SECONDS.sleep(1); + } else { + deferredResult.setResult(new ResponseEntity<>(ResultUtil.data(queryResult), HttpStatus.OK)); + break; + } + i++; + } + } catch (Exception e) { + log.error("获取登录状态异常,", e); + deferredResult.setResult(new ResponseEntity<>(ResultUtil.error(ResultCode.ERROR), HttpStatus.OK)); + Thread.currentThread().interrupt(); + } + }, Executors.newCachedThreadPool()); + return deferredResult; + } - private final SmsUtil smsUtil; + @ApiOperation(value = "app扫码") + @PostMapping(value = "/app_scanner", produces = "application/json;charset=UTF-8") + public ResultMessage appScanner(String token) { + return ResultUtil.data(memberService.appScanner(token)); + } - private final VerificationService verificationService; + + @ApiOperation(value = "app扫码-登录确认:同意/拒绝") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "sessionToken", required = true, paramType = "query"), + @ApiImplicitParam(name = "code", value = "操作:0拒绝登录,1同意登录", required = true, paramType = "query") + }) + @PostMapping(value = "/app_confirm", produces = "application/json;charset=UTF-8") + public ResultMessage appSConfirm(String token, Integer code) { + boolean flag = memberService.appSConfirm(token, code); + return flag ? ResultUtil.success() : ResultUtil.error(ResultCode.ERROR); + } @ApiOperation(value = "登录接口") @@ -50,11 +128,15 @@ public class MemberBuyerController { public ResultMessage userLogin(@NotNull(message = "用户名不能为空") @RequestParam String username, @NotNull(message = "密码不能为空") @RequestParam String password, @RequestHeader String uuid) { - if (verificationService.check(uuid, VerificationEnums.LOGIN)) { - return ResultUtil.data(this.memberService.usernameLogin(username, password)); - } else { - return ResultUtil.error(ResultCode.VERIFICATION_ERROR); - } + verificationService.check(uuid, VerificationEnums.LOGIN); + return ResultUtil.data(this.memberService.usernameLogin(username, password)); + } + + @ApiOperation(value = "注销接口") + @PostMapping("/logout") + public ResultMessage logout() { + this.memberService.logout(UserEnums.MEMBER); + return ResultUtil.success(); } @ApiOperation(value = "短信登录接口") @@ -66,11 +148,11 @@ public class MemberBuyerController { public ResultMessage smsLogin(@NotNull(message = "手机号为空") @RequestParam String mobile, @NotNull(message = "验证码为空") @RequestParam String code, @RequestHeader String uuid) { -// if(smsUtil.verifyCode(mobile,VerificationEnums.LOGIN,uuid,code)){ - return ResultUtil.data(memberService.mobilePhoneLogin(mobile)); -// }else { -// return ResultUtil.error("验证码错误"); -// } + if (smsUtil.verifyCode(mobile, VerificationEnums.LOGIN, uuid, code)) { + return ResultUtil.data(memberService.mobilePhoneLogin(mobile)); + } else { + throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR); + } } @ApiOperation(value = "注册用户") @@ -87,12 +169,12 @@ public class MemberBuyerController { @RequestHeader String uuid, @NotNull(message = "验证码不能为空") @RequestParam String code) { - boolean result = smsUtil.verifyCode(mobilePhone, VerificationEnums.REGISTER, uuid, code); - if (result) { + if (smsUtil.verifyCode(mobilePhone, VerificationEnums.REGISTER, uuid, code)) { return ResultUtil.data(memberService.register(username, password, mobilePhone)); } else { - return ResultUtil.error(ResultCode.VERIFICATION_SMS_ERROR); + throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR); } + } @ApiOperation(value = "获取当前登录用户接口") @@ -114,16 +196,15 @@ public class MemberBuyerController { //校验短信验证码是否正确 if (smsUtil.verifyCode(mobile, VerificationEnums.FIND_USER, uuid, code)) { //校验是否通过手机号可获取会员,存在则将会员信息存入缓存,有效时间3分钟 - if (memberService.findByMobile(uuid, mobile)) { - return ResultUtil.success(ResultCode.SUCCESS); - } + memberService.findByMobile(uuid, mobile); + return ResultUtil.success(); + } else { + throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR); } - return ResultUtil.error(ResultCode.VERIFICATION_ERROR); } @ApiOperation(value = "修改密码") @ApiImplicitParams({ - @ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"), @ApiImplicitParam(name = "password", value = "是否保存登录", required = true, paramType = "query") }) @PostMapping("/resetPassword") @@ -150,6 +231,34 @@ public class MemberBuyerController { return ResultUtil.data(memberService.modifyPass(password, newPassword)); } + @ApiOperation(value = "初始设置密码") + @ApiImplicitParams({ + @ApiImplicitParam(name = "newPassword", value = "新密码", required = true, paramType = "query") + }) + @PutMapping("/canInitPassword") + public ResultMessage canInitPassword() { + return ResultUtil.data(memberService.canInitPass()); + } + + @ApiOperation(value = "初始设置密码") + @ApiImplicitParams({ + @ApiImplicitParam(name = "newPassword", value = "新密码", required = true, paramType = "query") + }) + @PutMapping("/initPassword") + public ResultMessage initPassword(@NotNull(message = "密码不能为空") @RequestParam String password) { + memberService.initPass(password); + return ResultUtil.success(); + } + + @ApiOperation(value = "注销账号") + @ApiImplicitParams({ + @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query") + }) + @PutMapping("/cancellation") + public ResultMessage cancellation(@NotNull(message = "密码不能为空") @RequestParam String password) { + memberService.cancellation(password); + return ResultUtil.success(); + } @ApiOperation(value = "刷新token") @GetMapping("/refresh/{refreshToken}") @@ -157,4 +266,18 @@ public class MemberBuyerController { return ResultUtil.data(this.memberService.refreshToken(refreshToken)); } + @GetMapping("/getImUser") + @ApiOperation(value = "获取用户信息") + public ResultMessage getImUser() { + AuthUser authUser = UserContext.getCurrentUser(); + return ResultUtil.data(memberService.getById(authUser.getId())); + } + + @GetMapping("/getImUserDetail/{memberId}") + @ApiImplicitParam(name = "memberId", value = "店铺Id", required = true, dataType = "String", paramType = "path") + @ApiOperation(value = "获取用户信息") + public ResultMessage getImUserDetail(@PathVariable String memberId) { + return ResultUtil.data(memberService.getById(memberId)); + } + } diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerBindController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerBindController.java index 4e357676..9a2675ae 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerBindController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerBindController.java @@ -1,14 +1,13 @@ package cn.lili.controller.passport.connect; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.connect.service.ConnectService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -18,15 +17,15 @@ import java.util.List; * 买家端,app/小程序 联合登录 * * @author Chopper - * @date 2020-11-25 19:29 + * @since 2020-11-25 19:29 */ @RestController @Api(tags = "买家端,app/小程序 联合登录") -@RequestMapping("/buyer/connect/bind") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/passport/connect/bind") public class ConnectBuyerBindController { - private final ConnectService connectService; + @Autowired + private ConnectService connectService; @ApiOperation(value = "unionID 绑定") @ApiImplicitParams({ diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java index 99588b3b..bbe988ea 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java @@ -2,24 +2,26 @@ package cn.lili.controller.passport.connect; import cn.lili.common.enums.ResultCode; -import cn.lili.common.token.Token; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.token.Token; +import cn.lili.common.utils.UuidUtils; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.connect.entity.dto.AuthCallback; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.request.AuthRequest; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.connect.util.ConnectUtil; -import cn.lili.modules.connect.util.UuidUtils; import cn.lili.modules.member.service.MemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -27,23 +29,25 @@ import java.io.IOException; * 买家端,web联合登录 * * @author Chopper - * @date 2020-11-25 19:29 */ +@Slf4j @RestController @Api(tags = "买家端,web联合登录") -@RequestMapping("/buyer/connect") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/passport/connect/connect") public class ConnectBuyerWebController { - private final ConnectService connectService; + @Autowired + private ConnectService connectService; - private final MemberService memberService; + @Autowired + private MemberService memberService; - private final ConnectUtil connectUtil; + @Autowired + private ConnectUtil connectUtil; @GetMapping("/login/web/{type}") - @ApiOperation(value = "WEB信任登录授权") + @ApiOperation(value = "WEB信任登录授权,包含PC、WAP") @ApiImplicitParams({ @ApiImplicitParam(name = "type", value = "登录方式:QQ,微信,微信_PC", allowableValues = "QQ,WECHAT,WECHAT_PC", paramType = "path") @@ -58,39 +62,27 @@ public class ConnectBuyerWebController { @ApiOperation(value = "信任登录统一回调地址", hidden = true) @GetMapping("/callback/{type}") - public void callBack(@PathVariable String type, AuthCallback callback, HttpServletResponse httpServletResponse) throws IOException { - connectUtil.callback(type, callback, httpServletResponse); + public void callBack(@PathVariable String type, AuthCallback callback, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { + connectUtil.callback(type, callback, httpServletRequest, httpServletResponse); } @ApiOperation(value = "信任登录响应结果获取") @GetMapping("/result") public ResultMessage callBackResult(String state) { if (state == null) { - return ResultUtil.error(ResultCode.USER_CONNECT_LOGIN_ERROR); + throw new ServiceException(ResultCode.USER_CONNECT_LOGIN_ERROR); } return connectUtil.getResult(state); } - @GetMapping("/register/auto") - @ApiOperation(value = "WEB信任登录授权") - public ResultMessage webAuthorize() { - Token token = memberService.autoRegister(); - return ResultUtil.data(token); - } - - @ApiOperation(value = "unionID登录") - @ApiImplicitParams({ - @ApiImplicitParam(name = "openId", value = "openid", required = true, paramType = "query"), - @ApiImplicitParam(name = "type", value = "联合类型", required = true, - allowableValues = "WECHAT,QQ,ALIPAY,WEIBO,APPLE", paramType = "query"), - @ApiImplicitParam(name = "uniAccessToken", value = "联合登陆返回的accessToken", required = true, paramType = "query") - }) + @ApiOperation(value = "APP-unionID登录") @GetMapping("/app/login") - public ResultMessage unionIDLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) { + public ResultMessage unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) { try { - return ResultUtil.data(connectService.appLoginCallback(authUser, uuid)); + return ResultUtil.data(connectService.unionLoginCallback(authUser, uuid)); } catch (Exception e) { e.printStackTrace(); + log.error("unionID登录错误", e); } return null; } diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/MiniProgramBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/MiniProgramBuyerController.java index 2feadb82..a3c1a6a0 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/MiniProgramBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/MiniProgramBuyerController.java @@ -1,17 +1,16 @@ package cn.lili.controller.passport.connect; -import cn.lili.common.token.Token; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.token.Token; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.connect.entity.dto.WechatMPLoginParams; import cn.lili.modules.connect.service.ConnectService; -import cn.lili.modules.message.entity.dos.WechatMPMessage; import cn.lili.modules.message.service.ShortLinkService; -import cn.lili.modules.message.service.WechatMPMessageService; -import cn.lili.modules.message.util.WechatMpCodeUtil; +import cn.lili.modules.wechat.entity.dos.WechatMPMessage; +import cn.lili.modules.wechat.service.WechatMPMessageService; +import cn.lili.modules.wechat.util.WechatMpCodeUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; @@ -24,19 +23,22 @@ import java.util.List; * 买家端,小程序登录接口 * * @author Chopper - * @date 2021/2/19 09:28 + * @since 2021/2/19 09:28 */ @RestController -@RequestMapping("/buyer/mini-program") +@RequestMapping("/buyer/passport/connect/miniProgram") @Api(tags = "买家端,小程序登录接口") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MiniProgramBuyerController { - public final ConnectService connectService; - public final WechatMpCodeUtil wechatMpCodeUtil; - - public final WechatMPMessageService wechatMPMessageService; - public final ShortLinkService shortLinkService; + @Autowired + public ConnectService connectService; + @Autowired + public WechatMpCodeUtil wechatMpCodeUtil; + @SuppressWarnings("AlibabaLowerCamelCaseVariableNaming") + @Autowired + public WechatMPMessageService wechatMPMessageService; + @Autowired + public ShortLinkService shortLinkService; @GetMapping("/auto-login") @ApiOperation(value = "小程序自动登录") diff --git a/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java b/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java index 683b2c82..217afeee 100644 --- a/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java +++ b/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java @@ -1,19 +1,19 @@ package cn.lili.controller.payment; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.payment.kit.CashierSupport; import cn.lili.modules.payment.kit.dto.PayParam; -import cn.lili.modules.payment.kit.enums.PaymentClientEnum; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.modules.payment.entity.enums.PaymentClientEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.params.dto.CashierParam; -import cn.lili.modules.payment.service.PaymentService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -25,18 +25,16 @@ import javax.servlet.http.HttpServletResponse; * 买家端,收银台接口 * * @author Chopper - * @date 2020-12-18 16:59 + * @since 2020-12-18 16:59 */ +@Slf4j @RestController @Api(tags = "买家端,收银台接口") -@RequestMapping("/buyer/cashier") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/payment/cashier") public class CashierController { - - private final CashierSupport cashierSupport; - - private final PaymentService paymentService; + @Autowired + private CashierSupport cashierSupport; @ApiImplicitParams({ @@ -67,8 +65,11 @@ public class CashierController { try { return cashierSupport.payment(paymentMethodEnum, paymentClientEnum, request, response, payParam); + } catch (ServiceException se) { + log.info("支付异常", se); + throw se; } catch (Exception e) { - e.printStackTrace(); + log.error("收银台支付错误", e); } return null; diff --git a/buyer-api/src/main/java/cn/lili/controller/payment/CashierRefundController.java b/buyer-api/src/main/java/cn/lili/controller/payment/CashierRefundController.java index 3dbb41ff..f4b382e9 100644 --- a/buyer-api/src/main/java/cn/lili/controller/payment/CashierRefundController.java +++ b/buyer-api/src/main/java/cn/lili/controller/payment/CashierRefundController.java @@ -1,10 +1,9 @@ package cn.lili.controller.payment; import cn.lili.modules.payment.kit.RefundSupport; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,16 +16,15 @@ import javax.servlet.http.HttpServletRequest; * 买家端,退款回调 * * @author Chopper - * @date 2020-12-18 16:59 + * @since 2020-12-18 16:59 */ @Api(tags = "买家端,退款回调") @RestController -@RequestMapping("/buyer/cashier/refund") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/payment/cashierRefund") public class CashierRefundController { - - private final RefundSupport refundSupport; + @Autowired + private RefundSupport refundSupport; @ApiOperation(value = "退款通知") diff --git a/buyer-api/src/main/java/cn/lili/controller/member/CouponBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java similarity index 54% rename from buyer-api/src/main/java/cn/lili/controller/member/CouponBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java index eb132dc4..e505cb58 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/CouponBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java @@ -1,13 +1,20 @@ -package cn.lili.controller.member; +package cn.lili.controller.promotion; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.CouponActivityTrigger; +import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams; +import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; +import cn.lili.modules.promotion.entity.enums.CouponGetEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.entity.vos.CouponVO; +import cn.lili.modules.promotion.service.CouponActivityService; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.MemberCouponService; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -15,7 +22,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -23,47 +29,72 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Objects; /** * 买家端,买家优惠券接口 * * @author paulG - * @date 2020/11/17 3:35 下午 + * @since 2020/11/17 3:35 下午 */ @RestController @Api(tags = "买家端,买家优惠券接口") @RequestMapping("/buyer/promotion/coupon") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CouponBuyerController { /** * 优惠券 */ - private final CouponService couponService; + @Autowired + private CouponService couponService; + + /** + * 优惠券活动 + */ + @Autowired + private CouponActivityService couponActivityService; /** * 会员优惠券 */ - private final MemberCouponService memberCouponService; + @Autowired + private MemberCouponService memberCouponService; + + @GetMapping("/activity") + @ApiOperation(value = "自动领取优惠券") + public ResultMessage> activity() { + return ResultUtil.data(couponActivityService.trigger( + CouponActivityTrigger.builder() + .couponActivityTypeEnum(CouponActivityTypeEnum.AUTO_COUPON) + .nickName(UserContext.getCurrentUser().getNickName()) + .userId(UserContext.getCurrentUser().getId()) + .build()) + ); + } @GetMapping @ApiOperation(value = "获取可领取优惠券列表") public ResultMessage> getCouponList(CouponSearchParams queryParam, PageVO page) { - IPage canUseCoupons = couponService.getCanReceiveCoupons(queryParam, page); + queryParam.setPromotionStatus(PromotionsStatusEnum.START.name()); + queryParam.setGetType(CouponGetEnum.FREE.name()); + IPage canUseCoupons = couponService.pageVOFindAll(queryParam, page); return ResultUtil.data(canUseCoupons); } @ApiOperation(value = "获取当前会员的优惠券列表") @GetMapping("/getCoupons") - public ResultMessage> getCoupons(CouponSearchParams param, PageVO pageVo) { - param.setMemberId(UserContext.getCurrentUser().getId()); + public ResultMessage> getCoupons(MemberCouponSearchParams param, PageVO pageVo) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + param.setMemberId(currentUser.getId()); return ResultUtil.data(memberCouponService.getMemberCoupons(param, pageVo)); } @ApiOperation(value = "获取当前会员的对于当前商品可使用的优惠券列表") @GetMapping("/canUse") - public ResultMessage> getCouponsByCanUse(CouponSearchParams param, Double totalPrice, PageVO pageVo) { - param.setMemberId(UserContext.getCurrentUser().getId()); + public ResultMessage> getCouponsByCanUse(MemberCouponSearchParams param, Double totalPrice, PageVO pageVo) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + param.setMemberId(currentUser.getId()); return ResultUtil.data(memberCouponService.getMemberCouponsByCanUse(param, totalPrice, pageVo)); } @@ -79,9 +110,9 @@ public class CouponBuyerController { }) @GetMapping("/receive/{couponId}") public ResultMessage receiveCoupon(@NotNull(message = "优惠券ID不能为空") @PathVariable("couponId") String couponId) { - memberCouponService.checkCouponLimit(couponId, UserContext.getCurrentUser().getId()); - memberCouponService.receiveCoupon(couponId, UserContext.getCurrentUser().getId(), UserContext.getCurrentUser().getNickName()); - return ResultUtil.success(ResultCode.SUCCESS); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + memberCouponService.receiveBuyerCoupon(couponId, currentUser.getId(), currentUser.getNickName()); + return ResultUtil.success(); } @ApiOperation(value = "通过id获取") @@ -90,7 +121,7 @@ public class CouponBuyerController { }) @GetMapping(value = "/get/{id}") public ResultMessage get(@NotNull(message = "优惠券ID不能为空") @PathVariable("id") String id) { - MemberCoupon memberCoupon = memberCouponService.getById(id); + MemberCoupon memberCoupon = OperationalJudgment.judgment(memberCouponService.getById(id)); return ResultUtil.data(memberCoupon); } diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/KanjiaGoodsActivityBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/KanjiaGoodsActivityBuyerController.java new file mode 100644 index 00000000..5fcf7832 --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/KanjiaGoodsActivityBuyerController.java @@ -0,0 +1,113 @@ +package cn.lili.controller.promotion; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.search.KanJiaActivityLogQuery; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityGoodsParams; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityQuery; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityLogService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 买家端,砍价活动商品 + * + * @author qiuqiu + * @date 2021/7/12 + **/ +@RestController +@Api(tags = "买家端,砍价商品接口") +@RequestMapping("/buyer/promotion/kanjiaGoods") +public class KanjiaGoodsActivityBuyerController { + + /** + * 砍价活动商品 + */ + @Autowired + private KanjiaActivityGoodsService kanJiaActivityGoodsService; + /** + * 帮砍记录 + */ + @Autowired + private KanjiaActivityLogService kanJiaActivityLogService; + /** + * 砍价活动 + */ + @Autowired + private KanjiaActivityService kanJiaActivityService; + + @GetMapping + @ApiOperation(value = "分页获取砍价商品") + public ResultMessage> kanjiaActivityGoodsPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO page) { + // 会员端查询到的肯定是已经开始的活动商品 + kanjiaActivityGoodsParams.setPromotionStatus(PromotionsStatusEnum.START.name()); +// kanjiaActivityGoodsParams.setStartTime(System.currentTimeMillis()); +// kanjiaActivityGoodsParams.setEndTime(System.currentTimeMillis()); + return ResultUtil.data(kanJiaActivityGoodsService.kanjiaGoodsVOPage(kanjiaActivityGoodsParams, page)); + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取砍价活动商品") + @ApiImplicitParam(name = "id", value = "砍价活动商品ID", required = true, paramType = "path") + public ResultMessage getKanjiaActivityGoods(@PathVariable String id) { + return ResultUtil.data(kanJiaActivityGoodsService.getKanJiaGoodsVO(id)); + } + + @GetMapping("/getKanjiaActivity/logs") + @ApiOperation(value = "分页获取砍价活动-帮砍记录") + public ResultMessage> getKanjiaActivityLog(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO page) { + return ResultUtil.data(kanJiaActivityLogService.getForPage(kanJiaActivityLogQuery, page)); + } + + @PostMapping("/getKanjiaActivity") + @ApiOperation(value = "获取砍价活动") + public ResultMessage getKanJiaActivity(KanjiaActivitySearchParams kanjiaActivitySearchParams) { + //如果是非被邀请关系则填写会员ID + if (CharSequenceUtil.isEmpty(kanjiaActivitySearchParams.getKanjiaActivityId())) { + kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId()); + } + return ResultUtil.data(kanJiaActivityService.getKanjiaActivityVO(kanjiaActivitySearchParams)); + } + + @PostMapping + @ApiImplicitParam(name = "id", value = "砍价活动商品ID", required = true, paramType = "path") + @ApiOperation(value = "发起砍价活动") + public ResultMessage launchKanJiaActivity(String id) { + KanjiaActivityLog kanjiaActivityLog = kanJiaActivityService.add(id); + return ResultUtil.data(kanjiaActivityLog); + } + + @PostMapping("/help/{kanjiaActivityId}") + @ApiImplicitParam(name = "kanJiaActivityId", value = "砍价活动ID", required = true, paramType = "path") + @ApiOperation(value = "帮砍一刀") + public ResultMessage helpKanJia(@PathVariable String kanjiaActivityId) { + KanjiaActivityLog kanjiaActivityLog = kanJiaActivityService.helpKanJia(kanjiaActivityId); + return ResultUtil.data(kanjiaActivityLog); + } + + @GetMapping("/kanjiaActivity/mine/") + @ApiOperation(value = "分页获取已参与的砍价活动") + public ResultMessage> getPointsGoodsPage(KanjiaActivityQuery kanjiaActivityQuery, PageVO page) { + // 会员端查询到的肯定是已经开始的活动商品 + kanjiaActivityQuery.setMemberId(UserContext.getCurrentUser().getId()); + IPage kanjiaActivity = kanJiaActivityService.getForPage(kanjiaActivityQuery, page); + return ResultUtil.data(kanjiaActivity); + } + +} diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/PintuanBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/PintuanBuyerController.java index 9d8fb447..62e928c8 100644 --- a/buyer-api/src/main/java/cn/lili/controller/promotion/PintuanBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/PintuanBuyerController.java @@ -1,21 +1,19 @@ package cn.lili.controller.promotion; -import cn.hutool.core.date.DateUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.entity.vos.PintuanMemberVO; import cn.lili.modules.promotion.entity.vos.PintuanShareVO; -import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; import cn.lili.modules.promotion.service.PintuanService; import cn.lili.modules.promotion.service.PromotionGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -28,28 +26,26 @@ import java.util.List; * 买家端,拼团接口 * * @author paulG - * @date 2021/2/20 + * @since 2021/2/20 **/ @Api(tags = "买家端,拼团接口") @RestController @RequestMapping("/buyer/promotion/pintuan") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PintuanBuyerController { - - private final PromotionGoodsService promotionGoodsService; - - private final PintuanService pintuanService; + @Autowired + private PromotionGoodsService promotionGoodsService; + @Autowired + private PintuanService pintuanService; @ApiOperation(value = "获取拼团商品") @GetMapping - public ResultMessage> getPintuanCategory(String goodsName, String categoryPath, PageVO pageVo) { + public ResultMessage> getPintuanCategory(String goodsName, String categoryPath, PageVO pageVo) { PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); searchParams.setGoodsName(goodsName); searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name()); - searchParams.setPromotionStatus(PromotionStatusEnum.START.name()); + searchParams.setPromotionStatus(PromotionsStatusEnum.START.name()); searchParams.setCategoryPath(categoryPath); - searchParams.setEndTime(DateUtil.date().getTime()); - return ResultUtil.data(promotionGoodsService.getPromotionGoods(searchParams, pageVo)); + return ResultUtil.data(promotionGoodsService.pageFindAll(searchParams, pageVo)); } diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java index f2ee1753..08932f1f 100644 --- a/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/PointsGoodsBuyerController.java @@ -1,19 +1,22 @@ package cn.lili.controller.promotion; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.promotion.entity.dos.PointsGoods; import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory; -import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams; +import cn.lili.modules.promotion.entity.dto.search.PointsGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.service.PointsGoodsCategoryService; import cn.lili.modules.promotion.service.PointsGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; 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; @@ -21,22 +24,22 @@ import org.springframework.web.bind.annotation.RestController; * 买家端,积分商品接口 * * @author paulG - * @date 2021/1/19 + * @since 2021/1/19 **/ @RestController @Api(tags = "买家端,积分商品接口") @RequestMapping("/buyer/promotion/pointsGoods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PointsGoodsBuyerController { - - private final PointsGoodsService pointsGoodsService; - - private final PointsGoodsCategoryService pointsGoodsCategoryService; + @Autowired + private PointsGoodsService pointsGoodsService; + @Autowired + private PointsGoodsCategoryService pointsGoodsCategoryService; @GetMapping @ApiOperation(value = "分页获取积分商品") - public ResultMessage> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) { - IPage pointsGoodsByPage = pointsGoodsService.getPointsGoodsByPage(searchParams, page); + public ResultMessage> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) { + searchParams.setPromotionStatus(PromotionsStatusEnum.START.name()); + IPage pointsGoodsByPage = pointsGoodsService.pageFindAll(searchParams, page); return ResultUtil.data(pointsGoodsByPage); } @@ -46,4 +49,11 @@ public class PointsGoodsBuyerController { return ResultUtil.data(pointsGoodsCategoryService.getCategoryByPage(name, page)); } + @GetMapping("/{id}") + @ApiOperation(value = "获取积分活动商品") + @ApiImplicitParam(name = "id", value = "积分商品ID", required = true, paramType = "path") + public ResultMessage getPointsGoodsPage(@PathVariable String id) { + return ResultUtil.data(pointsGoodsService.getPointsGoodsDetail(id)); + } + } diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java index 059c3514..7a64747d 100644 --- a/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java @@ -1,13 +1,12 @@ package cn.lili.controller.promotion; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.vos.SeckillGoodsVO; import cn.lili.modules.promotion.entity.vos.SeckillTimelineVO; import cn.lili.modules.promotion.service.SeckillApplyService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -18,29 +17,29 @@ import java.util.List; /** - * 买家端,限时抢购接口 + * 买家端,秒杀活动接口 * * @author paulG - * @date 2020/11/17 2:30 下午 + * @since 2020/11/17 2:30 下午 */ -@Api(tags = "买家端,限时抢购接口") +@Api(tags = "买家端,秒杀活动接口") @RestController @RequestMapping("/buyer/promotion/seckill") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SeckillBuyerController { /** - * 限时抢购 + * 秒杀活动 */ - private final SeckillApplyService seckillApplyService; + @Autowired + private SeckillApplyService seckillApplyService; - @ApiOperation(value = "获取当天限时抢购信息") + @ApiOperation(value = "获取当天秒杀活动信息") @GetMapping public ResultMessage> getSeckillTime() { return ResultUtil.data(seckillApplyService.getSeckillTimeline()); } - @ApiOperation(value = "获取某个时刻的限时抢购商品信息") + @ApiOperation(value = "获取某个时刻的秒杀活动商品信息") @GetMapping("/{timeline}") public ResultMessage> getSeckillGoods(@PathVariable Integer timeline) { return ResultUtil.data(seckillApplyService.getSeckillGoods(timeline)); diff --git a/buyer-api/src/main/java/cn/lili/controller/store/StoreAddressBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/store/StoreAddressBuyerController.java new file mode 100644 index 00000000..a51acdf4 --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/store/StoreAddressBuyerController.java @@ -0,0 +1,53 @@ +package cn.lili.controller.store; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.store.entity.dos.StoreAddress; +import cn.lili.modules.store.service.StoreAddressService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +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.Objects; + +/** + * 买家端,商家地址(自提点)接口 + * + * @author chc + * @since 2022/6/2114:46 + */ +@RestController +@Api(tags = "买家端,商家地址(自提点)接口") +@RequestMapping("/buyer/store/address") +public class StoreAddressBuyerController { + + /** + * 店铺自提点 + */ + @Autowired + private StoreAddressService storeAddressService; + + @ApiOperation(value = "获取商家自提点分页") + @ApiImplicitParam(name = "storeId", value = "店铺Id", required = true, dataType = "String", paramType = "path") + @GetMapping("/page/{storeId}") + public ResultMessage> get(PageVO pageVo,@PathVariable String storeId) { + return ResultUtil.data(storeAddressService.getStoreAddress(storeId, pageVo)); + } + + @ApiOperation(value = "获取商家自提点信息") + @ApiImplicitParam(name = "id", value = "自提点ID", required = true, paramType = "path") + @GetMapping("/{id}") + public ResultMessage get(@PathVariable String id) { + StoreAddress address = OperationalJudgment.judgment(storeAddressService.getById(id)); + return ResultUtil.data(address); + } +} diff --git a/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java index 5289e4d5..35bdfbd2 100644 --- a/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java @@ -1,25 +1,24 @@ package cn.lili.controller.store; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.aop.PageViewPoint; -import cn.lili.modules.statistics.aop.enums.PageViewEnum; +import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO; +import cn.lili.modules.goods.service.StoreGoodsLabelService; +import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dto.StoreBankDTO; import cn.lili.modules.store.entity.dto.StoreCompanyDTO; import cn.lili.modules.store.entity.dto.StoreOtherInfoDTO; import cn.lili.modules.store.entity.vos.*; import cn.lili.modules.store.service.StoreDetailService; -import cn.lili.modules.store.service.StoreGoodsLabelService; import cn.lili.modules.store.service.StoreService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -31,26 +30,28 @@ import java.util.List; * 买家端,店铺接口 * * @author Bulbasaur - * @date: 2020/11/17 2:32 下午 + * @since 2020/11/17 2:32 下午 */ @RestController -@RequestMapping("/buyer/store") +@RequestMapping("/buyer/store/store") @Api(tags = "买家端,店铺接口") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreBuyerController { /** * 店铺 */ - private final StoreService storeService; + @Autowired + private StoreService storeService; /** * 店铺商品分类 */ - private final StoreGoodsLabelService storeGoodsLabelService; + @Autowired + private StoreGoodsLabelService storeGoodsLabelService; /** * 店铺详情 */ - private final StoreDetailService storeDetailService; + @Autowired + private StoreDetailService storeDetailService; @ApiOperation(value = "获取店铺列表分页") @GetMapping @@ -58,14 +59,34 @@ public class StoreBuyerController { return ResultUtil.data(storeService.findByConditionPage(entity, page)); } + @GetMapping("/store") + @ApiOperation(value = "im-获取店铺信息") + public ResultMessage getStoreUser() { + AuthUser authUser = UserContext.getCurrentUser(); + return ResultUtil.data(storeService.getById(authUser.getStoreId())); + } + + @GetMapping("/store/{storeId}") + @ApiImplicitParam(name = "storeId", value = "店铺Id", required = true, dataType = "String", paramType = "path") + @ApiOperation(value = "im-店铺ID获取店铺信息") + public ResultMessage getStoreUserDetail(@PathVariable String storeId) { + return ResultUtil.data(storeService.getById(storeId)); + } + @ApiOperation(value = "通过id获取店铺信息") @ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path") @GetMapping(value = "/get/detail/{id}") - @PageViewPoint(type = PageViewEnum.STORE, id = "#id") public ResultMessage detail(@NotNull @PathVariable String id) { return ResultUtil.data(storeDetailService.getStoreBasicInfoDTO(id)); } + @ApiOperation(value = "通过id获取店铺详细信息-营业执照") + @ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path") + @GetMapping(value = "/get/licencePhoto/{id}") + public ResultMessage licencePhoto(@NotNull @PathVariable String id) { + return ResultUtil.data(storeDetailService.getStoreOtherVO(id)); + } + @ApiOperation(value = "通过id获取店铺商品分类") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path") @@ -78,28 +99,22 @@ public class StoreBuyerController { @ApiOperation(value = "申请店铺第一步-填写企业信息") @PutMapping(value = "/apply/first") public ResultMessage applyFirstStep(StoreCompanyDTO storeCompanyDTO) { - if (storeService.applyFirstStep(storeCompanyDTO)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + storeService.applyFirstStep(storeCompanyDTO); + return ResultUtil.success(); } @ApiOperation(value = "申请店铺第二步-填写银行信息") @PutMapping(value = "/apply/second") public ResultMessage applyFirstStep(StoreBankDTO storeBankDTO) { - if (storeService.applySecondStep(storeBankDTO)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + storeService.applySecondStep(storeBankDTO); + return ResultUtil.success(); } @ApiOperation(value = "申请店铺第三步-填写其他信息") @PutMapping(value = "/apply/third") public ResultMessage applyFirstStep(StoreOtherInfoDTO storeOtherInfoDTO) { - if (storeService.applyThirdStep(storeOtherInfoDTO)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + storeService.applyThirdStep(storeOtherInfoDTO); + return ResultUtil.success(); } @ApiOperation(value = "获取当前登录会员的店铺信息-入驻店铺") diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberReceiptController.java b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberReceiptController.java similarity index 86% rename from buyer-api/src/main/java/cn/lili/controller/member/MemberReceiptController.java rename to buyer-api/src/main/java/cn/lili/controller/wallet/MemberReceiptController.java index 6894b899..08cec9d4 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberReceiptController.java +++ b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberReceiptController.java @@ -1,8 +1,9 @@ -package cn.lili.controller.member; +package cn.lili.controller.wallet; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.vo.MemberReceiptAddVO; @@ -11,7 +12,6 @@ import cn.lili.modules.member.service.MemberReceiptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,15 +20,15 @@ import org.springframework.web.bind.annotation.*; * 买家端,会员发票接口 * * @author paulG - * @date: 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ @RestController @Api(tags = "买家端,会员发票接口") -@RequestMapping("/buyer/member/receipt") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/wallet/receipt") public class MemberReceiptController { - private final MemberReceiptService memberReceiptService; + @Autowired + private MemberReceiptService memberReceiptService; @ApiOperation(value = "查询会员发票列表") @GetMapping @@ -36,6 +36,7 @@ public class MemberReceiptController { return ResultUtil.data(memberReceiptService.getPage(memberReceiptVO, page)); } + @PreventDuplicateSubmissions @ApiOperation(value = "新增会员发票") @PostMapping public ResultMessage add(MemberReceiptAddVO memberReceiptAddVO) { diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberWalletBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWalletBuyerController.java similarity index 63% rename from buyer-api/src/main/java/cn/lili/controller/member/MemberWalletBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/wallet/MemberWalletBuyerController.java index 10c21c7b..bfd38145 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberWalletBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWalletBuyerController.java @@ -1,56 +1,68 @@ -package cn.lili.controller.member; +package cn.lili.controller.wallet; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.verification.enums.VerificationEnums; -import cn.lili.common.verification.service.VerificationService; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.entity.dos.MemberWallet; -import cn.lili.modules.member.entity.vo.MemberWalletVO; import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.member.service.MemberWalletService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.WithdrawalSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.entity.vo.WithdrawalSettingVO; +import cn.lili.modules.system.service.SettingService; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; +import cn.lili.modules.wallet.entity.dos.MemberWallet; +import cn.lili.modules.wallet.entity.vo.MemberWalletVO; +import cn.lili.modules.wallet.service.MemberWalletService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.gson.Gson; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.Max; -import javax.validation.constraints.Min; import javax.validation.constraints.Pattern; /** * 买家端,会员余额接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,会员余额接口") -@RequestMapping("/buyer/members/wallet") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/wallet/wallet") +@Validated public class MemberWalletBuyerController { /** * 会员 */ - private final MemberService memberService; + @Autowired + private MemberService memberService; /** * 会员余额 */ - private final MemberWalletService memberWalletService; + @Autowired + private MemberWalletService memberWalletService; /** * 验证码 */ - private final VerificationService verificationService; + @Autowired + private VerificationService verificationService; + + @Autowired + private SettingService settingService; @GetMapping @ApiOperation(value = "查询会员预存款余额") @@ -62,6 +74,31 @@ public class MemberWalletBuyerController { throw new ServiceException(ResultCode.USER_NOT_LOGIN); } + @GetMapping(value = "/withdrawalSettingVO") + @ApiOperation(value = "获取提现设置VO") + public ResultMessage minPrice() { + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()); + WithdrawalSetting withdrawalSetting = new Gson().fromJson(setting.getSettingValue(), WithdrawalSetting.class); + + WithdrawalSettingVO withdrawalSettingVO = new WithdrawalSettingVO(); + withdrawalSettingVO.setMinPrice(withdrawalSetting.getMinPrice()); + withdrawalSettingVO.setFee(withdrawalSetting.getFee()); + withdrawalSettingVO.setType(withdrawalSetting.getType()); + return ResultUtil.data(withdrawalSettingVO); + } + + @PreventDuplicateSubmissions + @PostMapping(value = "/withdrawal") + @ApiOperation(value = "会员中心余额提现") + @ApiImplicitParams({ + @ApiImplicitParam(name = "price", value = "提现金额", required = true, dataType = "double", paramType = "query"), + @ApiImplicitParam(name = "realName", value = "真实姓名", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "connectNumber", value = "第三方登录账号", required = true, dataType = "String", paramType = "query") + }) + public ResultMessage withdrawal(@Max(value = 9999, message = "充值金额单次最多允许提现9999元") Double price, @RequestParam String realName, @RequestParam String connectNumber) { + return ResultUtil.data(memberWalletService.applyWithdrawal(price, realName, connectNumber)); + } + @PostMapping(value = "/set-password") @ApiOperation(value = "设置支付密码") @ApiImplicitParams({ @@ -77,9 +114,9 @@ public class MemberWalletBuyerController { //校验验证码 if (verificationService.check(uuid, VerificationEnums.WALLET_PASSWORD)) { memberWalletService.setMemberWalletPassword(member, password); - return ResultUtil.error(ResultCode.SUCCESS); + throw new ServiceException(ResultCode.SUCCESS); } else { - return ResultUtil.error(ResultCode.VERIFICATION_ERROR); + throw new ServiceException(ResultCode.VERIFICATION_ERROR); } } @@ -106,8 +143,9 @@ public class MemberWalletBuyerController { } this.memberWalletService.setMemberWalletPassword(member, newPassword); return ResultUtil.data("修改成功"); + } else { + throw new ServiceException(ResultCode.WALLET_NOT_EXIT_ERROR); } - throw new ServiceException(ResultCode.ERROR); } @@ -117,14 +155,4 @@ public class MemberWalletBuyerController { return memberWalletService.checkPassword(); } - - @PostMapping(value = "/withdrawal") - @ApiOperation(value = "会员中心余额提现") - @ApiImplicitParams({ - @ApiImplicitParam(name = "price", value = "提现金额", required = true, dataType = "double", paramType = "query") - }) - public ResultMessage withdrawal(@Max(value = 1000, message = "充值金额单次最多允许提现1000元") @Min(value = 1, message = "充值金额单次最少提现金额为1元") Double price) { - return ResultUtil.data(memberWalletService.applyWithdrawal(price)); - } - } diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberWithdrawApplyBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWithdrawApplyBuyerController.java similarity index 51% rename from buyer-api/src/main/java/cn/lili/controller/member/MemberWithdrawApplyBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/wallet/MemberWithdrawApplyBuyerController.java index 6ed9adec..a1418808 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberWithdrawApplyBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/wallet/MemberWithdrawApplyBuyerController.java @@ -1,36 +1,34 @@ -package cn.lili.controller.member; +package cn.lili.controller.wallet; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.member.entity.dos.MemberWithdrawApply; -import cn.lili.modules.member.entity.vo.MemberWithdrawApplyQueryVO; -import cn.lili.modules.member.service.MemberWithdrawApplyService; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.vo.MemberWithdrawApplyQueryVO; +import cn.lili.modules.wallet.service.MemberWithdrawApplyService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 买家端,余额提现记录接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,余额提现记录接口") @RequestMapping("/buyer/member/withdrawApply") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberWithdrawApplyBuyerController { - - private final MemberWithdrawApplyService memberWithdrawApplyService; + @Autowired + private MemberWithdrawApplyService memberWithdrawApplyService; @ApiOperation(value = "分页获取提现记录") @@ -38,8 +36,8 @@ public class MemberWithdrawApplyBuyerController { public ResultMessage> getByPage(PageVO page, MemberWithdrawApplyQueryVO memberWithdrawApplyQueryVO) { memberWithdrawApplyQueryVO.setMemberId(UserContext.getCurrentUser().getId()); //构建查询 返回数据 - IPage memberWithdrawApplyIPage = memberWithdrawApplyService.getMemberWithdrawPage(page, memberWithdrawApplyQueryVO); - return ResultUtil.data(memberWithdrawApplyIPage); + IPage memberWithdrawApplyPage = memberWithdrawApplyService.getMemberWithdrawPage(page, memberWithdrawApplyQueryVO); + return ResultUtil.data(memberWithdrawApplyPage); } } diff --git a/buyer-api/src/main/java/cn/lili/controller/member/RechargeBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/wallet/RechargeBuyerController.java similarity index 73% rename from buyer-api/src/main/java/cn/lili/controller/member/RechargeBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/wallet/RechargeBuyerController.java index dd7987ae..7a73cde7 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/RechargeBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/wallet/RechargeBuyerController.java @@ -1,18 +1,16 @@ -package cn.lili.controller.member; +package cn.lili.controller.wallet; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.trade.entity.dos.Recharge; import cn.lili.modules.order.trade.entity.vo.RechargeQueryVO; -import cn.lili.modules.order.trade.service.RechargeService; +import cn.lili.modules.wallet.entity.dos.Recharge; +import cn.lili.modules.wallet.service.RechargeService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,13 +19,11 @@ import org.springframework.web.bind.annotation.RestController; * 买家端,预存款充值记录接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,预存款充值记录接口") -@RequestMapping("/buyer/member/recharge") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/buyer/wallet/recharge") public class RechargeBuyerController { @Autowired diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/WalletLogBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/wallet/WalletLogBuyerController.java similarity index 71% rename from buyer-api/src/main/java/cn/lili/controller/trade/WalletLogBuyerController.java rename to buyer-api/src/main/java/cn/lili/controller/wallet/WalletLogBuyerController.java index 0b7f7eca..676301fe 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/WalletLogBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/wallet/WalletLogBuyerController.java @@ -1,18 +1,17 @@ -package cn.lili.controller.trade; +package cn.lili.controller.wallet; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.trade.entity.dos.WalletLog; -import cn.lili.modules.order.trade.service.WalletLogService; +import cn.lili.modules.wallet.entity.dos.WalletLog; +import cn.lili.modules.wallet.service.WalletLogService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,15 +21,15 @@ import org.springframework.web.bind.annotation.RestController; * 买家端,预存款变动日志记录接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "买家端,预存款变动日志记录接口") @RequestMapping("/buyer/wallet/log") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WalletLogBuyerController { - private final WalletLogService walletLogService; + @Autowired + private WalletLogService walletLogService; @ApiOperation(value = "分页获取预存款变动日志") @GetMapping @@ -38,7 +37,8 @@ public class WalletLogBuyerController { //获取当前登录用户 AuthUser authUser = UserContext.getCurrentUser(); //构建查询 返回数据 - IPage depositLogPage = walletLogService.page(PageUtil.initPage(page), new QueryWrapper().eq("member_id", authUser.getId())); + IPage depositLogPage = walletLogService.page(PageUtil.initPage(page), + new QueryWrapper().eq("member_id", authUser.getId()).orderByDesc("create_time")); return ResultUtil.data(depositLogPage); } } diff --git a/buyer-api/src/main/java/cn/lili/init/EsGoodsIndexInitRunner.java b/buyer-api/src/main/java/cn/lili/init/EsGoodsIndexInitRunner.java new file mode 100644 index 00000000..8b3e9952 --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/init/EsGoodsIndexInitRunner.java @@ -0,0 +1,30 @@ +package cn.lili.init; + +import cn.lili.modules.search.service.EsGoodsIndexService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +/** + * @author paulG + * @since 2022/6/9 + **/ +@Component +@Slf4j +public class EsGoodsIndexInitRunner implements ApplicationRunner { + + @Autowired + private EsGoodsIndexService esGoodsIndexService; + + + @Override + public void run(ApplicationArguments args) { + try { + esGoodsIndexService.initIndex(); + } catch (Exception e) { + log.error("检测ES商品索引失败", e); + } + } +} diff --git a/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java b/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java index 6aa98c77..7d81a2f8 100644 --- a/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java +++ b/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java @@ -1,18 +1,19 @@ package cn.lili.security; import cn.hutool.core.util.StrUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.security.AuthUser; import cn.lili.common.security.enums.SecurityEnum; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.token.SecretKeyUtil; +import cn.lili.common.security.token.SecretKeyUtil; import cn.lili.common.utils.ResponseUtil; import com.google.gson.Gson; import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.GrantedAuthority; @@ -34,8 +35,7 @@ import java.util.List; * * @author Chopper * @version v4.1 - * @date 2020/11/17 3:37 下午 - * @Description: + * @since 2020/11/17 3:37 下午 * @since */ @Slf4j @@ -45,7 +45,8 @@ public class BuyerAuthenticationFilter extends BasicAuthenticationFilter { /** * 缓存 */ - private final Cache cache; + @Autowired + private Cache cache; /** * 自定义构造器 @@ -65,7 +66,7 @@ public class BuyerAuthenticationFilter extends BasicAuthenticationFilter { //从header中获取jwt String jwt = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); try { - // 如果没有token 则return + //如果没有token 则return if (StrUtil.isBlank(jwt)) { chain.doFilter(request, response); return; @@ -97,8 +98,8 @@ public class BuyerAuthenticationFilter extends BasicAuthenticationFilter { String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString(); AuthUser authUser = new Gson().fromJson(json, AuthUser.class); - // 校验redis中是否有权限 - if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + jwt)) { + //校验redis中是否有权限 + if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER,authUser.getId()) + jwt)) { //构造返回信息 List auths = new ArrayList<>(); auths.add(new SimpleGrantedAuthority("ROLE_" + authUser.getRole().name())); diff --git a/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java b/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java index eda49b97..8ba35de5 100644 --- a/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java +++ b/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java @@ -1,10 +1,9 @@ package cn.lili.security; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; import cn.lili.common.security.CustomAccessDeniedHandler; import cn.lili.common.utils.SpringContextUtil; -import cn.lili.config.properties.IgnoredUrlsProperties; -import lombok.RequiredArgsConstructor; +import cn.lili.common.properties.IgnoredUrlsProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -20,65 +19,63 @@ import org.springframework.web.cors.CorsConfigurationSource; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/14 16:20 */ @Slf4j @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class BuyerSecurityConfig extends WebSecurityConfigurerAdapter { /** * 忽略验权配置 */ - private final IgnoredUrlsProperties ignoredUrlsProperties; - - + @Autowired + private IgnoredUrlsProperties ignoredUrlsProperties; /** * spring security -》 权限不足处理 */ - private final CustomAccessDeniedHandler accessDeniedHandler; + @Autowired + private CustomAccessDeniedHandler accessDeniedHandler; - - private final Cache cache; + @Autowired + private Cache cache; @Override protected void configure(HttpSecurity http) throws Exception { ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = http .authorizeRequests(); - // 配置的url 不需要授权 + //配置的url 不需要授权 for (String url : ignoredUrlsProperties.getUrls()) { registry.antMatchers(url).permitAll(); } registry .and() - // 禁止网页iframe + //禁止网页iframe .headers().frameOptions().disable() .and() .logout() .permitAll() .and() .authorizeRequests() - // 任何请求 + //任何请求 .anyRequest() - // 需要身份认证 + //需要身份认证 .authenticated() .and() - // 允许跨域 + //允许跨域 .cors().configurationSource((CorsConfigurationSource) SpringContextUtil.getBean("corsConfigurationSource")).and() - // 关闭跨站请求防护 + //关闭跨站请求防护 .csrf().disable() - // 前后端分离采用JWT 不需要session + //前后端分离采用JWT 不需要session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() - // 自定义权限拒绝处理类 + //自定义权限拒绝处理类 .exceptionHandling().accessDeniedHandler(accessDeniedHandler) .and() - // 添加JWT认证过滤器 + //添加JWT认证过滤器 .addFilter(new BuyerAuthenticationFilter(authenticationManager(), cache)); } diff --git a/buyer-api/src/main/resources/application.yml b/buyer-api/src/main/resources/application.yml index 2350e434..04c87cf4 100644 --- a/buyer-api/src/main/resources/application.yml +++ b/buyer-api/src/main/resources/application.yml @@ -3,15 +3,19 @@ server: servlet: context-path: / - - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi - tomcat: - uri-encoding: UTF-8 - threads: - min-spare: 50 - max: 1000 +# +# tomcat: +# #最大链接数,默认不设置,默认是10000 +# max-connections: 6500 +# #最大等待队列长度,允许HTTP请求缓存到请求队列的最大个数,默认不限制 +# accept-count: 1000 +# threads: +# #最少闲置 +# min-spare: 50 +# #最大线程数 ,默认是200 +# max: 800 + netty: + connection-timeout: # 与Spring Boot 2一样,默认情况下,大多数端点都不通过http公开,我们公开了所有端点。对于生产,您应该仔细选择要公开的端点。 management: @@ -25,6 +29,8 @@ management: exposure: include: '*' spring: + application: + name: buyer-api # 要在其中注册的Spring Boot Admin Server的URL。 boot: admin: @@ -37,11 +43,6 @@ spring: max-request-size: 20MB cache: type: redis - #JPA - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false #jackson json解析 jackson: time-zone: GMT+8 @@ -49,17 +50,6 @@ spring: #关闭jackson 对json做解析 fail-on-empty-beans: false - # mongodb - data: - mongodb: - host: 127.0.0.1 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset - # Redis redis: host: 127.0.0.1 @@ -86,10 +76,10 @@ spring: url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: lilishop - maxActive: 20 - initialSize: 5 + maxActive: 50 + initialSize: 10 maxWait: 60000 - minIdle: 5 + minIdle: 10 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL @@ -121,13 +111,13 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: - show: true + show: false # 忽略TOKEN 鉴权 的url ignored: @@ -138,36 +128,33 @@ ignored: - /MP_verify_qSyvBPhDsPdxvOhC.txt - /weixin/** - /source/** - - /buyer/store/** - - /buyer/mini-program/** - - /buyer/cashier/** - - /buyer/pageData/** - - /buyer/article/** + - /buyer/payment/cashier/** + - /buyer/payment/cashierRefund/** + - /buyer/other/pageData/** + - /buyer/other/article/** - /buyer/goods/** - - /buyer/category/** - - /buyer/shop/** - - /buyer/connect/** + - /buyer/store/** + - /buyer/passport/connect/** - /buyer/members/** - - /buyer/promotion/pintuan - - /buyer/promotion/seckill - - /buyer/memberEvaluation/**/goodsEvaluation - - /buyer/memberEvaluation/**/evaluationNumber - - /store/login/** - - /manager/user/login - - /manager/user/refresh/** + - /buyer/passport/member/** + - /buyer/passport/member/refresh/** + - /buyer/promotion/pintuan/** + - /buyer/promotion/seckill/** + - /buyer/promotion/pointsGoods/** + - /buyer/promotion/coupon + - /buyer/member/evaluation/**/goodsEvaluation + - /buyer/member/evaluation/**/evaluationNumber + - /buyer/other/appVersion/** + - /buyer/broadcast/studio/** - /druid/** - /swagger-ui.html - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - /v2/api-docs - /configuration/ui - /boot-admin - statics: - /**/*.js - /**/*.css - /**/*.png @@ -195,19 +182,20 @@ mybatis-plus: # 日志 logging: + config: classpath:logback-spring.xml # 输出级别 level: - cn.lili: debug - org.hibernate: debug + root: info # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 path: lili-logs - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-size: 5MB + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB #加密参数 jasypt: encryptor: @@ -264,7 +252,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 192.168.0.116:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group @@ -276,6 +265,8 @@ lili: order-group: lili_order_group member-topic: lili_member_topic member-group: lili_member_group + store-topic: lili_store_topic + store-group: lili_store_group other-topic: lili_other_topic other-group: lili_other_group notice-topic: lili_notice_topic diff --git a/buyer-api/src/main/resources/banner.txt b/buyer-api/src/main/resources/banner.txt deleted file mode 100644 index be6731c5..00000000 --- a/buyer-api/src/main/resources/banner.txt +++ /dev/null @@ -1,19 +0,0 @@ - ___ ___ ___ ___ ________ ________ _______ ________ _____ ______ ___ __ ________ ________ ___ __ -|\ \ |\ \|\ \ |\ \ |\ _____\\ __ \|\ ___ \ |\ __ \|\ _ \ _ \|\ \ |\ \|\ __ \|\ __ \|\ \|\ \ -\ \ \ \ \ \ \ \ \ \ \ ____________\ \ \__/\ \ \|\ \ \ __/|\ \ \|\ \ \ \\\__\ \ \ \ \ \ \ \ \ \|\ \ \ \|\ \ \ \/ /|_ - \ \ \ \ \ \ \ \ \ \ \|\____________\ \ __\\ \ _ _\ \ \_|/_\ \ __ \ \ \\|__| \ \ \ \ __\ \ \ \ \\\ \ \ _ _\ \ ___ \ - \ \ \____\ \ \ \ \____\ \ \|____________|\ \ \_| \ \ \\ \\ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \|\__\_\ \ \ \\\ \ \ \\ \\ \ \\ \ \ - \ \_______\ \__\ \_______\ \__\ \ \__\ \ \__\\ _\\ \_______\ \__\ \__\ \__\ \ \__\ \____________\ \_______\ \__\\ _\\ \__\\ \__\ - \|_______|\|__|\|_______|\|__| \|__| \|__|\|__|\|_______|\|__|\|__|\|__| \|__|\|____________|\|_______|\|__|\|__|\|__| \|__| - - - - ___ ___ ___ ___ ________ ___ ___ ________ ________ - |\ \ |\ \|\ \ |\ \ |\ ____\|\ \|\ \|\ __ \|\ __ \ - \ \ \ \ \ \ \ \ \ \ \ ____________\ \ \___|\ \ \\\ \ \ \|\ \ \ \|\ \ - \ \ \ \ \ \ \ \ \ \ \|\____________\ \_____ \ \ __ \ \ \\\ \ \ ____\ - \ \ \____\ \ \ \ \____\ \ \|____________|\|____|\ \ \ \ \ \ \ \\\ \ \ \___| - \ \_______\ \__\ \_______\ \__\ ____\_\ \ \__\ \__\ \_______\ \__\ - \|_______|\|__|\|_______|\|__| |\_________\|__|\|__|\|_______|\|__| - \|_________| - diff --git a/buyer-api/src/main/resources/logback-spring.xml b/buyer-api/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..f2904dd8 --- /dev/null +++ b/buyer-api/src/main/resources/logback-spring.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE_PATH}/rocketmq.log + + ${LOG_FILE_PATH}/rocketmq/rocketmq-%d{yyyy-MM-dd}.log + 30 + 30MB + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n + + + + + + + + + + + + ${LOGSTASH_SERVER} + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java b/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java index 1cc333be..67ef35d2 100644 --- a/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java +++ b/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java @@ -10,10 +10,10 @@ import cn.lili.modules.order.cart.service.CartService; import cn.lili.modules.payment.service.PaymentService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; @@ -21,7 +21,7 @@ import java.util.List; * @author paulG * @since 2020/11/14 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class CartTest { @@ -50,9 +50,9 @@ class CartTest { @Test void createTrade() { -// TradeDTO allTradeDTO = cartService.getAllTradeDTO(); -// Assert.assertNotNull(allTradeDTO); -// System.out.println(JsonUtil.objectToJson(allTradeDTO)); +// TradeDTO allTradeDTO = cartService.getAllTradeDTO(); +// Assert.assertNotNull(allTradeDTO); +// System.out.println(JsonUtil.objectToJson(allTradeDTO)); cartService.createTrade(new TradeParams()); } diff --git a/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java b/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java index 9fedbd63..b7907bca 100644 --- a/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java +++ b/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java @@ -1,15 +1,16 @@ package cn.lili.buyer.test.cart; -import cn.lili.modules.file.plugin.FileManagerPlugin; +import cn.lili.modules.file.plugin.FilePlugin; import cn.lili.modules.goods.entity.dos.Brand; import cn.lili.modules.goods.service.BrandService; import com.xkcoding.http.util.StringUtil; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.io.*; import java.net.URL; @@ -19,13 +20,14 @@ import java.util.List; * @author paulG * @since 2020/11/14 **/ -@RunWith(SpringRunner.class) +@Slf4j +@ExtendWith(SpringExtension.class) @SpringBootTest class FileTest { @Autowired - private FileManagerPlugin fileManagerPlugin; + private FilePlugin fileManagerPlugin; @Autowired private BrandService brandService; @@ -40,10 +42,10 @@ class FileTest { } URL url = new URL(brand.getLogo()); InputStream inputStream = url.openStream(); - // 上传至第三方云服务或服务器 + //上传至第三方云服务或服务器 brand.setLogo(fileManagerPlugin.inputStreamUpload(inputStream, brand.getId() + ".png")); } catch (IOException e) { - e.printStackTrace(); + log.error("上传你文件出错",e); } } brandService.updateBatchById(categoryList); diff --git a/buyer-api/src/test/java/cn/lili/buyer/test/cart/MemberCouponTest.java b/buyer-api/src/test/java/cn/lili/buyer/test/cart/MemberCouponTest.java index 4aba260e..cd72ff65 100644 --- a/buyer-api/src/test/java/cn/lili/buyer/test/cart/MemberCouponTest.java +++ b/buyer-api/src/test/java/cn/lili/buyer/test/cart/MemberCouponTest.java @@ -1,18 +1,19 @@ package cn.lili.buyer.test.cart; import cn.lili.modules.promotion.service.MemberCouponService; -import org.junit.Assert; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author paulG * @since 2020/11/27 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class MemberCouponTest { @@ -22,7 +23,7 @@ class MemberCouponTest { @Test void receiveCoupon() { memberCouponService.receiveCoupon("1333318596239843328", "1326834797335306240", "1"); - Assert.assertTrue(true); + assertTrue(true); } diff --git a/buyer-api/src/test/resources/application.yml b/buyer-api/src/test/resources/application.yml index dd015575..ac3d2b4d 100644 --- a/buyer-api/src/test/resources/application.yml +++ b/buyer-api/src/test/resources/application.yml @@ -2,9 +2,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -28,25 +25,11 @@ spring: admin: client: url: http://192.168.0.116:8000 - # mongodb - data: - mongodb: - host: 192.168.0.116 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset cache: type: redis #amqp # rabbitmq: # host: 192.168.0.116 - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false # Redis redis: host: 192.168.0.116 @@ -118,13 +101,13 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: - show: true + show: false # 忽略鉴权url ignored: @@ -157,14 +140,10 @@ ignored: - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - /v2/api-docs - /configuration/ui - /boot-admin - statics: - /**/*.js - /**/*.css - /**/*.png @@ -197,7 +176,6 @@ logging: cn.lili: info # org.hibernate: debug # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 path: lili-logs @@ -261,7 +239,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 127.0.0.1:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group diff --git a/common-api/pom.xml b/common-api/pom.xml index 4e5c7d8d..816a88be 100644 --- a/common-api/pom.xml +++ b/common-api/pom.xml @@ -7,17 +7,17 @@ cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml - cn.lili common-api cn.lili framework - 1.0.1 + ${revision} diff --git a/common-api/src/main/java/cn/lili/CommonApiApplication.java b/common-api/src/main/java/cn/lili/CommonApiApplication.java index c97858ec..b338c74e 100644 --- a/common-api/src/main/java/cn/lili/CommonApiApplication.java +++ b/common-api/src/main/java/cn/lili/CommonApiApplication.java @@ -8,13 +8,14 @@ import org.springframework.cache.annotation.EnableCaching; * 基础API * * @author Chopper - * @date 2020/11/17 3:38 下午 + * @since 2020/11/17 3:38 下午 */ @EnableCaching @SpringBootApplication public class CommonApiApplication { public static void main(String[] args) { + System.setProperty("rocketmq.client.logUseSlf4j","true"); SpringApplication.run(CommonApiApplication.class, args); } diff --git a/common-api/src/main/java/cn/lili/controller/common/FileController.java b/common-api/src/main/java/cn/lili/controller/common/FileController.java index b2c5f162..01aa0045 100644 --- a/common-api/src/main/java/cn/lili/controller/common/FileController.java +++ b/common-api/src/main/java/cn/lili/controller/common/FileController.java @@ -1,12 +1,12 @@ package cn.lili.controller.common; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; @@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -28,17 +27,18 @@ import java.util.List; * 文件管理管理接口 * * @author Chopper - * @date 2020/11/26 15:41 + * @since 2020/11/26 15:41 */ @RestController -@Api(tags = "文件管理管理接口") -@RequestMapping("/common/file") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Api(tags = "文件管理接口") +@RequestMapping("/common/common/file") public class FileController { - private final FileService fileService; + @Autowired + private FileService fileService; - private final Cache cache; + @Autowired + private Cache cache; @ApiOperation(value = "获取自己的图片资源") @GetMapping @@ -78,9 +78,8 @@ public class FileController { } throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); case MANAGER: - if (file.getUserEnums().equals(authUser.getRole().name())) { - break; - } + break; + default: throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } fileService.updateById(file); @@ -93,7 +92,7 @@ public class FileController { AuthUser authUser = UserContext.getAuthUser(cache, accessToken); fileService.batchDelete(ids, authUser); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/common-api/src/main/java/cn/lili/controller/common/IMController.java b/common-api/src/main/java/cn/lili/controller/common/IMController.java new file mode 100644 index 00000000..7b17801e --- /dev/null +++ b/common-api/src/main/java/cn/lili/controller/common/IMController.java @@ -0,0 +1,49 @@ +package cn.lili.controller.common; + + +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.ImSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * IM控制器 + * + * @author Chopper + * @version v1.0 + * 2021-09-16 15:32 + */ +@RestController +@RequestMapping("/common/common/IM") +@Api(tags = "IM 中心") +public class IMController { + + @Autowired + private SettingService settingService; + + @ApiOperation(value = "获取IM接口前缀") + @GetMapping + public ResultMessage getUrl() { + String imUrl; + try { + Setting imSettingVal = settingService.get(SettingEnum.IM_SETTING.name()); + ImSetting imSetting = JSONUtil.toBean(imSettingVal.getSettingValue(), ImSetting.class); + imUrl = imSetting.getHttpUrl(); + } catch (Exception e) { + throw new ServiceException(ResultCode.PLATFORM_NOT_SUPPORTED_IM); + } + return ResultUtil.data(imUrl); + } + +} diff --git a/manager-api/src/main/java/cn/lili/controller/member/IpInfoManagerController.java b/common-api/src/main/java/cn/lili/controller/common/IpInfoManagerController.java similarity index 73% rename from manager-api/src/main/java/cn/lili/controller/member/IpInfoManagerController.java rename to common-api/src/main/java/cn/lili/controller/common/IpInfoManagerController.java index 620b5931..d8b872d0 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/IpInfoManagerController.java +++ b/common-api/src/main/java/cn/lili/controller/common/IpInfoManagerController.java @@ -1,11 +1,10 @@ -package cn.lili.controller.member; +package cn.lili.controller.common; import cn.lili.common.utils.IpHelper; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -17,15 +16,14 @@ import javax.servlet.http.HttpServletRequest; * 管理端,IP接口 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController -@Api(tags = "管理端,IP接口") -@RequestMapping("/manager/common/ip") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Api(tags = "获取IP信息以及天气") +@RequestMapping("/common/common/ip") public class IpInfoManagerController { - - private final IpHelper ipHelper; + @Autowired + private IpHelper ipHelper; @RequestMapping(value = "/info", method = RequestMethod.GET) @ApiOperation(value = "IP及天气相关信息") diff --git a/common-api/src/main/java/cn/lili/controller/common/LogoController.java b/common-api/src/main/java/cn/lili/controller/common/LogoController.java deleted file mode 100644 index 824bd48a..00000000 --- a/common-api/src/main/java/cn/lili/controller/common/LogoController.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.lili.controller.common; - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - -/** - * 文件管理管理接口 - * - * @author Chopper - * @date 2020/11/26 15:41 - */ -@RestController -@Api(tags = "文件管理管理接口") -@RequestMapping("/common/logo") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class LogoController { - - @Autowired - private SettingService settingService; - - @ApiOperation(value = "获取logo") - @GetMapping - public ResultMessage getFileList() { - return ResultUtil.data(settingService.get(SettingEnum.BASE_SETTING.name())); - } - - -} diff --git a/common-api/src/main/java/cn/lili/controller/common/RegionController.java b/common-api/src/main/java/cn/lili/controller/common/RegionController.java index a8d2d40d..9abcfce3 100644 --- a/common-api/src/main/java/cn/lili/controller/common/RegionController.java +++ b/common-api/src/main/java/cn/lili/controller/common/RegionController.java @@ -1,15 +1,14 @@ package cn.lili.controller.common; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.base.service.RegionService; import cn.lili.modules.system.entity.dos.Region; import cn.lili.modules.system.entity.vo.RegionVO; +import cn.lili.modules.system.service.RegionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,16 +19,14 @@ import java.util.List; * 地址信息接口 * * @author Chopper - * @date: 2020/11/16 10:07 下午 */ @RestController @Api(tags = "地址信息接口") -@RequestMapping("/common/region") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/common/common/region") public class RegionController { - - private final RegionService regionService; + @Autowired + private RegionService regionService; @ApiOperation(value = "点地图获取地址信息") @ApiImplicitParams({ @@ -41,6 +38,11 @@ public class RegionController { return ResultUtil.data(regionService.getRegion(cityCode,townName)); } + @GetMapping(value = "/name") + @ApiOperation(value = "根据名字获取地区地址id") + public ResultMessage getItemByLastName(String lastName) { + return ResultUtil.data(regionService.getItemByLastName(lastName)); + } @GetMapping(value = "/item/{id}") @ApiImplicitParam(name = "id", value = "地区ID", required = true, dataType = "String", paramType = "path") diff --git a/common-api/src/main/java/cn/lili/controller/common/SiteController.java b/common-api/src/main/java/cn/lili/controller/common/SiteController.java new file mode 100644 index 00000000..96e90a64 --- /dev/null +++ b/common-api/src/main/java/cn/lili/controller/common/SiteController.java @@ -0,0 +1,35 @@ +package cn.lili.controller.common; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 站点基础配置获取 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2022/9/22 17:49 + */ +@Slf4j +@RestController +@RequestMapping("/common/common/site") +@Api(tags = "站点基础接口") +public class SiteController { + + @Autowired + private SettingService settingService; + + @ApiOperation(value = "获取站点基础信息") + @GetMapping + public ResultMessage baseSetting() { + return ResultUtil.data(settingService.get(SettingEnum.BASE_SETTING.name())); + } +} diff --git a/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java b/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java index a5bcfe3a..976fb52b 100644 --- a/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java +++ b/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java @@ -1,51 +1,43 @@ -package cn.lili.controller.common; - -import cn.lili.common.aop.limiter.annotation.LimitPoint; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.verification.enums.VerificationEnums; -import cn.lili.common.verification.service.VerificationService; -import cn.lili.common.vo.ResultMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * 滑块验证码接口 - * - * @author Chopper - * @date 2020/11/26 15:41 - */ -@RequestMapping("/common/slider") -@RestController -@Api(tags = "滑块验证码接口") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SliderImageController { - - - private final VerificationService verificationService; - - //一分钟同一个ip请求10次 - @LimitPoint(name = "slider_image", key = "verification") - @GetMapping("/{verificationEnums}") - @ApiOperation(value = "获取校验接口") - public ResultMessage getSliderImage(@RequestHeader String uuid, @PathVariable VerificationEnums verificationEnums) { - try { - return ResultUtil.data(verificationService.createVerification(verificationEnums, uuid)); - } catch (ServiceException e) { - throw e; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - @LimitPoint(name = "slider_image", key = "verification_pre_check", limit = 600) - @PostMapping("/{verificationEnums}") - @ApiOperation(value = "验证码预校验") - public ResultMessage verificationImage(Integer xPos, @RequestHeader String uuid, @PathVariable VerificationEnums verificationEnums) { - return ResultUtil.data(verificationService.preCheck(xPos, uuid, verificationEnums)); - } -} +package cn.lili.controller.common; + +import cn.lili.cache.limit.annotation.LimitPoint; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 滑块验证码接口 + * + * @author Chopper + * @since 2020/11/26 15:41 + */ +@Slf4j +@RestController +@RequestMapping("/common/common/slider") +@Api(tags = "滑块验证码接口") +public class SliderImageController { + + @Autowired + private VerificationService verificationService; + + @LimitPoint(name = "slider_image", key = "verification") + @GetMapping("/{verificationEnums}") + @ApiOperation(value = "获取校验接口,一分钟同一个ip请求10次") + public ResultMessage getSliderImage(@RequestHeader String uuid, @PathVariable VerificationEnums verificationEnums) { + return ResultUtil.data(verificationService.createVerification(verificationEnums, uuid)); + + } + + @LimitPoint(name = "slider_image", key = "verification_pre_check", limit = 600) + @PostMapping("/{verificationEnums}") + @ApiOperation(value = "验证码预校验") + public ResultMessage verificationImage(Integer xPos, @RequestHeader String uuid, @PathVariable VerificationEnums verificationEnums) { + return ResultUtil.data(verificationService.preCheck(xPos, uuid, verificationEnums)); + } +} diff --git a/common-api/src/main/java/cn/lili/controller/common/SmsController.java b/common-api/src/main/java/cn/lili/controller/common/SmsController.java index 64e7e677..59d1264f 100644 --- a/common-api/src/main/java/cn/lili/controller/common/SmsController.java +++ b/common-api/src/main/java/cn/lili/controller/common/SmsController.java @@ -1,53 +1,48 @@ -package cn.lili.controller.common; - -import cn.lili.common.aop.limiter.annotation.LimitPoint; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.sms.SmsUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.verification.enums.VerificationEnums; -import cn.lili.common.verification.service.VerificationService; -import cn.lili.common.vo.ResultMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * 短信验证码接口 - * - * @author Chopper - * @date 2020/11/26 15:41 - */ -@RestController -@Api(tags = "短信验证码接口") -@RequestMapping("/common/sms") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SmsController { - - private final SmsUtil smsUtil; - - private final VerificationService verificationService; - - //一分钟同一个ip请求1次 - @LimitPoint(name = "sms_send", key = "sms") - @ApiImplicitParams({ - @ApiImplicitParam(paramType = "path", dataType = "String", name = "mobile", value = "手机号"), - @ApiImplicitParam(paramType = "header", dataType = "String", name = "uuid", value = "uuid"), - }) - @GetMapping("/{verificationEnums}/{mobile}") - @ApiOperation(value = "发送短信验证码") - public ResultMessage getSmsCode( - @RequestHeader String uuid, - @PathVariable String mobile, - @PathVariable VerificationEnums verificationEnums) { - if (verificationService.check(uuid, verificationEnums)) { - smsUtil.sendSmsCode(mobile, verificationEnums, uuid); - return ResultUtil.success(ResultCode.VERIFICATION_SEND_SUCCESS); - } else { - return ResultUtil.error(ResultCode.VERIFICATION_SMS_EXPIRED_ERROR); - } - } -} +package cn.lili.controller.common; + +import cn.lili.cache.limit.annotation.LimitPoint; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.sms.SmsUtil; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 短信验证码接口 + * + * @author Chopper + * @since 2020/11/26 15:41 + */ +@RestController +@Api(tags = "短信验证码接口") +@RequestMapping("/common/common/sms") +public class SmsController { + + @Autowired + private SmsUtil smsUtil; + @Autowired + private VerificationService verificationService; + + @LimitPoint(name = "sms_send", key = "sms") + @ApiImplicitParams({ + @ApiImplicitParam(paramType = "path", dataType = "String", name = "mobile", value = "手机号"), + @ApiImplicitParam(paramType = "header", dataType = "String", name = "uuid", value = "uuid"), + }) + @GetMapping("/{verificationEnums}/{mobile}") + @ApiOperation(value = "发送短信验证码,一分钟同一个ip请求1次") + public ResultMessage getSmsCode( + @RequestHeader String uuid, + @PathVariable String mobile, + @PathVariable VerificationEnums verificationEnums) { + verificationService.check(uuid, verificationEnums); + smsUtil.sendSmsCode(mobile, verificationEnums, uuid); + return ResultUtil.success(ResultCode.VERIFICATION_SEND_SUCCESS); + } +} diff --git a/common-api/src/main/java/cn/lili/controller/common/UploadController.java b/common-api/src/main/java/cn/lili/controller/common/UploadController.java index 3f6d5cfd..767db2fa 100644 --- a/common-api/src/main/java/cn/lili/controller/common/UploadController.java +++ b/common-api/src/main/java/cn/lili/controller/common/UploadController.java @@ -1,26 +1,24 @@ package cn.lili.controller.common; -import cn.hutool.core.util.StrUtil; -import cn.lili.common.cache.Cache; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.Base64DecodeMultipartFile; import cn.lili.common.utils.CommonUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.file.entity.File; -import cn.lili.modules.file.plugin.FileManagerPlugin; +import cn.lili.modules.file.plugin.FilePluginFactory; import cn.lili.modules.file.service.FileService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -30,27 +28,28 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; +import java.util.Objects; /** * 文件上传接口 * * @author Chopper - * @date 2020/11/26 15:41 + * @since 2020/11/26 15:41 */ @Slf4j @RestController @Api(tags = "文件上传接口") -@RequestMapping("/common/upload") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/common/common/upload") public class UploadController { - private final FileService fileService; - - private final SettingService settingService; - - private final FileManagerPlugin fileManagerPlugin; - - private final Cache cache; + @Autowired + private FileService fileService; + @Autowired + private SettingService settingService; + @Autowired + private FilePluginFactory filePluginFactory; + @Autowired + private Cache cache; @ApiOperation(value = "文件上传") @PostMapping(value = "/file") @@ -64,23 +63,34 @@ public class UploadController { if (authUser == null) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } - Setting setting = settingService.getById(SettingEnum.OSS_SETTING.name()); - if (setting == null || StrUtil.isBlank(setting.getSettingValue())) { + if (file == null) { + throw new ServiceException(ResultCode.FILE_NOT_EXIST_ERROR); + } + Setting setting = settingService.get(SettingEnum.OSS_SETTING.name()); + if (setting == null || CharSequenceUtil.isBlank(setting.getSettingValue())) { throw new ServiceException(ResultCode.OSS_NOT_EXIST); } + if (CharSequenceUtil.isEmpty(file.getContentType())) { + throw new ServiceException(ResultCode.IMAGE_FILE_EXT_ERROR); + } - if (StringUtils.isNotBlank(base64)) { - // base64上传 + + if (!CharSequenceUtil.containsAny(file.getContentType().toLowerCase(), "image")) { + throw new ServiceException(ResultCode.FILE_TYPE_NOT_SUPPORT); + } + + if (CharSequenceUtil.isNotBlank(base64)) { + //base64上传 file = Base64DecodeMultipartFile.base64Convert(base64); } - String result = ""; - String fileKey = CommonUtil.rename(file.getOriginalFilename()); + String result; + String fileKey = CommonUtil.rename(Objects.requireNonNull(file.getOriginalFilename())); File newFile = new File(); try { InputStream inputStream = file.getInputStream(); - // 上传至第三方云服务或服务器 - result = fileManagerPlugin.inputStreamUpload(inputStream, fileKey); - // 保存数据信息至数据库 + //上传至第三方云服务或服务器 + result = filePluginFactory.filePlugin().inputStreamUpload(inputStream, fileKey); + //保存数据信息至数据库 newFile.setName(file.getOriginalFilename()); newFile.setFileSize(file.getSize()); newFile.setFileType(file.getContentType()); @@ -89,7 +99,7 @@ public class UploadController { newFile.setCreateBy(authUser.getUsername()); newFile.setUserEnums(authUser.getRole().name()); //如果是店铺,则记录店铺id - if (authUser.getRole().equals(UserEnums.STORE.name())) { + if (authUser.getRole().equals(UserEnums.STORE)) { newFile.setOwnerId(authUser.getStoreId()); } else { newFile.setOwnerId(authUser.getId()); @@ -97,10 +107,8 @@ public class UploadController { fileService.save(newFile); } catch (Exception e) { log.error("文件上传失败", e); - return ResultUtil.error(400, e.toString()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } return ResultUtil.data(result); } - - } diff --git a/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java b/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java index c86b787f..5ad1d4a2 100644 --- a/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java +++ b/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java @@ -1,9 +1,5 @@ package cn.lili.controller.security; -import cn.lili.common.cache.Cache; -import cn.lili.common.security.CustomAccessDeniedHandler; -import cn.lili.config.properties.IgnoredUrlsProperties; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -18,30 +14,19 @@ import org.springframework.web.cors.CorsConfigurationSource; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/14 16:20 */ @Slf4j @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CommonSecurityConfig extends WebSecurityConfigurerAdapter { - /** - * 忽略验权配置 - */ - private final IgnoredUrlsProperties ignoredUrlsProperties; - /** * spring security -》 权限不足处理 */ - private final CustomAccessDeniedHandler accessDeniedHandler; - - - private final Cache cache; - - private final CorsConfigurationSource corsConfigurationSource; + @Autowired + private CorsConfigurationSource corsConfigurationSource; @Override protected void configure(HttpSecurity http) throws Exception { @@ -50,18 +35,18 @@ public class CommonSecurityConfig extends WebSecurityConfigurerAdapter { .authorizeRequests(); registry .and() - // 禁止网页iframe + //禁止网页iframe .headers().frameOptions().disable() .and() .authorizeRequests() - // 任何请求 + //任何请求 .anyRequest() - // 需要身份认证 + //需要身份认证 .permitAll() .and() - // 允许跨域 + //允许跨域 .cors().configurationSource(corsConfigurationSource).and() - // 关闭跨站请求防护 + //关闭跨站请求防护 .csrf().disable(); } diff --git a/common-api/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/common-api/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index 62b698e0..00000000 --- a/common-api/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "properties": [ - { - "name": "spring.http.multipart.location", - "type": "java.lang.String", - "description": "Description for spring.http.multipart.location." - } -] } \ No newline at end of file diff --git a/common-api/src/main/resources/application.yml b/common-api/src/main/resources/application.yml index 50b9a813..eadf556f 100644 --- a/common-api/src/main/resources/application.yml +++ b/common-api/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -25,28 +22,15 @@ management: exposure: include: '*' spring: + application: + name: common-api # 要在其中注册的Spring Boot Admin Server的URL。 boot: admin: client: url: http://127.0.0.1:8000 - # mongodb - data: - mongodb: - host: 127.0.0.1 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset cache: type: redis - - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false # Redis redis: host: 127.0.0.1 @@ -118,13 +102,13 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: - show: true + show: false # 忽略鉴权url ignored: @@ -135,37 +119,19 @@ ignored: - /MP_verify_qSyvBPhDsPdxvOhC.txt - /weixin/** - /source/** - - /buyer/mini-program/** - - /buyer/cashier/** - - /buyer/pageData/** - - /buyer/article/** - - /buyer/goods/** - - /buyer/category/** - - /buyer/shop/** - - /buyer/connect/** - - /buyer/members/smsLogin - - /buyer/members/refresh/* - - /buyer/members/refresh** - - /buyer/promotion/pintuan - - /buyer/promotion/seckill - - /buyer/memberEvaluation/**/goodsEvaluation - - /buyer/memberEvaluation/**/evaluationNumber - - /store/login/** - - /manager/user/login - - /manager/user/refresh/** + - /common/common/slider/** + - /common/common/sms/** + - /common/common/logo + - /common/common/site - /druid/** - /swagger-ui.html - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - /v2/api-docs - /configuration/ui - /boot-admin - statics: - /**/*.js - /**/*.css - /**/*.png @@ -193,27 +159,51 @@ mybatis-plus: # 日志 logging: + config: classpath:logback-spring.xml # 输出级别 level: - cn.lili: info + root: info # org.hibernate: debug # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 path: lili-logs - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-size: 5MB + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB #加密参数 jasypt: encryptor: password: lili lili: + #验证码设置 + verification-code: + #图形验证码有效时间 秒 包含滑块验证码有效时间, 以及验证通过之后,缓存中存储的验证结果有效时间 + effectiveTime: 300 + #水印 + watermark: LILI-SHOP + #干扰项数量 最大2 默认0 + interfereNum: 0 + #允许误差像素 + faultTolerant: 3 + #短信模版配置 + sms: + #登录 + LOGIN: SMS_205755300 + #注册 + REGISTER: SMS_205755298 + #找回密码 + FIND_USER: SMS_205755301 + #设置密码 + UPDATE_PASSWORD: SMS_205755297 + #支付密码 + WALLET_PASSWORD: SMS_205755301 system: - isDemoSite: true + isTestModel: true statistics: # 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数 onlineMember: 48 @@ -262,7 +252,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 127.0.0.1:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group diff --git a/common-api/src/main/resources/logback-spring.xml b/common-api/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..b7c9425a --- /dev/null +++ b/common-api/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE_PATH}/rocketmq.log + + ${LOG_FILE_PATH}/rocketmq/rocketmq-%d{yyyy-MM-dd}.log + 30 + 30MB + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n + + + + + + + + + + + ${LOGSTASH_SERVER} + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/config/application.yml b/config/application.yml index d11ce90c..9590836f 100644 --- a/config/application.yml +++ b/config/application.yml @@ -2,9 +2,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -27,30 +24,13 @@ spring: boot: admin: client: - url: http://192.168.0.116:8000 - # mongodb - data: - mongodb: - host: 192.168.0.116 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset + url: http://192.168.0.108:8000 cache: type: redis - #amqp - # rabbitmq: - # host: 192.168.0.116 - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false # Redis redis: - host: 192.168.0.116 - port: 6379 + host: 192.168.31.108 + port: 30379 password: lilishop lettuce: pool: @@ -80,11 +60,11 @@ spring: default-datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://192.168.0.116:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + url: jdbc:mysql://192.168.31.108:30306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: lilishop - maxActive: 20 - initialSize: 5 + maxActive: 50 + initialSize: 20 maxWait: 60000 minIdle: 5 timeBetweenEvictionRunsMillis: 60000 @@ -118,9 +98,9 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: @@ -135,36 +115,42 @@ ignored: - /MP_verify_qSyvBPhDsPdxvOhC.txt - /weixin/** - /source/** - - /buyer/mini-program/** - - /buyer/cashier/** - - /buyer/pageData/** - - /buyer/article/** + - /store/passport/login/** + - /store/passport/login/refresh/** + - /common/common/slider/** + - /common/common/sms/** + - /common/common/site + - /buyer/payment/cashier/** + - /buyer/other/pageData/** + - /buyer/other/article/** - /buyer/goods/** - - /buyer/category/** - /buyer/store/** - - /buyer/connect/** + - /buyer/passport/connect/** - /buyer/members/** + - /buyer/passport/member/** + - /buyer/passport/member/refresh/** - /buyer/promotion/pintuan/** - /buyer/promotion/seckill/** - /buyer/promotion/pointsGoods/** - - /buyer/memberEvaluation/**/goodsEvaluation - - /buyer/memberEvaluation/**/evaluationNumber - - /store/login/** - - /manager/user/login - - /manager/user/refresh/** + - /buyer/promotion/coupon + - /buyer/member/evaluation/**/goodsEvaluation + - /buyer/member/evaluation/**/evaluationNumber + - /buyer/other/appVersion/** + - /buyer/broadcast/studio/** + - /manager/passport/user/login + - /manager/passport/user/refresh/** + - /manager/other/elasticsearch + - /manager/other/customWords - /druid/** - /swagger-ui.html - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - - /v2/api-docs + - /v2/api-docs** - /configuration/ui - /boot-admin - statics: + - /manager/promotion/seckill/init - /**/*.js - /**/*.css - /**/*.png @@ -172,9 +158,9 @@ ignored: # Swagger界面内容配置 swagger: - title: lili API接口文档 - description: lili Api Documentation - version: 1.0.0 + title: lilishop API接口文档 + description: lilishop Api Documentation + version: 4.2.2 termsOfServiceUrl: https://pickmall.cn contact: name: lili @@ -197,22 +183,53 @@ logging: cn.lili: info # org.hibernate: debug # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 - path: lili-logs - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-size: 5MB + path: logs + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB #加密参数 jasypt: encryptor: password: lili + lili: + #验证码设置 + verification-code: + #图形验证码有效时间 秒 包含滑块验证码有效时间, 以及验证通过之后,缓存中存储的验证结果有效时间 + effectiveTime: 300 + #水印 + watermark: LILI-SHOP + #干扰项数量 最大2 默认0 + interfereNum: 1 + #允许误差像素 + faultTolerant: 3 + #短信模版配置 + sms: + #登录 + LOGIN: SMS_205755300 + #注册 + REGISTER: SMS_205755298 + #找回密码 + FIND_USER: SMS_205755301 + #设置密码 + UPDATE_PASSWORD: SMS_205755297 + #支付密码 + WALLET_PASSWORD: SMS_205755301 system: - isDemoSite: true + isDemoSite: false + isTestModel: true + # 脱敏级别: + # 0:不做脱敏处理 + # 1:管理端用户手机号等信息脱敏 + # 2:商家端信息脱敏(为2时,表示管理端,商家端同时脱敏) + sensitiveLevel: 1 + statistics: # 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数 onlineMember: 48 @@ -224,21 +241,21 @@ lili: sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6 #域名 domain: - pc: http://192.168.0.116:8888 - wap: http://192.168.0.116:8888 - seller: http://192.168.0.116:8888 - admin: http://192.168.0.116:8888 + pc: http://192.168.0.108:8888 + wap: http://192.168.0.108:8888 + seller: http://192.168.0.108:8888 + admin: http://192.168.0.108:8888 #api地址 api: buyer: https://z171l91606.51mypc.cn - base: http://192.168.0.116:8888 - manager: http://192.168.0.116:8888 - seller: http://192.168.0.116:8888 + base: http://192.168.0.108:8888 + manager: http://192.168.0.108:8888 + seller: http://192.168.0.108:8888 # jwt 细节设定 jwt-setting: # token过期时间(分钟) - tokenExpireTime: 60 + tokenExpireTime: 30 # 使用Spring @Cacheable注解失效时间 cache: @@ -252,7 +269,7 @@ lili: data: elasticsearch: cluster-name: elasticsearch - cluster-nodes: 192.168.0.116:9200 + cluster-nodes: 192.168.31.108:30920 index: number-of-replicas: 0 number-of-shards: 3 @@ -262,25 +279,30 @@ lili: # username: elastic # password: LiLiShopES + logstash: + server: 127.0.0.1:4560 rocketmq: - promotion-topic: lili_promotion_topic - promotion-group: lili_promotion_group - msg-ext-topic: lili_msg_topic - msg-ext-group: lili_msg_group - goods-topic: lili_goods_topic - goods-group: lili_goods_group - order-topic: lili_order_topic - order-group: lili_order_group - member-topic: lili_member_topic - member-group: lili_member_group - other-topic: lili_other_topic - other-group: lili_other_group - notice-topic: lili_notice_topic - notice-group: lili_notice_group - notice-send-topic: lili_send_notice_topic - notice-send-group: lili_send_notice_group + promotion-topic: shop_lili_promotion_topic + promotion-group: shop_lili_promotion_group + msg-ext-topic: shop_lili_msg_topic + msg-ext-group: shop_lili_msg_group + goods-topic: shop_lili_goods_topic + goods-group: shop_lili_goods_group + order-topic: shop_lili_order_topic + order-group: shop_lili_order_group + member-topic: shop_lili_member_topic + member-group: shop_lili_member_group + other-topic: shop_lili_other_topic + other-group: shop_lili_other_group + notice-topic: shop_lili_notice_topic + notice-group: shop_lili_notice_group + notice-send-topic: shop_lili_send_notice_topic + notice-send-group: shop_lili_send_notice_group + after-sale-topic: shop_lili_after_sale_topic + after-sale-group: shop_lili_after_sale_group rocketmq: - name-server: 192.168.0.116:9876 + name-server: 192.168.31.108:30876 + isVIPChannel: false producer: group: lili_group send-message-timeout: 30000 @@ -288,7 +310,7 @@ rocketmq: xxl: job: admin: - addresses: http://192.168.0.116:9001/xxl-job-admin + addresses: http://192.168.31.108:30001/xxl-job-admin executor: appname: xxl-job-executor-lilishop address: diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/_remote.repositories b/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/_remote.repositories deleted file mode 100644 index 945656cd..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/_remote.repositories +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Thu Dec 24 11:13:34 CST 2020 -xxl-job-admin-2.3.0-SNAPSHOT.pom>= -xxl-job-admin-2.3.0-SNAPSHOT.jar>= diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/maven-metadata-local.xml b/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/maven-metadata-local.xml deleted file mode 100644 index e4a32a10..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/maven-metadata-local.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - com.xuxueli - xxl-job-admin - 2.3.0-SNAPSHOT - - - true - - 20201224031334 - - - jar - 2.3.0-SNAPSHOT - 20201224031334 - - - pom - 2.3.0-SNAPSHOT - 20201224031334 - - - - diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/xxl-job-admin-2.3.0-SNAPSHOT.jar b/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/xxl-job-admin-2.3.0-SNAPSHOT.jar deleted file mode 100644 index e6002908..00000000 Binary files a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/xxl-job-admin-2.3.0-SNAPSHOT.jar and /dev/null differ diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/xxl-job-admin-2.3.0-SNAPSHOT.pom b/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/xxl-job-admin-2.3.0-SNAPSHOT.pom deleted file mode 100644 index d8b2f9f9..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-admin/2.3.0-SNAPSHOT/xxl-job-admin-2.3.0-SNAPSHOT.pom +++ /dev/null @@ -1,113 +0,0 @@ - - 4.0.0 - - com.xuxueli - xxl-job - 2.3.0-SNAPSHOT - - xxl-job-admin - jar - - - - - org.springframework.boot - spring-boot-starter-parent - ${spring-boot.version} - pom - import - - - - - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - org.springframework.boot - spring-boot-starter-freemarker - - - - - org.springframework.boot - spring-boot-starter-mail - - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring-boot-starter.version} - - - - mysql - mysql-connector-java - ${mysql-connector-java.version} - - - - - com.xuxueli - xxl-job-core - ${project.parent.version} - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - repackage - - - - - - - com.spotify - docker-maven-plugin - 0.4.13 - - - ${project.artifactId}:${project.version} - ${project.basedir} - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - - - - - diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-admin/maven-metadata-local.xml b/consumer/maven-repository/com/xuxueli/xxl-job-admin/maven-metadata-local.xml deleted file mode 100644 index 6bdd1f8b..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-admin/maven-metadata-local.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - com.xuxueli - xxl-job-admin - - - 2.3.0-SNAPSHOT - - 20201224031334 - - diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/_remote.repositories b/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/_remote.repositories deleted file mode 100644 index cd11d002..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/_remote.repositories +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Thu Dec 24 11:13:30 CST 2020 -xxl-job-core-2.3.0-SNAPSHOT.pom>= -xxl-job-core-2.3.0-SNAPSHOT.jar>= diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/maven-metadata-local.xml b/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/maven-metadata-local.xml deleted file mode 100644 index e48ba2f7..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/maven-metadata-local.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - com.xuxueli - xxl-job-core - 2.3.0-SNAPSHOT - - - true - - 20201224031330 - - - jar - 2.3.0-SNAPSHOT - 20201224031330 - - - pom - 2.3.0-SNAPSHOT - 20201224031330 - - - - diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/resolver-status.properties b/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/resolver-status.properties deleted file mode 100644 index 7033eb85..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/resolver-status.properties +++ /dev/null @@ -1,6 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Thu Dec 24 20:01:24 CST 2020 -maven-metadata-maven-central.xml/@default-maven-central-http\://central.maven.org/maven2/.lastUpdated=1608811283852 -maven-metadata-aliyun.xml.error= -maven-metadata-maven-central.xml.error=Could not transfer metadata com.xuxueli\:xxl-job-core\:2.3.0-SNAPSHOT/maven-metadata.xml from/to maven-central (http\://central.maven.org/maven2/)\: Transfer failed for http\://central.maven.org/maven2/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/maven-metadata.xml -maven-metadata-aliyun.xml.lastUpdated=1608811284126 diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/xxl-job-core-2.3.0-SNAPSHOT.jar b/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/xxl-job-core-2.3.0-SNAPSHOT.jar deleted file mode 100644 index 68c8afce..00000000 Binary files a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/xxl-job-core-2.3.0-SNAPSHOT.jar and /dev/null differ diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/xxl-job-core-2.3.0-SNAPSHOT.pom b/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/xxl-job-core-2.3.0-SNAPSHOT.pom deleted file mode 100644 index 80b0a194..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-core/2.3.0-SNAPSHOT/xxl-job-core-2.3.0-SNAPSHOT.pom +++ /dev/null @@ -1,64 +0,0 @@ - - 4.0.0 - - com.xuxueli - xxl-job - 2.3.0-SNAPSHOT - - xxl-job-core - jar - - ${project.artifactId} - A distributed task scheduling framework. - https://www.xuxueli.com/ - - - - - - io.netty - netty-all - ${netty-all.version} - - - com.google.code.gson - gson - ${gson.version} - - - - - - org.codehaus.groovy - groovy - ${groovy.version} - - - - - org.springframework - spring-context - ${spring.version} - provided - - - - - - org.slf4j - slf4j-api - ${slf4j-api.version} - - - - - javax.annotation - javax.annotation-api - ${javax.annotation-api.version} - provided - - - - - \ No newline at end of file diff --git a/consumer/maven-repository/com/xuxueli/xxl-job-core/maven-metadata-local.xml b/consumer/maven-repository/com/xuxueli/xxl-job-core/maven-metadata-local.xml deleted file mode 100644 index 23867780..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job-core/maven-metadata-local.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - com.xuxueli - xxl-job-core - - - 2.3.0-SNAPSHOT - - 20201224031330 - - diff --git a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/_remote.repositories b/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/_remote.repositories deleted file mode 100644 index 0e354116..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/_remote.repositories +++ /dev/null @@ -1,3 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Thu Dec 24 11:13:27 CST 2020 -xxl-job-2.3.0-SNAPSHOT.pom>= diff --git a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/maven-metadata-local.xml b/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/maven-metadata-local.xml deleted file mode 100644 index c5768c05..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/maven-metadata-local.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - com.xuxueli - xxl-job - 2.3.0-SNAPSHOT - - - true - - 20201224031327 - - - pom - 2.3.0-SNAPSHOT - 20201224031327 - - - - diff --git a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/resolver-status.properties b/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/resolver-status.properties deleted file mode 100644 index d30bfcd2..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/resolver-status.properties +++ /dev/null @@ -1,6 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Thu Dec 24 20:01:24 CST 2020 -maven-metadata-maven-central.xml/@default-maven-central-http\://central.maven.org/maven2/.lastUpdated=1608811284134 -maven-metadata-aliyun.xml.error= -maven-metadata-maven-central.xml.error=Could not transfer metadata com.xuxueli\:xxl-job\:2.3.0-SNAPSHOT/maven-metadata.xml from/to maven-central (http\://central.maven.org/maven2/)\: Transfer failed for http\://central.maven.org/maven2/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/maven-metadata.xml -maven-metadata-aliyun.xml.lastUpdated=1608811284273 diff --git a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/xxl-job-2.3.0-SNAPSHOT.pom b/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/xxl-job-2.3.0-SNAPSHOT.pom deleted file mode 100644 index bb84f677..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job/2.3.0-SNAPSHOT/xxl-job-2.3.0-SNAPSHOT.pom +++ /dev/null @@ -1,145 +0,0 @@ - - 4.0.0 - com.xuxueli - xxl-job - 2.3.0-SNAPSHOT - pom - - ${project.artifactId} - A distributed task scheduling framework. - https://www.xuxueli.com/ - - - xxl-job-core - xxl-job-admin - xxl-job-executor-samples - - - - UTF-8 - UTF-8 - UTF-8 - 1.8 - 1.8 - true - - 4.1.54.Final - 2.8.6 - - 5.3.1 - 2.4.0 - - 2.1.4 - 8.0.22 - - 1.7.30 - 5.7.0 - 1.3.2 - - 3.0.7 - - 3.2.1 - 3.2.0 - 1.6 - 3.3.1 - - - - - - - - - - - GNU General Public License version 3 - https://opensource.org/licenses/GPL-3.0 - - - - - master - https://github.com/xuxueli/xxl-job.git - scm:git:https://github.com/xuxueli/xxl-job.git - scm:git:git@github.com:xuxueli/xxl-job.git - - - - XXL - xuxueli - 931591021@qq.com - https://github.com/xuxueli - - - - - - - release - - - - - org.apache.maven.plugins - maven-source-plugin - ${maven-source-plugin.version} - - - package - - jar-no-fork - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - - package - - jar - - - none - - - - - - - org.apache.maven.plugins - maven-gpg-plugin - ${maven-gpg-plugin.version} - - false - - - - verify - - sign - - - - - - - - - oss - https://oss.sonatype.org/content/repositories/snapshots/ - - - oss - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - - - \ No newline at end of file diff --git a/consumer/maven-repository/com/xuxueli/xxl-job/maven-metadata-local.xml b/consumer/maven-repository/com/xuxueli/xxl-job/maven-metadata-local.xml deleted file mode 100644 index dc6069c6..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-job/maven-metadata-local.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - com.xuxueli - xxl-job - - - 2.3.0-SNAPSHOT - - 20201224031327 - - diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/_remote.repositories b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/_remote.repositories deleted file mode 100644 index d1e6937e..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/_remote.repositories +++ /dev/null @@ -1,5 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Sat Apr 04 19:56:05 CST 2020 -xxl-rpc-core-1.2.1.pom>aliyun= -xxl-rpc-core-1.2.1-sources.jar>aliyun= -xxl-rpc-core-1.2.1.jar>aliyun= diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar deleted file mode 100644 index f233be1e..00000000 Binary files a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar and /dev/null differ diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar.lastUpdated b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar.lastUpdated deleted file mode 100644 index 0b1e7d6f..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar.lastUpdated +++ /dev/null @@ -1,5 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Sat Apr 04 19:56:05 CST 2020 -http\://central.maven.org/maven2/.error=Could not transfer artifact com.xuxueli\:xxl-rpc-core\:jar\:sources\:1.2.1 from/to maven-central (http\://central.maven.org/maven2/)\: central.maven.org -@default-maven-central-http\://central.maven.org/maven2/.lastUpdated=1586001364931 -http\://maven.aliyun.com/nexus/content/groups/public/.lastUpdated=1586001365245 diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar.sha1 b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar.sha1 deleted file mode 100644 index 804426ca..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1-sources.jar.sha1 +++ /dev/null @@ -1,2 +0,0 @@ - -33b53883ecf6e77b8b4eafe3506e213e83b2c80a \ No newline at end of file diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.jar b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.jar deleted file mode 100644 index 8190b5c0..00000000 Binary files a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.jar and /dev/null differ diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.jar.sha1 b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.jar.sha1 deleted file mode 100644 index b02eee7a..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -27f8d667b1ede36b219f36af75b493b0e6143288 \ No newline at end of file diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.pom b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.pom deleted file mode 100644 index 5c5d1bdb..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.pom +++ /dev/null @@ -1,143 +0,0 @@ - - 4.0.0 - - com.xuxueli - xxl-rpc - 1.2.1 - - xxl-rpc-core - jar - - ${project.artifactId} - A high performance, distributed RPC framework. - http://www.xuxueli.com/ - - - - - - - - org.slf4j - slf4j-api - ${slf4j-api.version} - - - org.slf4j - slf4j-log4j12 - ${slf4j-api.version} - test - - - - - - - - com.caucho - hessian - ${hessian.version} - - - - - io.protostuff - protostuff-core - ${protostuff.version} - provided - - - io.protostuff - protostuff-runtime - ${protostuff.version} - provided - - - org.objenesis - objenesis - ${objenesis.version} - provided - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - provided - - - - - - - - org.apache.zookeeper - zookeeper - ${zookeeper.version} - provided - - - - - - - - org.eclipse.jetty - jetty-server - ${jetty-server.version} - - - org.eclipse.jetty - jetty-client - ${jetty-server.version} - - - - - io.netty - netty-all - ${netty.version} - provided - - - - org.apache.mina - mina-core - 2.0.19 - provided - - - - org.apache.commons - commons-pool2 - ${commons-pool2.version} - provided - - - - - - - org.springframework - spring-beans - ${spring.version} - provided - - - org.springframework - spring-core - ${spring.version} - provided - - - org.springframework - spring-context - ${spring.version} - provided - - - - - \ No newline at end of file diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.pom.sha1 b/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.pom.sha1 deleted file mode 100644 index 18eb35dc..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc-core/1.2.1/xxl-rpc-core-1.2.1.pom.sha1 +++ /dev/null @@ -1,2 +0,0 @@ - -bed5b85e402f8fccf7109a3d5944f45dd5cae342 \ No newline at end of file diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/_remote.repositories b/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/_remote.repositories deleted file mode 100644 index 71739fc4..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/_remote.repositories +++ /dev/null @@ -1,3 +0,0 @@ -#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. -#Mon Mar 02 16:06:40 CST 2020 -xxl-rpc-1.2.1.pom>aliyun= diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/xxl-rpc-1.2.1.pom b/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/xxl-rpc-1.2.1.pom deleted file mode 100644 index 5f8afc32..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/xxl-rpc-1.2.1.pom +++ /dev/null @@ -1,151 +0,0 @@ - - 4.0.0 - com.xuxueli - xxl-rpc - 1.2.1 - pom - - ${project.artifactId} - A high performance, distributed RPC framework. - http://www.xuxueli.com/ - - - xxl-rpc-core - - - - - UTF-8 - UTF-8 - UTF-8 - 1.7 - 1.7 - - true - - - 3.1.0 - 2.3.3 - - 1.7.25 - 4.12 - - - 4.1.29.Final - 2.0.19 - 9.2.26.v20180806 - - 2.6.0 - - - 4.0.51 - - 1.6.0 - 2.6 - - 2.9.6 - - - 3.4.13 - - - 4.3.19.RELEASE - 1.5.16.RELEASE - - - - - - - - - - - GNU General Public License version 3 - https://opensource.org/licenses/GPL-3.0 - - - - - master - https://github.com/xuxueli/xxl-rpc.git - scm:git:https://github.com/xuxueli/xxl-rpc.git - scm:git:git@github.com:xuxueli/xxl-rpc.git - - - - XXL - xuxueli - 931591021@qq.com - https://github.com/xuxueli - - - - - - - release - - - - - org.apache.maven.plugins - maven-source-plugin - 3.0.1 - - - package - - jar-no-fork - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.0.0 - - - package - - jar - - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - false - - - - verify - - sign - - - - - - - - - oss - https://oss.sonatype.org/content/repositories/snapshots/ - - - oss - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - - - \ No newline at end of file diff --git a/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/xxl-rpc-1.2.1.pom.sha1 b/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/xxl-rpc-1.2.1.pom.sha1 deleted file mode 100644 index 2ebdd727..00000000 --- a/consumer/maven-repository/com/xuxueli/xxl-rpc/1.2.1/xxl-rpc-1.2.1.pom.sha1 +++ /dev/null @@ -1 +0,0 @@ -370f4c4f20b218942fba34d939cbc625025e1e30 \ No newline at end of file diff --git a/consumer/pom.xml b/consumer/pom.xml index dd25a81b..f743fae9 100644 --- a/consumer/pom.xml +++ b/consumer/pom.xml @@ -8,20 +8,21 @@ cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml cn.lili framework - 1.0.1 + ${revision} com.xuxueli xxl-job-core - 2.2.0 + ${xxl-job} diff --git a/consumer/src/main/java/cn/lili/ConsumerApplication.java b/consumer/src/main/java/cn/lili/ConsumerApplication.java index afa05d8e..7b695512 100644 --- a/consumer/src/main/java/cn/lili/ConsumerApplication.java +++ b/consumer/src/main/java/cn/lili/ConsumerApplication.java @@ -7,13 +7,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * 消费者 * * @author Chopper - * @date 2020/11/16 10:03 下午 + * @since 2020/11/16 10:03 下午 */ @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { System.setProperty("es.set.netty.runtime.available.processors", "false"); + System.setProperty("rocketmq.client.logUseSlf4j","true"); SpringApplication.run(ConsumerApplication.class, args); } diff --git a/consumer/src/main/java/cn/lili/event/AfterSaleStatusChangeEvent.java b/consumer/src/main/java/cn/lili/event/AfterSaleStatusChangeEvent.java index 9524e265..b81196e8 100644 --- a/consumer/src/main/java/cn/lili/event/AfterSaleStatusChangeEvent.java +++ b/consumer/src/main/java/cn/lili/event/AfterSaleStatusChangeEvent.java @@ -1,13 +1,13 @@ package cn.lili.event; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; /** * 售后单改变状态 * * @author Chopper - * @date 2020/11/17 7:13 下午 + * @since 2020/11/17 7:13 下午 */ public interface AfterSaleStatusChangeEvent { diff --git a/consumer/src/main/java/cn/lili/event/GoodsCommentCompleteEvent.java b/consumer/src/main/java/cn/lili/event/GoodsCommentCompleteEvent.java index 4ec0abfe..70c808a7 100644 --- a/consumer/src/main/java/cn/lili/event/GoodsCommentCompleteEvent.java +++ b/consumer/src/main/java/cn/lili/event/GoodsCommentCompleteEvent.java @@ -6,7 +6,7 @@ import cn.lili.modules.member.entity.dos.MemberEvaluation; * 订单状态改变事件 * * @author Chopper - * @date 2020/11/17 7:13 下午 + * @since 2020/11/17 7:13 下午 */ public interface GoodsCommentCompleteEvent { diff --git a/consumer/src/main/java/cn/lili/event/MemberConnectLoginEvent.java b/consumer/src/main/java/cn/lili/event/MemberConnectLoginEvent.java new file mode 100644 index 00000000..b103e214 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/MemberConnectLoginEvent.java @@ -0,0 +1,21 @@ +package cn.lili.event; + +import cn.lili.modules.connect.entity.dto.ConnectAuthUser; +import cn.lili.modules.member.entity.dos.Member; + +/** + * 会员联合登录消息 + * + * @author Chopper + * @since 2020/11/17 7:13 下午 + */ +public interface MemberConnectLoginEvent { + + /** + * 会员联合登录 + * + * @param member 会员 + * @param authUser 第三方登录 + */ + void memberConnectLogin(Member member, ConnectAuthUser authUser); +} diff --git a/consumer/src/main/java/cn/lili/event/MemberInfoChangeEvent.java b/consumer/src/main/java/cn/lili/event/MemberInfoChangeEvent.java new file mode 100644 index 00000000..51dbd391 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/MemberInfoChangeEvent.java @@ -0,0 +1,17 @@ +package cn.lili.event; + +import cn.lili.modules.member.entity.dos.Member; + +/** + * @author chc + * @since 2022/6/2114:46 + */ +public interface MemberInfoChangeEvent { + + /** + * 会员信息更改消息 + * + * @param member 会员信息 + */ + void memberInfoChange(Member member); +} diff --git a/consumer/src/main/java/cn/lili/event/MemberLoginEvent.java b/consumer/src/main/java/cn/lili/event/MemberLoginEvent.java new file mode 100644 index 00000000..cc00c400 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/MemberLoginEvent.java @@ -0,0 +1,19 @@ +package cn.lili.event; + +import cn.lili.modules.member.entity.dos.Member; + +/** + * 会员登录消息 + * + * @author Chopper + * @since 2020/11/17 7:13 下午 + */ +public interface MemberLoginEvent { + + /** + * 会员登录 + * + * @param member 会员 + */ + void memberLogin(Member member); +} diff --git a/consumer/src/main/java/cn/lili/event/MemberPointChangeEvent.java b/consumer/src/main/java/cn/lili/event/MemberPointChangeEvent.java index 3a87ddfa..7b9802fe 100644 --- a/consumer/src/main/java/cn/lili/event/MemberPointChangeEvent.java +++ b/consumer/src/main/java/cn/lili/event/MemberPointChangeEvent.java @@ -6,7 +6,7 @@ import cn.lili.modules.member.entity.dto.MemberPointMessage; * 会员积分改变消息 * * @author Chopper - * @date 2020/11/17 7:13 下午 + * @since 2020/11/17 7:13 下午 */ public interface MemberPointChangeEvent { diff --git a/consumer/src/main/java/cn/lili/event/MemberRegisterEvent.java b/consumer/src/main/java/cn/lili/event/MemberRegisterEvent.java index e9a32947..1264468e 100644 --- a/consumer/src/main/java/cn/lili/event/MemberRegisterEvent.java +++ b/consumer/src/main/java/cn/lili/event/MemberRegisterEvent.java @@ -6,12 +6,12 @@ import cn.lili.modules.member.entity.dos.Member; * 会员注册消息 * * @author Chopper - * @date 2020/11/17 7:13 下午 + * @since 2020/11/17 7:13 下午 */ public interface MemberRegisterEvent { /** - * 会员登录 + * 会员注册 * * @param member 会员 */ diff --git a/consumer/src/main/java/cn/lili/event/MemberWithdrawalEvent.java b/consumer/src/main/java/cn/lili/event/MemberWithdrawalEvent.java index 2738692a..97904347 100644 --- a/consumer/src/main/java/cn/lili/event/MemberWithdrawalEvent.java +++ b/consumer/src/main/java/cn/lili/event/MemberWithdrawalEvent.java @@ -1,12 +1,12 @@ package cn.lili.event; -import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; /** * 会员提现消息 * * @author Chopper - * @date 2020/11/17 7:13 下午 + * @since 2020/11/17 7:13 下午 */ public interface MemberWithdrawalEvent { diff --git a/consumer/src/main/java/cn/lili/event/OrderStatusChangeEvent.java b/consumer/src/main/java/cn/lili/event/OrderStatusChangeEvent.java index f1598758..f370392c 100644 --- a/consumer/src/main/java/cn/lili/event/OrderStatusChangeEvent.java +++ b/consumer/src/main/java/cn/lili/event/OrderStatusChangeEvent.java @@ -6,7 +6,7 @@ import cn.lili.modules.order.order.entity.dto.OrderMessage; * 订单状态改变事件 * * @author Chopper - * @date 2020/11/17 7:13 下午 + * @since 2020/11/17 7:13 下午 */ public interface OrderStatusChangeEvent { diff --git a/consumer/src/main/java/cn/lili/event/StoreSettingChangeEvent.java b/consumer/src/main/java/cn/lili/event/StoreSettingChangeEvent.java new file mode 100644 index 00000000..53fb83b6 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/StoreSettingChangeEvent.java @@ -0,0 +1,18 @@ +package cn.lili.event; + + +import cn.lili.modules.store.entity.dos.Store; + +/** + * @author chc + * @since 2022/6/2114:46 + */ +public interface StoreSettingChangeEvent { + + /** + * 店铺信息更改消息 + * + * @param store 店铺信息 + */ + void storeSettingChange(Store store); +} diff --git a/consumer/src/main/java/cn/lili/event/TradeEvent.java b/consumer/src/main/java/cn/lili/event/TradeEvent.java index 87316758..8d51eb13 100644 --- a/consumer/src/main/java/cn/lili/event/TradeEvent.java +++ b/consumer/src/main/java/cn/lili/event/TradeEvent.java @@ -6,7 +6,7 @@ import cn.lili.modules.order.cart.entity.dto.TradeDTO; * 订单创建消息 * * @author Chopper - * @date 2021/2/2 15:15 + * @since 2021/2/2 15:15 */ public interface TradeEvent { diff --git a/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java b/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java index b4eb9341..9c09c638 100644 --- a/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java @@ -1,64 +1,85 @@ package cn.lili.event.impl; +import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; +import cn.hutool.json.JSONUtil; import cn.lili.event.AfterSaleStatusChangeEvent; import cn.lili.event.OrderStatusChangeEvent; import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum; import cn.lili.modules.distribution.mapper.DistributionOrderMapper; import cn.lili.modules.distribution.service.DistributionOrderService; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.DistributionSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; import cn.lili.timetask.handler.EveryDayExecute; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; + /** * 分销订单入库 * * @author Chopper - * @date 2020-07-03 11:20 + * @since 2020-07-03 11:20 */ +@Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDayExecute, AfterSaleStatusChangeEvent { - //分销订单 - private final DistributionOrderService distributionOrderService; - //分销订单持久层 - private final DistributionOrderMapper distributionOrderMapper; + /** + * 分销订单 + */ + @Autowired + private DistributionOrderService distributionOrderService; + + @Autowired + private SettingService settingService; @Override public void orderChange(OrderMessage orderMessage) { switch (orderMessage.getNewStatus()) { - case PAID: { + //订单带校验/订单代发货/待自提,则记录分销信息 + case TAKE: + case STAY_PICKED_UP: + case UNDELIVERED: { //记录分销订单 - distributionOrderService.payOrder(orderMessage.getOrderSn()); + distributionOrderService.calculationDistribution(orderMessage.getOrderSn()); break; } case CANCELLED: { //修改分销订单状态 distributionOrderService.cancelOrder(orderMessage.getOrderSn()); + break; + } + default: { + break; } - break; } } @Override public void execute() { - //计算分销提佣 - distributionOrderMapper.rebate(DistributionOrderStatusEnum.WAIT_BILL.name(), new DateTime()); + log.info("分销订单定时开始执行"); + //设置结算天数(解冻日期) + Setting setting = settingService.get(SettingEnum.DISTRIBUTION_SETTING.name()); + DistributionSetting distributionSetting = JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class); + //解冻时间 + DateTime dateTime = new DateTime(); + //当前时间-结算天数=最终结算时间 + dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, -distributionSetting.getCashDay()); + //分销人员订单结算 + distributionOrderService.updateRebate(dateTime,DistributionOrderStatusEnum.WAIT_BILL.name()); - //修改分销订单状态 - distributionOrderService.update(new LambdaUpdateWrapper() - .eq(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.WAIT_BILL.name()) - .le(DistributionOrder::getSettleCycle, new DateTime()) - .set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.WAIT_CASH.name())); } @Override diff --git a/consumer/src/main/java/cn/lili/event/impl/FullDiscountExecute.java b/consumer/src/main/java/cn/lili/event/impl/FullDiscountExecute.java new file mode 100644 index 00000000..86a08cbb --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/FullDiscountExecute.java @@ -0,0 +1,251 @@ +package cn.lili.event.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.utils.SnowFlake; +import cn.lili.event.OrderStatusChangeEvent; +import cn.lili.event.TradeEvent; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.enums.GoodsTypeEnum; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.member.entity.enums.PointTypeEnum; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.entity.dto.OrderMessage; +import cn.lili.modules.order.order.entity.dto.OrderSearchParams; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.order.order.entity.enums.*; +import cn.lili.modules.order.order.service.OrderItemService; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.order.trade.entity.dos.OrderLog; +import cn.lili.modules.order.trade.service.OrderLogService; +import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.OrderTagsEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 订单状态处理类 + * + * @author Chopper + * @since 2020-07-03 11:20 + **/ +@Slf4j +@Service +public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent { + + + @Autowired + private Cache cache; + + + @Autowired + private MemberService memberService; + + @Autowired + private OrderService orderService; + + @Autowired + private OrderItemService orderItemService; + + @Autowired + private OrderLogService orderLogService; + @Autowired + private MemberCouponService memberCouponService; + + @Autowired + private GoodsSkuService goodsSkuService; + + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Override + public void orderCreate(TradeDTO tradeDTO) { + + tradeDTO.getCartList().forEach( + cartVO -> { + //有满减优惠,则记录信息 + if ((cartVO.getGiftList() != null && !cartVO.getGiftList().isEmpty()) + || (cartVO.getGiftPoint() != null && cartVO.getGiftPoint() > 0) + || (cartVO.getGiftCouponList() != null && !cartVO.getGiftCouponList().isEmpty())) { + cache.put(CachePrefix.ORDER.getPrefix() + cartVO.getSn(), JSONUtil.toJsonStr(cartVO)); + } + } + ); + } + + @Override + public void orderChange(OrderMessage orderMessage) { + //如果订单已支付 + if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) { + log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()); + renderGift(JSONUtil.toBean(cache.getString(CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()), CartVO.class), orderMessage); + } else if (orderMessage.getNewStatus().equals(OrderStatusEnum.CANCELLED)) { + log.debug("满减活动,取消订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()); + OrderSearchParams searchParams = new OrderSearchParams(); + searchParams.setParentOrderSn(orderMessage.getOrderSn()); + searchParams.setOrderPromotionType(OrderPromotionTypeEnum.GIFT.name()); + List orders = orderService.queryListByParams(searchParams); + if (orders != null && !orders.isEmpty()) { + orderService.systemCancel(orders.get(0).getSn(),"主订单取消,赠送订单字段自动取消"); + } + } + } + + /** + * 渲染优惠券信息 + */ + private void renderGift(CartVO cartVO, OrderMessage orderMessage) { + //没有优惠信息则跳过 + if (cartVO == null) { + return; + } + Order order = orderService.getBySn(orderMessage.getOrderSn()); + //赠送积分判定 + try { + if (cartVO.getGiftPoint() != null && cartVO.getGiftPoint() > 0) { + memberService.updateMemberPoint(cartVO.getGiftPoint().longValue(), PointTypeEnum.INCREASE.name(), + order.getMemberId(), "订单满优惠赠送积分" + cartVO.getGiftPoint()); + } + } catch (Exception e) { + log.error("订单赠送积分异常", e); + } + + + try { + //优惠券判定 + if (cartVO.getGiftCouponList() != null && !cartVO.getGiftCouponList().isEmpty()) { + cartVO.getGiftCouponList().forEach(couponId -> memberCouponService.receiveCoupon(couponId, order.getMemberId(), order.getMemberName())); + } + } catch (Exception e) { + log.error("订单赠送优惠券异常", e); + } + + try { + //赠品潘迪ing + if (cartVO.getGiftList() != null && !cartVO.getGiftList().isEmpty()) { + generatorGiftOrder(cartVO.getGiftList(), order); + } + } catch (Exception e) { + log.error("订单赠送赠品异常", e); + } + } + + /** + * 生成赠品订单 + * + * @param skuIds 赠品sku信息 + * @param originOrder 赠品原订单信息 + */ + private void generatorGiftOrder(List skuIds, Order originOrder) { + //获取赠品列表 + List goodsSkus = goodsSkuService.getGoodsSkuByIdFromCache(skuIds); + + //赠品判定 + if (goodsSkus == null || goodsSkus.isEmpty()) { + log.error("赠品不存在:{}", skuIds); + return; + } + + //赠品分类,分为实体商品/虚拟商品/电子卡券 + List physicalSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.PHYSICAL_GOODS.name())).collect(Collectors.toList()); + List virtualSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.VIRTUAL_GOODS.name())).collect(Collectors.toList()); + List eCouponSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.E_COUPON.name())).collect(Collectors.toList()); + + //如果赠品不为空,则生成对应的赠品订单 + if (!physicalSkus.isEmpty()) { + giftOrderHandler(physicalSkus, originOrder, OrderTypeEnum.NORMAL); + } + if (!virtualSkus.isEmpty()) { + giftOrderHandler(virtualSkus, originOrder, OrderTypeEnum.VIRTUAL); + } + if (!eCouponSkus.isEmpty()) { + giftOrderHandler(eCouponSkus, originOrder, OrderTypeEnum.E_COUPON); + } + } + + /** + * 赠品订单处理 + * + * @param skuList 赠品列表 + * @param originOrder 原始订单 + * @param orderTypeEnum 订单类型 + */ + private void giftOrderHandler(List skuList, Order originOrder, OrderTypeEnum orderTypeEnum) { + //初始化订单对象/订单日志/自订单 + Order order = new Order(); + List orderItems = new ArrayList<>(); + List orderLogs = new ArrayList<>(); + //初始化价格详情 + PriceDetailDTO priceDetailDTO = new PriceDetailDTO(); + //复制通用属性 + BeanUtil.copyProperties(originOrder, order, "id"); + BeanUtil.copyProperties(priceDetailDTO, order, "id"); + //生成订单参数 + order.setSn(SnowFlake.createStr("G")); + order.setParentOrderSn(originOrder.getSn()); + order.setOrderPromotionType(OrderPromotionTypeEnum.GIFT.name()); + order.setOrderStatus(OrderStatusEnum.UNPAID.name()); + order.setPayStatus(PayStatusEnum.PAID.name()); + order.setOrderType(orderTypeEnum.name()); + order.setNeedReceipt(false); + order.setPriceDetailDTO(priceDetailDTO); + order.setClientType(originOrder.getClientType()); + //订单日志 + String message = "赠品订单[" + order.getSn() + "]创建"; + orderLogs.add(new OrderLog(order.getSn(), originOrder.getMemberId(), UserEnums.MEMBER.name(), originOrder.getMemberName(), message)); + + //生成子订单 + for (GoodsSku goodsSku : skuList) { + OrderItem orderItem = new OrderItem(); + BeanUtil.copyProperties(goodsSku, orderItem, "id"); + BeanUtil.copyProperties(priceDetailDTO, orderItem, "id"); + orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name()); + orderItem.setCommentStatus(CommentStatusEnum.NEW.name()); + orderItem.setComplainStatus(OrderComplaintStatusEnum.NEW.name()); + orderItem.setNum(1); + orderItem.setOrderSn(order.getSn()); + orderItem.setImage(goodsSku.getThumbnail()); + orderItem.setGoodsName(goodsSku.getGoodsName()); + orderItem.setSkuId(goodsSku.getId()); + orderItem.setCategoryId(goodsSku.getCategoryPath().substring( + goodsSku.getCategoryPath().lastIndexOf(",") + 1 + )); + orderItem.setGoodsPrice(goodsSku.getPrice()); + orderItem.setPriceDetailDTO(priceDetailDTO); + orderItems.add(orderItem); + } + //保存订单 + orderService.save(order); + orderItemService.saveBatch(orderItems); + orderLogService.saveBatch(orderLogs); + + + //发送订单已付款消息(PS:不在这里处理逻辑是因为期望加交给消费者统一处理库存等等问题) + OrderMessage orderMessage = new OrderMessage(); + orderMessage.setOrderSn(order.getSn()); + orderMessage.setPaymentMethod(order.getPaymentMethod()); + orderMessage.setNewStatus(OrderStatusEnum.PAID); + + String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name(); + //发送订单变更mq消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback()); + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/GoodsSkuExecute.java b/consumer/src/main/java/cn/lili/event/impl/GoodsSkuExecute.java index 6d31a2d0..47b77d6f 100644 --- a/consumer/src/main/java/cn/lili/event/impl/GoodsSkuExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/GoodsSkuExecute.java @@ -1,30 +1,53 @@ package cn.lili.event.impl; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.event.GoodsCommentCompleteEvent; +import cn.lili.event.StoreSettingChangeEvent; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dto.GoodsSearchParams; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.member.entity.dos.MemberEvaluation; - -import lombok.RequiredArgsConstructor; +import cn.lili.modules.store.entity.dos.Store; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * 商品SKU变化 * * @author Chopper - * @date 2020-07-03 11:20 + * @since 2020-07-03 11:20 */ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class GoodsSkuExecute implements GoodsCommentCompleteEvent { +public class GoodsSkuExecute implements GoodsCommentCompleteEvent, StoreSettingChangeEvent { - //商品 - private final GoodsSkuService goodsSkuService; + /** + * 商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + @Autowired + private Cache cache; @Override public void goodsComment(MemberEvaluation memberEvaluation) { goodsSkuService.updateGoodsSkuCommentNum(memberEvaluation.getSkuId()); } + + @Override + public void storeSettingChange(Store store) { + //修改数据后,清除商品索引 + GoodsSearchParams goodsSearchParams = new GoodsSearchParams(); + goodsSearchParams.setStoreId(store.getId()); + List goodsSkuKeys = new ArrayList<>(); + for (GoodsSku goodsSku : goodsSkuService.getGoodsSkuByList(goodsSearchParams)) { + goodsSkuKeys.add(CachePrefix.GOODS_SKU.getPrefix()+goodsSku.getId()); + } + cache.multiDel(goodsSkuKeys); + } } diff --git a/consumer/src/main/java/cn/lili/event/impl/ImTalkExecute.java b/consumer/src/main/java/cn/lili/event/impl/ImTalkExecute.java new file mode 100644 index 00000000..b631589f --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/ImTalkExecute.java @@ -0,0 +1,60 @@ +package cn.lili.event.impl; + +import cn.lili.event.MemberInfoChangeEvent; +import cn.lili.event.StoreSettingChangeEvent; +import cn.lili.modules.im.entity.dos.ImTalk; +import cn.lili.modules.im.service.ImTalkService; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.store.entity.dos.Store; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Im对话消息 + * + * @author chc + * @since 2022/6/2114:46 + */ +@Service +public class ImTalkExecute implements MemberInfoChangeEvent, StoreSettingChangeEvent { + + @Autowired + private ImTalkService imTalkService; + + @Override + public void memberInfoChange(Member member) { + //当与UserId1相等时 + List imTalkList1 = imTalkService.list(new LambdaQueryWrapper().eq(ImTalk::getUserId1, member.getId())); + for (ImTalk imTalk : imTalkList1) { + imTalk.setName1(member.getNickName()); + imTalk.setFace1(member.getFace()); + } + imTalkService.updateBatchById(imTalkList1); + List imTalkList2 = imTalkService.list(new LambdaQueryWrapper().eq(ImTalk::getUserId2, member.getId())); + for (ImTalk imTalk : imTalkList2) { + imTalk.setName2(member.getNickName()); + imTalk.setFace2(member.getFace()); + } + imTalkService.updateBatchById(imTalkList2); + } + + @Override + public void storeSettingChange(Store store) { + //当与UserId1相等时 + List imTalkList1 = imTalkService.list(new LambdaQueryWrapper().eq(ImTalk::getUserId1, store.getId())); + for (ImTalk imTalk : imTalkList1) { + imTalk.setName1(store.getStoreName()); + imTalk.setFace1(store.getStoreLogo()); + } + imTalkService.updateBatchById(imTalkList1); + List imTalkList2 = imTalkService.list(new LambdaQueryWrapper().eq(ImTalk::getUserId2, store.getId())); + for (ImTalk imTalk : imTalkList2) { + imTalk.setName2(store.getStoreName()); + imTalk.setFace2(store.getStoreLogo()); + } + imTalkService.updateBatchById(imTalkList2); + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberCouponExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberCouponExecute.java new file mode 100644 index 00000000..fc567b35 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/MemberCouponExecute.java @@ -0,0 +1,65 @@ +package cn.lili.event.impl; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.event.AfterSaleStatusChangeEvent; +import cn.lili.event.OrderStatusChangeEvent; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderMessage; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; +import cn.lili.modules.promotion.service.MemberCouponService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 会员优惠券执行类 + * + * @author paulG + * @since 2022/8/12 + **/ +@Service +public class MemberCouponExecute implements OrderStatusChangeEvent, AfterSaleStatusChangeEvent { + + /** + * 订单 + */ + @Autowired + private OrderService orderService; + + @Autowired + private MemberCouponService memberCouponService; + + @Override + public void orderChange(OrderMessage orderMessage) { + // 订单取消返还优惠券 + if (orderMessage.getNewStatus() == OrderStatusEnum.CANCELLED) { + this.refundCoupon(orderMessage.getOrderSn()); + } + } + + + @Override + public void afterSaleStatusChange(AfterSale afterSale) { + // 售后完成返还优惠券 + if (afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name())) { + this.refundCoupon(afterSale.getOrderSn()); + } + } + + /** + * 退款返还优惠券 + * @param orderSn 订单编号 + */ + private void refundCoupon(String orderSn) { + Order order = orderService.getBySn(orderSn); + if (CharSequenceUtil.isNotEmpty(order.getUseStoreMemberCouponIds())) { + memberCouponService.recoveryMemberCoupon(ListUtil.toList(order.getUseStoreMemberCouponIds().split(","))); + } + if (CharSequenceUtil.isNotEmpty(order.getUsePlatformMemberCouponId())) { + memberCouponService.recoveryMemberCoupon(ListUtil.toList(order.getUsePlatformMemberCouponId().split(","))); + } + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java new file mode 100644 index 00000000..426c5817 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/MemberExecute.java @@ -0,0 +1,58 @@ +package cn.lili.event.impl; + +import cn.hutool.core.util.StrUtil; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.event.MemberConnectLoginEvent; +import cn.lili.event.MemberLoginEvent; +import cn.lili.modules.connect.entity.dto.ConnectAuthUser; +import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; +import cn.lili.modules.connect.service.ConnectService; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.system.service.SettingService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 会员自身业务 + * 会员登录,会员第三方登录 + * + * @author Chopper + * @version v1.0 + * 2022-01-11 11:08 + */ +@Slf4j +@Service +public class MemberExecute implements MemberLoginEvent, MemberConnectLoginEvent { + @Autowired + private MemberService memberService; + @Autowired + private ConnectService connectService; + @Autowired + private SettingService settingService; + + @Override + public void memberLogin(Member member) { + memberService.updateMemberLoginTime(member.getId()); + } + + @Override + public void memberConnectLogin(Member member, ConnectAuthUser authUser) { + //保存UnionID + if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) { + connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getSource().name()); + } + //保存OpenID + if (StrUtil.isNotBlank(authUser.getUuid())) { + SourceEnum sourceEnum = SourceEnum.getSourceEnum(authUser.getSource(), authUser.getType()); + connectService.loginBindUser(member.getId(), authUser.getUuid(), sourceEnum.name()); + } + //保存手机号,判断用户是否存手机号,如果不存在则保存手机号 + if (StrUtil.isNotBlank(authUser.getPhone())&&StrUtil.isBlank(member.getMobile())) { + memberService.changeMobile(member.getId(),member.getMobile()); + } + + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java new file mode 100644 index 00000000..d8f33e23 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java @@ -0,0 +1,102 @@ +package cn.lili.event.impl; + + +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.event.GoodsCommentCompleteEvent; +import cn.lili.event.MemberRegisterEvent; +import cn.lili.event.OrderStatusChangeEvent; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dos.MemberEvaluation; +import cn.lili.modules.member.entity.enums.PointTypeEnum; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderMessage; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.ExperienceSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import com.google.gson.Gson; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 会员经验值 + * + * @author Bulbasaur + * @since 2021/5/16 11:16 下午 + */ +//@Service +public class MemberExperienceExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent, OrderStatusChangeEvent { + + /** + * 配置 + */ + @Autowired + private SettingService settingService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + + /** + * 会员注册赠送经验值 + * + * @param member 会员 + */ + @Override + public void memberRegister(Member member) { + //获取经验值设置 + ExperienceSetting experienceSetting = getExperienceSetting(); + //赠送会员经验值 + memberService.updateMemberPoint(Long.valueOf(experienceSetting.getRegister().longValue()), PointTypeEnum.INCREASE.name(), member.getId(), "会员注册,赠送经验值" + experienceSetting.getRegister()); + } + + /** + * 商品评价赠送经验值 + * + * @param memberEvaluation 会员评价 + */ + @Override + public void goodsComment(MemberEvaluation memberEvaluation) { + //获取经验值设置 + ExperienceSetting experienceSetting = getExperienceSetting(); + //赠送会员经验值 + memberService.updateMemberPoint(Long.valueOf(experienceSetting.getComment().longValue()), PointTypeEnum.INCREASE.name(), memberEvaluation.getMemberId(), "会员评价,赠送经验值" + experienceSetting.getComment()); + } + + /** + * 完成订单赠送经验值 + * + * @param orderMessage 订单消息 + */ + @Override + public void orderChange(OrderMessage orderMessage) { + if (orderMessage.getNewStatus().equals(OrderStatusEnum.COMPLETED)) { + //获取经验值设置 + ExperienceSetting experienceSetting = getExperienceSetting(); + //获取订单信息 + Order order = orderService.getBySn(orderMessage.getOrderSn()); + //计算赠送经验值数量 + Double point = CurrencyUtil.mul(experienceSetting.getMoney(), order.getFlowPrice(), 0); + //赠送会员经验值 + memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送经验值" + point + "分"); + } + } + + /** + * 获取经验值设置 + * + * @return 经验值设置 + */ + private ExperienceSetting getExperienceSetting() { + Setting setting = settingService.get(SettingEnum.EXPERIENCE_SETTING.name()); + return new Gson().fromJson(setting.getSettingValue(), ExperienceSetting.class); + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java index a563978c..478cf0ac 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java @@ -1,51 +1,156 @@ package cn.lili.event.impl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.event.AfterSaleStatusChangeEvent; import cn.lili.event.GoodsCommentCompleteEvent; import cn.lili.event.MemberRegisterEvent; +import cn.lili.event.OrderStatusChangeEvent; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberEvaluation; +import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.member.service.MemberWalletService; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderMessage; +import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum; +import cn.lili.modules.order.order.entity.enums.PayStatusEnum; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.PointSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 会员积分 * - * @author Chopper - * @date 2020-07-03 11:20 + * @author Bulbasaur + * @since 2020-07-03 11:20 */ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent { +public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent, OrderStatusChangeEvent, AfterSaleStatusChangeEvent { - //配置 - private final SettingService settingService; - //会员 - private final MemberService memberService; + /** + * 配置 + */ + @Autowired + private SettingService settingService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 会员注册赠送积分 + * + * @param member 会员 + */ @Override public void memberRegister(Member member) { - //获取签到积分赠送设置 - Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); - PointSetting pointSetting = new Gson().fromJson(setting.getSettingValue(), PointSetting.class); + //获取积分设置 + PointSetting pointSetting = getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getRegister().longValue()), 1, member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); + memberService.updateMemberPoint(pointSetting.getRegister().longValue(), PointTypeEnum.INCREASE.name(), member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); } + /** + * 会员评价赠送积分 + * + * @param memberEvaluation 会员评价 + */ @Override public void goodsComment(MemberEvaluation memberEvaluation) { - //获取签到积分赠送设置 - Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); - PointSetting pointSetting = new Gson().fromJson(setting.getSettingValue(), PointSetting.class); + //获取积分设置 + PointSetting pointSetting = getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getComment().longValue()), 1, memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); + memberService.updateMemberPoint(pointSetting.getComment().longValue(), PointTypeEnum.INCREASE.name(), memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); + } + + /** + * 非积分订单订单完成后赠送积分 + * + * @param orderMessage 订单消息 + */ + @Override + public void orderChange(OrderMessage orderMessage) { + + switch (orderMessage.getNewStatus()) { + case CANCELLED: { + Order order = orderService.getBySn(orderMessage.getOrderSn()); + Long point = order.getPriceDetailDTO().getPayPoint(); + if (point <= 0) { + return; + } + //如果未付款,则不去要退回相关代码执行 + if (order.getPayStatus().equals(PayStatusEnum.UNPAID.name())) { + return; + } + String content = "订单取消,积分返还:" + point + "分"; + //赠送会员积分 + memberService.updateMemberPoint(point, PointTypeEnum.INCREASE.name(), order.getMemberId(), content); + break; + } + case COMPLETED: { + Order order = orderService.getBySn(orderMessage.getOrderSn()); + //如果是积分订单 则直接返回 + if (CharSequenceUtil.isNotEmpty(order.getOrderPromotionType()) + && order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name())) { + return; + } + //获取积分设置 + PointSetting pointSetting = getPointSetting(); + if (pointSetting.getConsumer() == 0) { + return; + } + //计算赠送积分数量 + Double point = CurrencyUtil.mul(pointSetting.getConsumer(), order.getFlowPrice(), 0); + //赠送会员积分 + memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送积分" + point + "分"); + break; + } + + default: + break; + } + } + + + /** + * 提交售后后扣除积分 + * + * @param afterSale 售后 + */ + @Override + public void afterSaleStatusChange(AfterSale afterSale) { + if (afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name())) { + //获取积分设置 + PointSetting pointSetting = getPointSetting(); + //计算扣除积分数量 + Double point = CurrencyUtil.mul(pointSetting.getMoney(), afterSale.getActualRefundPrice(), 0); + //扣除会员积分 + memberService.updateMemberPoint(point.longValue(), PointTypeEnum.REDUCE.name(), afterSale.getMemberId(), "会员退款,回退积分" + point + "分"); + + } + } + + /** + * 获取积分设置 + * + * @return 积分设置 + */ + private PointSetting getPointSetting() { + Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); + return new Gson().fromJson(setting.getSettingValue(), PointSetting.class); } } diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java index e2499f9d..b836b591 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberWalletExecute.java @@ -1,10 +1,12 @@ package cn.lili.event.impl; -import cn.lili.event.MemberRegisterEvent; -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.service.MemberWalletService; -import lombok.RequiredArgsConstructor; +import cn.lili.event.MemberWithdrawalEvent; +import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; +import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; +import cn.lili.modules.wallet.service.MemberWalletService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,16 +14,38 @@ import org.springframework.stereotype.Service; * 会员钱包创建 * * @author Chopper - * @date 2020-07-03 11:20 + * @since 2020-07-03 11:20 */ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MemberWalletExecute implements MemberRegisterEvent { +public class MemberWalletExecute implements MemberWithdrawalEvent { - private final MemberWalletService memberWalletService; + @Autowired + private MemberWalletService memberWalletService; @Override - public void memberRegister(Member member) { - memberWalletService.save(member.getId(),member.getUsername()); + public void memberWithdrawal(MemberWithdrawalMessage memberWithdrawalMessage) { + switch (WithdrawStatusEnum.valueOf(memberWithdrawalMessage.getStatus())) { + case VIA_AUDITING: + memberWalletService.withdrawal(memberWithdrawalMessage.getMemberWithdrawApplyId()); + break; + case SUCCESS: + //提现成功扣减冻结金额 + memberWalletService.reduceFrozen( + new MemberWalletUpdateDTO(memberWithdrawalMessage.getPrice(), memberWithdrawalMessage.getMemberId(), "提现成功,余额提现", + DepositServiceTypeEnum.WALLET_WITHDRAWAL.name())); + break; + case ERROR: + //需要从冻结金额扣减到余额 + memberWalletService.increaseWithdrawal(new MemberWalletUpdateDTO(memberWithdrawalMessage.getPrice(), + memberWithdrawalMessage.getMemberId(), "第三方提现失败,提现金额解冻到余额", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name())); + break; + case FAIL_AUDITING: + //需要从冻结金额扣减到余额 + memberWalletService.increaseWithdrawal(new MemberWalletUpdateDTO(memberWithdrawalMessage.getPrice(), + memberWithdrawalMessage.getMemberId(), "审核拒绝,提现金额解冻到余额", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name())); + break; + default: + break; + } } } diff --git a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java index e0ab8288..3dfc8b1e 100644 --- a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java @@ -2,21 +2,21 @@ package cn.lili.event.impl; import cn.lili.event.*; import cn.lili.modules.member.entity.dto.MemberPointMessage; -import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage; -import cn.lili.modules.member.entity.enums.MemberWithdrawalDestinationEnum; +import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.message.entity.dto.NoticeMessageDTO; import cn.lili.modules.message.entity.enums.NoticeMessageNodeEnum; import cn.lili.modules.message.entity.enums.NoticeMessageParameterEnum; import cn.lili.modules.message.service.NoticeMessageService; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.order.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.dto.OrderMessage; -import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; +import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -28,15 +28,15 @@ import java.util.Map; * 通知类消息实现 * * @author Chopper - * @date 2020-07-03 11:20 + * @since 2020-07-03 11:20 **/ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, AfterSaleStatusChangeEvent, MemberPointChangeEvent, MemberWithdrawalEvent { - private final NoticeMessageService noticeMessageService; - - private final OrderService orderService; + @Autowired + private NoticeMessageService noticeMessageService; + @Autowired + private OrderService orderService; @Override @@ -45,7 +45,7 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); noticeMessageDTO.setMemberId(tradeDTO.getMemberId()); noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.ORDER_CREATE_SUCCESS); - Map params = new HashMap<>(); + Map params = new HashMap<>(2); params.put("goods", tradeDTO.getSkuList().get(0).getGoodsSku().getGoodsName()); noticeMessageDTO.setParameter(params); //保存站内信 @@ -59,8 +59,8 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); //如果订单状态不为空 if (orderDetailVO != null) { - Map params = new HashMap<>(); - switch (orderMessage.getNewStatus()){ + Map params = new HashMap<>(2); + switch (orderMessage.getNewStatus()) { //如果订单新的状态为已取消 则发送取消订单站内信 case CANCELLED: params.put(NoticeMessageParameterEnum.CANCEL_REASON.getType(), orderDetailVO.getOrder().getCancelReason()); @@ -83,7 +83,7 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, break; //如果是拼团订单,发送拼团成功消息 case UNDELIVERED: - if(orderDetailVO.getOrder().getOrderType().equals(OrderTypeEnum.PINTUAN.name())){ + if (OrderPromotionTypeEnum.PINTUAN.name().equals(orderDetailVO.getOrder().getOrderPromotionType())) { //拼团成功消息 noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.PINTUAN_SUCCESS); } @@ -95,8 +95,12 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, //添加站内信参数 params.put(NoticeMessageParameterEnum.GOODS.getType(), orderDetailVO.getOrderItems().get(0).getGoodsName()); noticeMessageDTO.setParameter(params); - //保存站内信 - noticeMessageService.noticeMessage(noticeMessageDTO); + + //如果有消息,则发送消息 + if (noticeMessageDTO.getNoticeMessageNodeEnum() != null) { + //保存站内信 + noticeMessageService.noticeMessage(noticeMessageDTO); + } } } @@ -104,7 +108,7 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, public void afterSaleStatusChange(AfterSale afterSale) { NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); noticeMessageDTO.setMemberId(afterSale.getMemberId()); - Map params = new HashMap<>(); + Map params = new HashMap<>(2); params.put("goods", afterSale.getGoodsName()); params.put("refuse", afterSale.getAuditRemark()); noticeMessageDTO.setParameter(params); @@ -149,11 +153,14 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, @Override public void memberPointChange(MemberPointMessage memberPointMessage) { + if (memberPointMessage == null) { + return; + } //组织站内信参数 NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); noticeMessageDTO.setMemberId(memberPointMessage.getMemberId()); - Map params = new HashMap<>(); - if (memberPointMessage.getType().equals(1)) { + Map params = new HashMap<>(2); + if (memberPointMessage.getType().equals(PointTypeEnum.INCREASE.name())) { params.put("expenditure_points", "0"); params.put("income_points", memberPointMessage.getPoint().toString()); } else { @@ -169,28 +176,32 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, @Override public void memberWithdrawal(MemberWithdrawalMessage memberWithdrawalMessage) { - - //如果提现到余额 - if (memberWithdrawalMessage.getDestination().equals(MemberWithdrawalDestinationEnum.WALLET.name())) { - - //组织参数 - NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); - noticeMessageDTO.setMemberId(memberWithdrawalMessage.getMemberId()); - Map params = new HashMap<>(); - params.put("income", memberWithdrawalMessage.getPrice().toString()); - noticeMessageDTO.setParameter(params); - noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_SUCCESS); - //发送提现申请成功消息 - noticeMessageService.noticeMessage(noticeMessageDTO); - - params.put("income", memberWithdrawalMessage.getPrice().toString()); - params.put("expenditure", "0"); - noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_CHANGE); - noticeMessageDTO.setParameter(params); - //发送余额变动消息 - noticeMessageService.noticeMessage(noticeMessageDTO); + NoticeMessageDTO noticeMessageDTO = new NoticeMessageDTO(); + noticeMessageDTO.setMemberId(memberWithdrawalMessage.getMemberId()); + Map params = new HashMap<>(2); + switch (WithdrawStatusEnum.valueOf(memberWithdrawalMessage.getStatus())) { + case APPLY: + //如果提现状态为申请则发送申请提现站内消息 + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_CREATE); + break; + case FAIL_AUDITING: + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_AUDIT_ERROR); + break; + case SUCCESS: + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_SUCCESS); + break; + case ERROR: + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_ERROR); + break; + case VIA_AUDITING: + noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.WALLET_WITHDRAWAL_AUDIT_SUCCESS); + default: + break; } - + params.put("price", memberWithdrawalMessage.getPrice().toString()); + noticeMessageDTO.setParameter(params); + //发送提现申请消息 + noticeMessageService.noticeMessage(noticeMessageDTO); } } diff --git a/consumer/src/main/java/cn/lili/event/impl/OrderCreateReceiptExecute.java b/consumer/src/main/java/cn/lili/event/impl/OrderCreateReceiptExecute.java index 138c217a..a7126774 100644 --- a/consumer/src/main/java/cn/lili/event/impl/OrderCreateReceiptExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/OrderCreateReceiptExecute.java @@ -8,7 +8,6 @@ import cn.lili.modules.order.order.entity.dos.Receipt; import cn.lili.modules.order.order.entity.vo.OrderVO; import cn.lili.modules.order.order.entity.vo.ReceiptVO; import cn.lili.modules.order.order.service.ReceiptService; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,13 +18,13 @@ import java.util.List; * 订单创建发票相关处理 * * @author Chopper - * @date 2020-07-03 11:20 + * @since 2020-07-03 11:20 **/ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderCreateReceiptExecute implements TradeEvent { - private final ReceiptService receiptService; + @Autowired + private ReceiptService receiptService; @Override public void orderCreate(TradeDTO tradeDTO) { @@ -34,25 +33,23 @@ public class OrderCreateReceiptExecute implements TradeEvent { //获取发票信息 ReceiptVO receiptVO = tradeDTO.getReceiptVO(); //如果需要获取发票则保存发票信息 - if (tradeDTO.getNeedReceipt()) { - if (orderList.size() > 0) { - List receipts = new ArrayList<>(); - for (OrderVO orderVO : orderList) { - Receipt receipt = new Receipt(); - BeanUtil.copyProperties(receiptVO, receipt); - receipt.setMemberId(orderVO.getMemberId()); - receipt.setMemberName(orderVO.getMemberName()); - receipt.setStoreId(orderVO.getStoreId()); - receipt.setStoreName(orderVO.getStoreName()); - receipt.setOrderSn(orderVO.getSn()); - receipt.setReceiptDetail(JSONUtil.toJsonStr(orderVO.getOrderItems())); - receipt.setReceiptPrice(orderVO.getFlowPrice()); - receipt.setReceiptStatus(0); - receipts.add(receipt); - } - //保存发票 - receiptService.saveBatch(receipts); + if (Boolean.TRUE.equals(tradeDTO.getNeedReceipt()) && !orderList.isEmpty()) { + List receipts = new ArrayList<>(); + for (OrderVO orderVO : orderList) { + Receipt receipt = new Receipt(); + BeanUtil.copyProperties(receiptVO, receipt); + receipt.setMemberId(orderVO.getMemberId()); + receipt.setMemberName(orderVO.getMemberName()); + receipt.setStoreId(orderVO.getStoreId()); + receipt.setStoreName(orderVO.getStoreName()); + receipt.setOrderSn(orderVO.getSn()); + receipt.setReceiptDetail(JSONUtil.toJsonStr(orderVO.getOrderItems())); + receipt.setReceiptPrice(orderVO.getFlowPrice()); + receipt.setReceiptStatus(0); + receipts.add(receipt); } + //保存发票 + receiptService.saveBatch(receipts); } } } diff --git a/consumer/src/main/java/cn/lili/event/impl/OrderStatusHandlerExecute.java b/consumer/src/main/java/cn/lili/event/impl/OrderStatusHandlerExecute.java new file mode 100644 index 00000000..b9a4717f --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/OrderStatusHandlerExecute.java @@ -0,0 +1,31 @@ +package cn.lili.event.impl; + +import cn.lili.event.TradeEvent; +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.order.service.TradeService; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 订单状态处理类 + * + * @author Chopper + * @since 2020-07-03 11:20 + **/ +@Service +public class OrderStatusHandlerExecute implements TradeEvent { + + + @Autowired + private TradeService tradeService; + + @Override + public void orderCreate(TradeDTO tradeDTO) { + //如果订单需要支付金额为0,则将订单步入到下一个流程 + if (tradeDTO.getPriceDetailDTO().getFlowPrice() <= 0) { + tradeService.payTrade(tradeDTO.getSn(), PaymentMethodEnum.BANK_TRANSFER.name(), "-1"); + } + + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java b/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java index 2c4cd46d..deb3fa65 100644 --- a/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java @@ -5,13 +5,13 @@ import cn.lili.common.utils.SpringContextUtil; import cn.lili.event.OrderStatusChangeEvent; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dto.OrderMessage; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.payment.entity.RefundLog; import cn.lili.modules.payment.kit.Payment; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; -import cn.lili.modules.payment.service.PaymentService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,62 +19,47 @@ import org.springframework.stereotype.Service; * 支付 * * @author Chopper - * @date 2021-03-13 16:58 + * @since 2021-03-13 16:58 */ +@Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PaymentExecute implements OrderStatusChangeEvent { - //支付日志 - private final PaymentService paymentService; - //订单 - private final OrderService orderService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; @Override public void orderChange(OrderMessage orderMessage) { - switch (orderMessage.getNewStatus()) { - case CANCELLED: - Order order = orderService.getBySn(orderMessage.getOrderSn()); - //未付款不做处理 直接返回 - if (order.getPayStatus() == PayStatusEnum.UNPAID.name()) { - return; - } + if (orderMessage.getNewStatus() == OrderStatusEnum.CANCELLED) { + Order order = orderService.getBySn(orderMessage.getOrderSn()); - PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(order.getPaymentMethod()); - //进行退款操作 - switch (paymentMethodEnum) { - case WALLET: - case ALIPAY: - case WECHAT: - //获取支付方式 - Payment payment = - (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin()); + //如果未付款,则不去要退回相关代码执行 + if (order.getPayStatus().equals(PayStatusEnum.UNPAID.name())) { + return; + } + PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(order.getPaymentMethod()); - RefundLog refundLog = RefundLog.builder() - .isRefund(false) - .totalAmount(order.getFlowPrice()) - .payPrice(order.getFlowPrice()) - .memberId(order.getMemberId()) - .paymentName(order.getPaymentMethod()) - .afterSaleNo("订单取消") - .orderSn(order.getSn()) - .paymentReceivableNo(order.getReceivableNo()) - .outOrderNo("AF" + SnowFlake.getIdStr()) - .outOrderNo("AF" + SnowFlake.getIdStr()) - .refundReason("订单取消") - .build(); - payment.cancel(refundLog); - break; - case BANK_TRANSFER: - break; - } - default: - break; + //获取支付方式 + Payment payment = + (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin()); + + RefundLog refundLog = RefundLog.builder() + .isRefund(false) + .totalAmount(order.getFlowPrice()) + .payPrice(order.getFlowPrice()) + .memberId(order.getMemberId()) + .paymentName(order.getPaymentMethod()) + .afterSaleNo("订单取消") + .orderSn(order.getSn()) + .paymentReceivableNo(order.getReceivableNo()) + .outOrderNo("AF" + SnowFlake.getIdStr()) + .refundReason("订单取消") + .build(); + payment.refund(refundLog); } - - } - - } diff --git a/consumer/src/main/java/cn/lili/event/impl/RegisteredCouponActivityExecute.java b/consumer/src/main/java/cn/lili/event/impl/RegisteredCouponActivityExecute.java new file mode 100644 index 00000000..ccd14038 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/RegisteredCouponActivityExecute.java @@ -0,0 +1,59 @@ +package cn.lili.event.impl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.event.MemberRegisterEvent; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.promotion.entity.dto.CouponActivityTrigger; +import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; +import cn.lili.modules.promotion.service.CouponActivityService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 注册赠券活动 + * + * @author Bulbasaur + * @since 2021/5/24 10:48 上午 + */ +@Component +public class RegisteredCouponActivityExecute implements MemberRegisterEvent { + + @Autowired + private CouponActivityService couponActivityService; + + + @Autowired + private MemberService memberService; + @Autowired + private Cache cache; + + /** + * 获取进行中的注册赠券的优惠券活动 + * 发送注册赠券 + * + * @param member 会员 + */ + @Override + public void memberRegister(Member member) { + //用户注册赠券 + couponActivityService.trigger(CouponActivityTrigger.builder() + .nickName(member.getNickName()) + .userId(member.getId()) + .couponActivityTypeEnum(CouponActivityTypeEnum.REGISTERED) + .build()); + //邀请人赠券 + String memberId = (String) cache.get(CachePrefix.INVITER.getPrefix() + member.getId()); + if (CharSequenceUtil.isNotEmpty(memberId)) { + //邀请人 + Member inviter = memberService.getById(memberId); + couponActivityService.trigger(CouponActivityTrigger.builder() + .nickName(inviter.getNickName()) + .userId(inviter.getId()) + .couponActivityTypeEnum(CouponActivityTypeEnum.INVITE_NEW) + .build()); + } + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java index 0a1e7359..ceee4a1a 100644 --- a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java @@ -1,6 +1,8 @@ package cn.lili.event.impl; -import cn.lili.common.cache.Cache; +import cn.hutool.core.convert.Convert; +import cn.lili.cache.Cache; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.event.OrderStatusChangeEvent; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; @@ -9,46 +11,82 @@ import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * 库存扣减,他表示了订单状态是否出库成功 * * @author Chopper - * @date 2020-07-03 11:20 + * @since 2020-07-03 11:20 */ +@Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StockUpdateExecute implements OrderStatusChangeEvent { - //Redis - private final StringRedisTemplate stringRedisTemplate; - private final DefaultRedisScript quantityScript; - //订单 - private final OrderService orderService; - //规格商品 - private final GoodsSkuService goodsSkuService; - //促销商品 - private final PromotionGoodsService promotionGoodsService; - //缓存 - private final Cache cache; + /** + * 出库失败消息 + */ + static String outOfStockMessage = "库存不足,出库失败"; + /** + * Redis + */ + @Autowired + private StringRedisTemplate stringRedisTemplate; + @Autowired + private DefaultRedisScript quantityScript; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + /** + * 促销商品 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + /** + * 缓存 + */ + @Autowired + private Cache cache; + + @Autowired + private KanjiaActivityService kanjiaActivityService; + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + @Autowired + private PointsGoodsService pointsGoodsService; @Override + @Transactional(rollbackFor = Exception.class) public void orderChange(OrderMessage orderMessage) { switch (orderMessage.getNewStatus()) { case PAID: { - + //获取订单详情 OrderDetailVO order = orderService.queryDetail(orderMessage.getOrderSn()); //库存key 和 扣减数量 List keys = new ArrayList<>(); @@ -59,37 +97,51 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { values.add(Integer.toString(i)); setPromotionStock(keys, values, orderItem); } + + List stocks = cache.multiGet(keys); + //如果缓存中不存在存在等量的库存值,则重新写入缓存,防止缓存击穿导致无法下单 + checkStocks(stocks, order); + //库存扣除结果 Boolean skuResult = stringRedisTemplate.execute(quantityScript, keys, values.toArray()); //如果库存扣减都成功,则记录成交订单 if (Boolean.TRUE.equals(skuResult)) { + log.info("库存扣减成功,参数为{};{}", keys, values); //库存确认之后对结构处理 orderService.afterOrderConfirm(orderMessage.getOrderSn()); //成功之后,同步库存 synchroDB(order); } else { + log.info("库存扣件失败,变更缓存key{} 变更缓存value{}", keys, values); //失败之后取消订单 this.errorOrder(orderMessage.getOrderSn()); } break; } case CANCELLED: { - + //获取订单详情 OrderDetailVO order = orderService.queryDetail(orderMessage.getOrderSn()); - if (order.getOrder().getPayStatus().equals(PayStatusEnum.PAID.name())) { + //判定是否已支付 并且 非库存不足导致库存回滚 则需要考虑订单库存返还业务 + if (order.getOrder().getPayStatus().equals(PayStatusEnum.PAID.name()) + && !order.getOrder().getCancelReason().equals(outOfStockMessage)) { + //库存key 和 还原数量 + List keys = new ArrayList<>(); + List values = new ArrayList<>(); + + //返还商品库存,促销库存不与返还,不然前台展示层有展示逻辑错误 for (OrderItem orderItem : order.getOrderItems()) { - if (PromotionTypeEnum.haveStock(orderItem.getPromotionType())) { - PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(orderItem.getPromotionType()); - Integer goodsPromotionOriginStock = promotionGoodsService.getPromotionGoodsStock(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId()); - int goodsPromotionStock = goodsPromotionOriginStock + orderItem.getNum(); - String promotionGoodsStockCacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId()); - stringRedisTemplate.opsForValue().set(promotionGoodsStockCacheKey, Integer.toString(goodsPromotionStock)); - } - String stockCacheKey = GoodsSkuService.getStockCacheKey(orderItem.getSkuId()); - Integer goodsOriginStock = goodsSkuService.getStock(orderItem.getSkuId()); - int goodsStock = goodsOriginStock + orderItem.getNum(); - stringRedisTemplate.opsForValue().set(stockCacheKey, Integer.toString(goodsStock)); + keys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); + int i = orderItem.getNum(); + values.add(Integer.toString(i)); } + //批量脚本执行库存回退 + Boolean skuResult = stringRedisTemplate.execute(quantityScript, keys, values.toArray()); + + //返还失败,则记录日志 + if (Boolean.FALSE.equals(skuResult)) { + log.error("库存回退异常,keys:{},回复库存值为: {}", keys, values); + } + rollbackOrderStock(order); } break; } @@ -98,13 +150,79 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { } } + + /** + * 校验库存是否有效 + * + * @param stocks + */ + private void checkStocks(List stocks, OrderDetailVO order) { + if (!stocks.isEmpty() && order.getOrderItems().size() == stocks.size() && stocks.stream().anyMatch(Objects::nonNull)) { + return; + } + initSkuCache(order.getOrderItems()); + initPromotionCache(order.getOrderItems()); + } + + /** + * 缓存中sku库存值不存在时,将不存在的信息重新写入一边 + * + * @param orderItems + */ + private void initSkuCache(List orderItems) { + orderItems.forEach(orderItem -> { + //如果不存在 + if (!cache.hasKey(GoodsSkuService.getStockCacheKey(orderItem.getSkuId()))) { + //内部会自动写入,这里不需要进行二次处理 + goodsSkuService.getStock(orderItem.getSkuId()); + } + }); + } + + /** + * 初始化促销商品缓存 + * + * @param orderItems + */ + private void initPromotionCache(List orderItems) { + + //如果促销类型需要库存判定,则做对应处理 + orderItems.forEach(orderItem -> { + if (orderItem.getPromotionType() != null) { + //如果此促销有库存概念,则计入 + if (PromotionTypeEnum.haveStock(orderItem.getPromotionType())) { + + PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(orderItem.getPromotionType()); + + String cacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId()); + + switch (promotionTypeEnum) { + case KANJIA: + cache.put(cacheKey, kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(orderItem.getSkuId()).getStock()); + return; + case POINTS_GOODS: + cache.put(cacheKey, pointsGoodsService.getPointsGoodsDetailBySkuId(orderItem.getSkuId()).getActiveStock()); + return; + case SECKILL: + case PINTUAN: + cache.put(cacheKey, promotionGoodsService.getPromotionGoodsStock(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId())); + return; + default: + break; + } + } + } + }); + } + + /** * 订单出库失败 * * @param orderSn 失败入库订单信息 */ private void errorOrder(String orderSn) { - orderService.systemCancel(orderSn, "库存不足,出库失败"); + orderService.systemCancel(orderSn, outOfStockMessage); } @@ -128,8 +246,15 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { } } + /** - * 写入需要更改促销库存的商品 + * 同步库存和促销库存 + *

+ * 需修改:DB:商品库存、Sku商品库存、活动商品库存 + * 1.获取需要修改的Sku列表、活动商品列表 + * 2.写入sku商品库存,批量修改 + * 3.写入促销商品的卖出数量、剩余数量,批量修改 + * 4.调用方法修改商品库存 * * @param order 订单 */ @@ -144,32 +269,58 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { //促销库存key 集合 List promotionKey = new ArrayList<>(); - // 循环订单 + //循环订单 for (OrderItem orderItem : order.getOrderItems()) { skuKeys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); + GoodsSku goodsSku = new GoodsSku(); goodsSku.setId(orderItem.getSkuId()); + goodsSku.setGoodsId(orderItem.getGoodsId()); //如果有促销信息 - if (null != orderItem.getPromotionType() && null != orderItem.getPromotionId()) { + if (null != orderItem.getPromotionType() && null != orderItem.getPromotionId() && PromotionTypeEnum.haveStock(orderItem.getPromotionType())) { //如果促销有库存信息 - if (PromotionTypeEnum.haveStock(orderItem.getPromotionType())) { - PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(orderItem.getPromotionType()); - PromotionGoods pGoods = promotionGoodsService.getPromotionGoods(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId()); + PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(orderItem.getPromotionType()); + + //修改砍价商品库存 + if (promotionTypeEnum.equals(PromotionTypeEnum.KANJIA)) { + KanjiaActivity kanjiaActivity = kanjiaActivityService.getById(orderItem.getPromotionId()); + KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanjiaGoodsDetail(kanjiaActivity.getKanjiaActivityGoodsId()); + + Integer stock = Integer.parseInt(cache.get(PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId())).toString()); + kanjiaActivityGoodsDTO.setStock(stock); + + kanjiaActivityGoodsService.updateById(kanjiaActivityGoodsDTO); + //修改积分商品库存 + } else if (promotionTypeEnum.equals(PromotionTypeEnum.POINTS_GOODS)) { + PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetail(orderItem.getPromotionId()); + Integer stock = Integer.parseInt(cache.get(PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId())).toString()); + pointsGoodsVO.setActiveStock(stock); + pointsGoodsService.updateById(pointsGoodsVO); + } else { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionType(promotionTypeEnum.name()); + searchParams.setPromotionId(orderItem.getPromotionId()); + searchParams.setSkuId(orderItem.getSkuId()); + PromotionGoods pGoods = promotionGoodsService.getPromotionsGoods(searchParams); + //记录需要更新的促销库存信息 promotionKey.add( PromotionGoodsService.getPromotionGoodsStockCacheKey( promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId()) ); - promotionGoods.add(pGoods); + if (pGoods != null) { + promotionGoods.add(pGoods); + } } } goodsSkus.add(goodsSku); } + //批量获取商品库存 List skuStocks = cache.multiGet(skuKeys); //循环写入商品库存 for (int i = 0; i < skuStocks.size(); i++) { - goodsSkus.get(i).setQuantity(Integer.parseInt(skuStocks.get(i).toString())); + goodsSkus.get(i).setQuantity(Convert.toInt(skuStocks.get(i).toString())); } //批量修改商品库存 goodsSkuService.updateBatchById(goodsSkus); @@ -178,14 +329,48 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { if (!promotionKey.isEmpty()) { List promotionStocks = cache.multiGet(promotionKey); for (int i = 0; i < promotionKey.size(); i++) { - promotionGoods.get(i).setQuantity(Integer.parseInt(promotionStocks.get(i).toString())); + promotionGoods.get(i).setQuantity(Convert.toInt(promotionStocks.get(i).toString())); Integer num = promotionGoods.get(i).getNum(); promotionGoods.get(i).setNum((num != null ? num : 0) + order.getOrder().getGoodsNum()); } - promotionGoodsService.updateBatchById(promotionGoods); + promotionGoodsService.updatePromotionGoodsStock(promotionGoods); } + //商品库存,包含sku库存集合,批量更新商品库存相关 goodsSkuService.updateGoodsStuck(goodsSkus); + log.info("订单确认,库存同步:商品信息--{};促销信息---{}", goodsSkus, promotionGoods); + } + /** + * 恢复商品库存 + * + * @param order 订单 + */ + private void rollbackOrderStock(OrderDetailVO order) { + + //sku商品 + List goodsSkus = new ArrayList<>(); + //sku库存key 集合 + List skuKeys = new ArrayList<>(); + //循环订单 + for (OrderItem orderItem : order.getOrderItems()) { + skuKeys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); + GoodsSku goodsSku = new GoodsSku(); + goodsSku.setId(orderItem.getSkuId()); + goodsSku.setGoodsId(orderItem.getGoodsId()); + goodsSkus.add(goodsSku); + } + //批量获取商品库存 + List skuStocks = cache.multiGet(skuKeys); + //循环写入商品SKU库存 + for (int i = 0; i < skuStocks.size(); i++) { + goodsSkus.get(i).setQuantity(Convert.toInt(skuStocks.get(i).toString())); + } + log.info("订单取消,库存还原:{}", goodsSkus); + //批量修改商品库存 + goodsSkuService.updateBatchById(goodsSkus); + goodsSkuService.updateGoodsStuck(goodsSkus); + + } } diff --git a/consumer/src/main/java/cn/lili/event/impl/StoreChangeEvent.java b/consumer/src/main/java/cn/lili/event/impl/StoreChangeEvent.java new file mode 100644 index 00000000..af500156 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/StoreChangeEvent.java @@ -0,0 +1,206 @@ +package cn.lili.event.impl; + +import cn.lili.event.StoreSettingChangeEvent; +import cn.lili.modules.distribution.service.DistributionGoodsService; +import cn.lili.modules.distribution.service.DistributionOrderService; +import cn.lili.modules.goods.service.DraftGoodsService; +import cn.lili.modules.member.service.MemberEvaluationService; +import cn.lili.modules.message.service.StoreMessageService; +import cn.lili.modules.order.aftersale.service.AfterSaleService; +import cn.lili.modules.order.order.service.OrderComplaintService; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.order.order.service.ReceiptService; +import cn.lili.modules.order.order.service.StoreFlowService; +import cn.lili.modules.promotion.service.*; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.modules.store.service.BillService; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author ftyy + * @description: 店铺名称修改同步对应场景 + * @date 2023/4/24 + */ +@Service +public class StoreChangeEvent implements StoreSettingChangeEvent { + /** + * 优惠券活动表 + */ + @Autowired + private CouponActivityService couponActivityService; + + /** + * 砍价活动商品 + */ + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + + /** + * 积分商品 + */ + @Autowired + private PointsGoodsService pointsGoodsService; + + /** + * 促销商品 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + + /** + * 秒杀活动活动 + */ + @Autowired + private SeckillService seckillService; + + /** + * 优惠券 + */ + @Autowired + private CouponService couponService; + + /** + * 满优惠活动 + */ + @Autowired + private FullDiscountService fullDiscountService; + + /** + * 拼团 + */ + @Autowired + private PintuanService pintuanService; + + /** + * 秒杀活动 + */ + @Autowired + private SeckillApplyService seckillApplyService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + + /** + * 店铺流水 + */ + @Autowired + private StoreFlowService storeFlowService; + + /** + * 售后 + */ + @Autowired + private AfterSaleService afterSaleService; + + /** + * 订单投诉 + */ + @Autowired + private OrderComplaintService orderComplaintService; + /** + * 发票 + */ + @Autowired + private ReceiptService receiptService; + + /** + * 会员优惠券 + */ + @Autowired + private MemberCouponService memberCouponService; + + /** + * 店铺消息 + */ + @Autowired + private StoreMessageService storeMessageService; + + /** + * 会员评价 + */ + @Autowired + private MemberEvaluationService memberEvaluationService; + + /** + * 结算单 + */ + @Autowired + private BillService billService; + /** + * 分销商品 + */ + @Autowired + private DistributionGoodsService distributionGoodsService; + /** + * 分销订单 + */ + @Autowired + private DistributionOrderService distributionOrderService; + + /** + * 草稿商品 + */ + @Autowired + private DraftGoodsService draftGoodsService; + + + /** + * 店铺名称修改 同步更新相关店铺名称 + * + * @param store 店铺信息 + */ + @Override + public void storeSettingChange(Store store) { + + UpdateWrapper updateWrapper = new UpdateWrapper<>() + .eq("store_id", store.getId()) + .set("store_name", store.getStoreName()); + + //修改会员优惠券中店铺名称 + memberCouponService.update(updateWrapper); + //修改优惠券活动中店铺名称 + couponActivityService.update(updateWrapper); + //修改砍价活动商品中店铺名称 + kanjiaActivityGoodsService.update(updateWrapper); + //修改积分商品中店铺名称 + pointsGoodsService.update(updateWrapper); + //修改促销商品中店铺名称 + promotionGoodsService.update(updateWrapper); + //修改秒杀活动活动中店铺名称 + seckillService.update(updateWrapper); + //修改优惠券中店铺名称 + couponService.update(updateWrapper); + //修改满优惠活动中店铺名称 + fullDiscountService.update(updateWrapper); + //修改拼团中店铺名称 + pintuanService.update(updateWrapper); + //修改秒杀活动中店铺名称 + seckillApplyService.update(updateWrapper); + //修改发票中店铺名称 + receiptService.update(updateWrapper); + //修改订单中的店铺名称 + orderService.update(updateWrapper); + //修改店铺流水中店铺名称 + storeFlowService.update(updateWrapper); + //修改售后中店铺名称 + afterSaleService.update(updateWrapper); + //修改订单投诉中店铺名称 + orderComplaintService.update(updateWrapper); + //修改店铺消息中的店铺名称 + storeMessageService.update(updateWrapper); + //修改会员评价中店铺名称 + memberEvaluationService.update(updateWrapper); + //修改结算单中店铺名称 + billService.update(updateWrapper); + //修改分销订单中店铺名称 + distributionOrderService.update(updateWrapper); + //修改分销商品中店铺名称 + distributionGoodsService.update(updateWrapper); + //修改草稿商品中店铺名称 + draftGoodsService.update(updateWrapper); + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/VerificationOrderExecute.java b/consumer/src/main/java/cn/lili/event/impl/VerificationOrderExecute.java new file mode 100644 index 00000000..a0b50055 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/VerificationOrderExecute.java @@ -0,0 +1,70 @@ +package cn.lili.event.impl; + +import cn.hutool.core.util.RandomUtil; +import cn.lili.event.OrderStatusChangeEvent; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.entity.dto.OrderMessage; +import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.service.OrderItemService; +import cn.lili.modules.order.order.service.OrderService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 虚拟商品 + * + * @author Bulbasaur + * @since 2021/5/29 9:17 上午 + */ +@Component +public class VerificationOrderExecute implements OrderStatusChangeEvent { + + @Autowired + private OrderService orderService; + @Autowired + private OrderItemService orderItemService; + @Override + public void orderChange(OrderMessage orderMessage) { + //订单状态为待核验,添加订单添加核验码 + if (orderMessage.getNewStatus().equals(OrderStatusEnum.TAKE) || orderMessage.getNewStatus().equals(OrderStatusEnum.STAY_PICKED_UP)) { + //获取订单信息 + Order order = orderService.getBySn(orderMessage.getOrderSn()); + //获取随机数,判定是否存在 + String code = getCode(order.getStoreId()); + //设置订单验证码 + orderService.update(new LambdaUpdateWrapper() + .set(Order::getVerificationCode, code) + .eq(Order::getSn, orderMessage.getOrderSn())); + //修改虚拟订单货物可以进行售后、投诉 + orderItemService.update(new LambdaUpdateWrapper().eq(OrderItem::getOrderSn, orderMessage.getOrderSn()) + .set(OrderItem::getAfterSaleStatus, OrderItemAfterSaleStatusEnum.NOT_APPLIED) + .set(OrderItem::getCommentStatus, OrderComplaintStatusEnum.NO_APPLY)); + } + } + + /** + * 获取随机数 + * 判断当前店铺下是否使用验证码,如果已使用则重新获取 + * + * @param storeId 店铺ID + * @return + */ + private String getCode(String storeId) { + //获取八位验证码 + String code = Long.toString(RandomUtil.randomLong(10000000, 99999999)); + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(Order::getVerificationCode, code) + .eq(Order::getStoreId, storeId); + if (orderService.getOne(lambdaQueryWrapper) == null) { + return code; + } else { + return this.getCode(storeId); + } + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/WechatMessageExecute.java b/consumer/src/main/java/cn/lili/event/impl/WechatMessageExecute.java index 79e58f45..acb730e8 100644 --- a/consumer/src/main/java/cn/lili/event/impl/WechatMessageExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/WechatMessageExecute.java @@ -2,11 +2,10 @@ package cn.lili.event.impl; import cn.lili.event.OrderStatusChangeEvent; import cn.lili.event.TradeEvent; -import cn.lili.modules.message.util.WechatMessageUtil; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.vo.OrderVO; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.wechat.util.WechatMessageUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,7 +19,6 @@ import org.springframework.stereotype.Service; */ @Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WechatMessageExecute implements OrderStatusChangeEvent, TradeEvent { @Autowired @@ -41,15 +39,16 @@ public class WechatMessageExecute implements OrderStatusChangeEvent, TradeEvent public void orderChange(OrderMessage orderMessage) { switch (orderMessage.getNewStatus()) { - case PAID: case UNDELIVERED: case DELIVERED: + case STAY_PICKED_UP: case COMPLETED: try { wechatMessageUtil.sendWechatMessage(orderMessage.getOrderSn()); } catch (Exception e) { log.error("微信消息发送失败", e); } + break; default: break; } diff --git a/consumer/src/main/java/cn/lili/init/SensitiveWordsInit.java b/consumer/src/main/java/cn/lili/init/SensitiveWordsInit.java new file mode 100644 index 00000000..7099d68c --- /dev/null +++ b/consumer/src/main/java/cn/lili/init/SensitiveWordsInit.java @@ -0,0 +1,34 @@ +package cn.lili.init; + +import cn.lili.modules.system.service.SensitiveWordsService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +/** + * SensitiveWordsInit + * + * @author Chopper + * @version v1.0 + * 2021-11-29 11:38 + */ +@Slf4j +@Component +public class SensitiveWordsInit implements ApplicationRunner { + + @Autowired + private SensitiveWordsService sensitiveWordsService; + + /** + * consumer 启动时,实时更新一下过滤词 + * + * @param args 启动参数 + */ + @Override + public void run(ApplicationArguments args) { + sensitiveWordsService.resetCache(); + } + +} \ No newline at end of file diff --git a/consumer/src/main/java/cn/lili/listener/AfterSaleMessageListener.java b/consumer/src/main/java/cn/lili/listener/AfterSaleMessageListener.java index 59d7f71c..13dd5860 100644 --- a/consumer/src/main/java/cn/lili/listener/AfterSaleMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/AfterSaleMessageListener.java @@ -1,10 +1,9 @@ package cn.lili.listener; import cn.hutool.json.JSONUtil; -import cn.lili.common.rocketmq.tags.AfterSaleTagsEnum; import cn.lili.event.AfterSaleStatusChangeEvent; -import cn.lili.modules.order.order.entity.dos.AfterSale; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.rocketmq.tags.AfterSaleTagsEnum; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -18,33 +17,32 @@ import java.util.List; * 售后通知 * * @author paulG - * @since 2020/12/9 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RocketMQMessageListener(topic = "${lili.data.rocketmq.after-sale-topic}", consumerGroup = "${lili.data.rocketmq.after-sale-group}") public class AfterSaleMessageListener implements RocketMQListener { - //售后订单状态 - private final List afterSaleStatusChangeEvents; + /** + * 售后订单状态 + */ + @Autowired + private List afterSaleStatusChangeEvents; @Override public void onMessage(MessageExt messageExt) { - switch (AfterSaleTagsEnum.valueOf(messageExt.getTags())) { - case AFTER_SALE_STATUS_CHANGE: - for (AfterSaleStatusChangeEvent afterSaleStatusChangeEvent : afterSaleStatusChangeEvents) { - try { - AfterSale afterSale = JSONUtil.toBean(new String(messageExt.getBody()), AfterSale.class); - afterSaleStatusChangeEvent.afterSaleStatusChange(afterSale); - } catch (Exception e) { - log.error("售后{},在{}业务中,状态修改事件执行异常", - new String(messageExt.getBody()), - afterSaleStatusChangeEvent.getClass().getName(), - e); - } + if (AfterSaleTagsEnum.valueOf(messageExt.getTags()) == AfterSaleTagsEnum.AFTER_SALE_STATUS_CHANGE) { + for (AfterSaleStatusChangeEvent afterSaleStatusChangeEvent : afterSaleStatusChangeEvents) { + try { + AfterSale afterSale = JSONUtil.toBean(new String(messageExt.getBody()), AfterSale.class); + afterSaleStatusChangeEvent.afterSaleStatusChange(afterSale); + } catch (Exception e) { + log.error("售后{},在{}业务中,状态修改事件执行异常", + new String(messageExt.getBody()), + afterSaleStatusChangeEvent.getClass().getName(), + e); } - break; + } } } diff --git a/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java b/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java index 44f58e89..8ed979cb 100644 --- a/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java @@ -1,24 +1,41 @@ package cn.lili.listener; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ClassLoaderUtil; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import cn.lili.common.rocketmq.tags.GoodsTagsEnum; +import cn.lili.common.aop.annotation.RetryOperation; +import cn.lili.common.exception.RetryException; +import cn.lili.common.vo.PageVO; import cn.lili.event.GoodsCommentCompleteEvent; -import cn.lili.event.MemberRegisterEvent; -import cn.lili.modules.goods.entity.dos.Goods; -import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.distribution.entity.dos.DistributionGoods; +import cn.lili.modules.distribution.entity.dto.DistributionGoodsSearchParams; +import cn.lili.modules.distribution.service.DistributionGoodsService; +import cn.lili.modules.distribution.service.DistributionSelectedGoodsService; +import cn.lili.modules.goods.entity.dos.*; import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage; -import cn.lili.modules.goods.service.GoodsService; -import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; +import cn.lili.modules.goods.entity.dto.GoodsSearchParams; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.service.*; import cn.lili.modules.member.entity.dos.FootPrint; -import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.service.FootprintService; import cn.lili.modules.member.service.GoodsCollectionService; +import cn.lili.modules.promotion.entity.dos.BasePromotions; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.service.PromotionGoodsService; +import cn.lili.modules.promotion.service.PromotionService; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.service.EsGoodsIndexService; -import cn.lili.modules.store.service.StoreService; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import lombok.RequiredArgsConstructor; +import cn.lili.rocketmq.tags.GoodsTagsEnum; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -26,7 +43,8 @@ import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 商品消息 @@ -36,25 +54,75 @@ import java.util.List; **/ @Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RocketMQMessageListener(topic = "${lili.data.rocketmq.goods-topic}", consumerGroup = "${lili.data.rocketmq.goods-group}") public class GoodsMessageListener implements RocketMQListener { - //ES商品 - private final EsGoodsIndexService goodsIndexService; - //店铺 - private final StoreService storeService; - //商品 - private final GoodsService goodsService; - //商品 - private final GoodsSkuService goodsSkuService; - //用户足迹 - private final FootprintService footprintService; - //商品收藏 - private final GoodsCollectionService goodsCollectionService; - //商品评价 - private final List goodsCommentCompleteEvents; + private static final int BATCH_SIZE = 10; + + /** + * ES商品 + */ + @Autowired + private EsGoodsIndexService goodsIndexService; + /** + * 商品 + */ + @Autowired + private GoodsService goodsService; + /** + * 商品Sku + */ + @Autowired + private GoodsSkuService goodsSkuService; + /** + * 用户足迹 + */ + @Autowired + private FootprintService footprintService; + /** + * 商品收藏 + */ + @Autowired + private GoodsCollectionService goodsCollectionService; + /** + * 商品评价 + */ + @Autowired + private List goodsCommentCompleteEvents; + /** + * 分销商品 + */ + @Autowired + private DistributionGoodsService distributionGoodsService; + /** + * 分销员-商品关联表 + */ + @Autowired + private DistributionSelectedGoodsService distributionSelectedGoodsService; + /** + * 分类 + */ + @Autowired + private CategoryService categoryService; + /** + * 品牌 + */ + @Autowired + private BrandService brandService; + /** + * 店铺商品分类 + */ + @Autowired + private StoreGoodsLabelService storeGoodsLabelService; + + @Autowired + private PromotionService promotionService; + + @Autowired + private PromotionGoodsService promotionGoodsService; + @Override + @RetryOperation public void onMessage(MessageExt messageExt) { switch (GoodsTagsEnum.valueOf(messageExt.getTags())) { @@ -65,18 +133,90 @@ public class GoodsMessageListener implements RocketMQListener { break; //生成索引 case GENERATOR_GOODS_INDEX: - String goodsIndexJsonStr = new String(messageExt.getBody()); - List goodsIndices = JSONUtil.toList(JSONUtil.parseArray(goodsIndexJsonStr), EsGoodsIndex.class); - for (EsGoodsIndex goodsIndex : goodsIndices) { - log.info("生成商品索引" + goodsIndex); - this.goodsIndexService.addIndex(goodsIndex); + try { + String goodsId = new String(messageExt.getBody()); + log.info("生成索引: {}", goodsId); + Goods goods = this.goodsService.getById(goodsId); + this.updateGoodsIndex(goods); + } catch (Exception e) { + log.error("生成商品索引事件执行异常,商品信息: " + new String(messageExt.getBody()), e); + } + break; + case GENERATOR_STORE_GOODS_INDEX: + try { + String storeId = new String(messageExt.getBody()); + this.updateGoodsIndex(storeId); + } catch (Exception e) { + log.error("生成店铺商品索引事件执行异常,商品信息: " + new String(messageExt.getBody()), e); + } + break; + case UPDATE_GOODS_INDEX_PROMOTIONS: + this.updateGoodsIndexPromotions(new String(messageExt.getBody())); + break; + case DELETE_GOODS_INDEX_PROMOTIONS: + JSONObject jsonObject = JSONUtil.parseObj(new String(messageExt.getBody())); + String promotionKey = jsonObject.getStr("promotionKey"); + if (CharSequenceUtil.isEmpty(promotionKey)) { + break; + } + if (CharSequenceUtil.isNotEmpty(jsonObject.getStr("scopeId"))) { + this.goodsIndexService.deleteEsGoodsPromotionByPromotionKey(Arrays.asList(jsonObject.getStr("scopeId").split(",")), promotionKey); + } else { + this.goodsIndexService.deleteEsGoodsPromotionByPromotionKey(promotionKey); + } + break; + case UPDATE_GOODS_INDEX: + try { + String goodsIdsJsonStr = new String(messageExt.getBody()); + GoodsSearchParams searchParams = new GoodsSearchParams(); + searchParams.setId(ArrayUtil.join(JSONUtil.toList(goodsIdsJsonStr, String.class).toArray(), ",")); + List goodsList = goodsService.queryListByParams(searchParams); + this.updateGoodsIndex(goodsList); + } catch (Exception e) { + log.error("更新商品索引事件执行异常,商品信息: " + new String(messageExt.getBody()), e); + } + break; + case UPDATE_GOODS_INDEX_FIELD: + try { + String updateIndexFieldsJsonStr = new String(messageExt.getBody()); + JSONObject updateIndexFields = JSONUtil.parseObj(updateIndexFieldsJsonStr); + @SuppressWarnings("unchecked") Map queryFields = updateIndexFields.get("queryFields", Map.class); + @SuppressWarnings("unchecked") Map updateFields = updateIndexFields.get("updateFields", Map.class); + goodsIndexService.updateIndex(queryFields, updateFields); + } catch (Exception e) { + log.error("更新商品索引事件执行异常,商品信息: " + new String(messageExt.getBody()), e); + } + break; + case RESET_GOODS_INDEX: + try { + String goodsIdsJsonStr = new String(messageExt.getBody()); + List goodsIndices = JSONUtil.toList(goodsIdsJsonStr, EsGoodsIndex.class); + goodsIndexService.updateBulkIndex(goodsIndices); + } catch (Exception e) { + log.error("重置商品索引事件执行异常,商品信息: " + new String(messageExt.getBody()), e); } break; //审核商品 case GOODS_AUDIT: + Goods goods = JSONUtil.toBean(new String(messageExt.getBody()), Goods.class); + updateGoodsIndex(goods); + break; //删除商品 case GOODS_DELETE: - storeService.updateStoreGoodsNum(new String(messageExt.getBody())); + try { + String goodsIdsJsonStr = new String(messageExt.getBody()); + for (String goodsId : JSONUtil.toList(goodsIdsJsonStr, String.class)) { + goodsIndexService.deleteIndex(MapUtil.builder(new HashMap()).put("goodsId", goodsId).build()); + } + + promotionService.removeByGoodsIds(goodsIdsJsonStr); + } catch (Exception e) { + log.error("删除商品索引事件执行异常,商品信息: " + new String(messageExt.getBody()), e); + } + break; + case DOWN: + String goodsIdsJsonStr = new String(messageExt.getBody()); + promotionService.removeByGoodsIds(goodsIdsJsonStr); break; //规格删除 case SKU_DELETE: @@ -84,58 +224,281 @@ public class GoodsMessageListener implements RocketMQListener { List skuIds = JSONUtil.toList(message, String.class); goodsCollectionService.deleteSkuCollection(skuIds); break; - //收藏商品 - case GOODS_COLLECTION: - storeService.updateStoreCollectionNum(new String(messageExt.getBody())); + case STORE_GOODS_DELETE: + try { + String storeId = new String(messageExt.getBody()); + goodsIndexService.deleteIndex(MapUtil.builder(new HashMap()).put("storeId", storeId).build()); + } catch (RetryException re) { + throw re; + } catch (Exception e) { + log.error("删除店铺商品索引事件执行异常,商品信息: " + new String(messageExt.getBody()), e); + } + break; + //同步商品分类名称 + case CATEGORY_GOODS_NAME: + //分类ID + String id = new String(messageExt.getBody()); + goodsService.categoryGoodsName(id); break; //商品评价 case GOODS_COMMENT_COMPLETE: + MemberEvaluation memberEvaluation = JSONUtil.toBean(new String(messageExt.getBody()), MemberEvaluation.class); for (GoodsCommentCompleteEvent goodsCommentCompleteEvent : goodsCommentCompleteEvents) { try { - MemberEvaluation memberEvaluation = JSONUtil.toBean(new String(messageExt.getBody()), MemberEvaluation.class); goodsCommentCompleteEvent.goodsComment(memberEvaluation); } catch (Exception e) { - log.error("评价{},在{}业务中,状态修改事件执行异常", - new String(messageExt.getBody()), - goodsCommentCompleteEvent.getClass().getName(), - e); + log.error("评价{},在{}业务中,状态修改事件执行异常", new String(messageExt.getBody()), goodsCommentCompleteEvent.getClass().getName(), e); } } break; //购买商品完成 case BUY_GOODS_COMPLETE: - String goodsCompleteMessageStr = new String(messageExt.getBody()); - List goodsCompleteMessageList = JSONUtil.toList(JSONUtil.parseArray(goodsCompleteMessageStr), GoodsCompleteMessage.class); - for (GoodsCompleteMessage goodsCompleteMessage : goodsCompleteMessageList) { - Goods goods = goodsService.getById(goodsCompleteMessage.getGoodsId()); - if (goods != null) { - // 更新商品购买数量 - if (goods.getBuyCount() == null) { - goods.setBuyCount(0); - } - int buyCount = goods.getBuyCount() + goodsCompleteMessage.getBuyNum(); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Goods::getId, goodsCompleteMessage.getGoodsId()); - updateWrapper.set(Goods::getBuyCount, buyCount); - goodsService.update(updateWrapper); - } else { - log.error("商品Id为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!"); - } - GoodsSku goodsSku = goodsSkuService.getById(goodsCompleteMessage.getSkuId()); - if (goodsSku != null) { - // 更新商品购买数量 - if (goodsSku.getBuyCount() == null) { - goodsSku.setBuyCount(0); - } - int buyCount = goodsSku.getBuyCount() + goodsCompleteMessage.getBuyNum(); - goodsSku.setBuyCount(buyCount); - goodsSkuService.update(goodsSku); - goodsIndexService.updateIndexBuyNum(goodsCompleteMessage.getSkuId(), buyCount); - } else { - log.error("商品SkuId为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!"); - } - } + this.goodsBuyComplete(messageExt); + break; + default: + log.error("商品执行异常:{}", new String(messageExt.getBody())); break; } } + + private void updateGoodsIndexPromotions(String promotionsJsonStr) { + try { + log.info("更新商品索引促销信息: {}", promotionsJsonStr); + JSONObject jsonObject = JSONUtil.parseObj(promotionsJsonStr); + // 转换为详细的促销信息(注:促销信息必须继承自 BasePromotions,且必须保证派生类存在与sdk包下) + BasePromotions promotions = (BasePromotions) jsonObject.get("promotions", ClassLoaderUtil.loadClass(jsonObject.get("promotionsType").toString())); + // 获取促销唯一key,由 促销类型 + 促销id 组成 + String esPromotionKey = jsonObject.get("esPromotionKey").toString(); + if (PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType())) { + for (int i = 0; ; i++) { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionId(promotions.getId()); + PageVO pageVO = new PageVO(); + pageVO.setPageNumber(i); + pageVO.setPageSize(BATCH_SIZE); + Page promotionGoodsPage = this.promotionGoodsService.pageFindAll(searchParams, pageVO); + if (promotionGoodsPage == null || promotionGoodsPage.getRecords().isEmpty()) { + break; + } + List skuIds = promotionGoodsPage.getRecords().stream().map(PromotionGoods::getSkuId).collect(Collectors.toList()); + // 更新商品索引促销信息(删除原索引中相关的促销信息,更新索引中促销信息) + this.goodsIndexService.deleteEsGoodsPromotionByPromotionKey(skuIds, esPromotionKey); + this.goodsIndexService.updateEsGoodsIndexByList(promotionGoodsPage.getRecords(), promotions, esPromotionKey); + } + + } else if (PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name().equals(promotions.getScopeType())) { + for (int i = 0; ; i++) { + GoodsSearchParams searchParams = new GoodsSearchParams(); + searchParams.setCategoryPath(promotions.getScopeId()); + searchParams.setPageNumber(i); + searchParams.setPageSize(BATCH_SIZE); + IPage goodsSkuByPage = this.goodsSkuService.getGoodsSkuByPage(searchParams); + if (goodsSkuByPage == null || goodsSkuByPage.getRecords().isEmpty()) { + break; + } + List skuIds = goodsSkuByPage.getRecords().stream().map(GoodsSku::getId).collect(Collectors.toList()); + // 更新商品索引促销信息(删除原索引中相关的促销信息,更新索引中促销信息) + this.goodsIndexService.deleteEsGoodsPromotionByPromotionKey(skuIds, esPromotionKey); + this.goodsIndexService.updateEsGoodsIndexPromotions(skuIds, promotions, esPromotionKey); + } + + } else if (PromotionsScopeTypeEnum.ALL.name().equals(promotions.getScopeType())) { + this.goodsIndexService.updateEsGoodsIndexAllByList(promotions, esPromotionKey); + } + } catch (Exception e) { + log.error("生成商品索引促销信息执行异常", e); + } + } + + /** + * 更新商品索引 + * + * @param goodsList 商品列表消息 + */ + private void updateGoodsIndex(List goodsList) { + for (Goods goods : goodsList) { + this.updateGoodsIndex(goods); + } + } + + + /** + * 更新商品索引根据店铺id + * + * @param storeId 店铺id + */ + private void updateGoodsIndex(String storeId) { + //如果商品通过审核&&并且已上架 + GoodsSearchParams searchParams = new GoodsSearchParams(); + searchParams.setStoreId(storeId); + for (Goods goods : this.goodsService.queryListByParams(searchParams)) { + this.updateGoodsIndex(goods); + } + + } + + /** + * 更新商品索引 + * + * @param goods 商品消息 + */ + private void updateGoodsIndex(Goods goods) { + for (int i = 1; ; i++) { + //如果商品通过审核&&并且已上架 + GoodsSearchParams searchParams = new GoodsSearchParams(); + searchParams.setGoodsId(goods.getId()); + searchParams.setPageNumber(i); + searchParams.setPageSize(BATCH_SIZE); + searchParams.setGeQuantity(0); + IPage goodsSkuByPage = this.goodsSkuService.getGoodsSkuByPage(searchParams); + if (goodsSkuByPage == null || goodsSkuByPage.getRecords().isEmpty()) { + break; + } + log.info("goods:{}", goods); + log.info("goodsSkuList:{}", goodsSkuByPage.getRecords()); + if (goods.getAuthFlag().equals(GoodsAuthEnum.PASS.name()) && goods.getMarketEnable().equals(GoodsStatusEnum.UPPER.name()) && Boolean.FALSE.equals(goods.getDeleteFlag())) { + this.generatorGoodsIndex(goods, goodsSkuByPage.getRecords()); + } else { + //如果商品状态值不支持es搜索,那么将商品信息做下架处理 + for (GoodsSku goodsSku : goodsSkuByPage.getRecords()) { + EsGoodsIndex esGoodsOld = goodsIndexService.findById(goodsSku.getId()); + if (esGoodsOld != null) { + goodsIndexService.deleteIndexById(goodsSku.getId()); + } + } + } + } + + } + + /** + * 生成商品索引 + * + * @param goods 商品信息 + * @param goodsSkuList 商品sku信息 + */ + private void generatorGoodsIndex(Goods goods, List goodsSkuList) { + int skuSource = 100; + List esGoodsIndices = new ArrayList<>(); + for (GoodsSku goodsSku : goodsSkuList) { + EsGoodsIndex goodsIndex = this.settingUpGoodsIndexData(goods, goodsSku); + skuSource--; + if (skuSource <= 0) { + skuSource = 1; + } + goodsIndex.setSkuSource(skuSource); + log.info("goodsSku:{}", goodsSku); + log.info("生成商品索引 {}", goodsIndex); + esGoodsIndices.add(goodsIndex); + } + this.goodsIndexService.deleteIndex(MapUtil.builder(new HashMap()).put("goodsId", goods.getId()).build()); + this.goodsIndexService.addIndex(esGoodsIndices); + } + + private EsGoodsIndex settingUpGoodsIndexData(Goods goods, GoodsSku goodsSku) { + EsGoodsIndex goodsIndex = new EsGoodsIndex(goodsSku); + if (goods.getParams() != null && !goods.getParams().isEmpty()) { + List goodsParamDTOS = JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class); + goodsIndex = new EsGoodsIndex(goodsSku, goodsParamDTOS); + } + goodsIndex.setAuthFlag(goods.getAuthFlag()); + goodsIndex.setMarketEnable(goods.getMarketEnable()); + this.settingUpGoodsIndexOtherParam(goodsIndex); + return goodsIndex; + } + + /** + * 设置商品索引的其他参数(非商品自带) + * + * @param goodsIndex 商品索引信息 + */ + private void settingUpGoodsIndexOtherParam(EsGoodsIndex goodsIndex) { + List categories = categoryService.listByIdsOrderByLevel(Arrays.asList(goodsIndex.getCategoryPath().split(","))); + if (!categories.isEmpty()) { + goodsIndex.setCategoryNamePath(ArrayUtil.join(categories.stream().map(Category::getName).toArray(), ",")); + } + Brand brand = brandService.getById(goodsIndex.getBrandId()); + if (brand != null) { + goodsIndex.setBrandName(brand.getName()); + goodsIndex.setBrandUrl(brand.getLogo()); + } + if (goodsIndex.getStoreCategoryPath() != null && CharSequenceUtil.isNotEmpty(goodsIndex.getStoreCategoryPath())) { + List storeGoodsLabels = storeGoodsLabelService.listByStoreIds(Arrays.asList(goodsIndex.getStoreCategoryPath().split(","))); + if (!storeGoodsLabels.isEmpty()) { + goodsIndex.setStoreCategoryNamePath(ArrayUtil.join(storeGoodsLabels.stream().map(StoreGoodsLabel::getLabelName).toArray(), ",")); + } + } + + if (goodsIndex.getOriginPromotionMap() == null || goodsIndex.getOriginPromotionMap().isEmpty()) { + Map goodsCurrentPromotionMap = promotionService.getGoodsSkuPromotionMap(goodsIndex.getStoreId(), goodsIndex.getId()); + goodsIndex.setPromotionMapJson(JSONUtil.toJsonStr(goodsCurrentPromotionMap)); + } + } + + + /** + * 删除商品 + * 1.更新店铺的商品数量 + * 2.删除分销员-分销商品绑定关系 + * 3.删除分销商品 + * + * @param goods 消息 + */ + private void deleteGoods(Goods goods) { + + DistributionGoodsSearchParams searchParams = new DistributionGoodsSearchParams(); + searchParams.setGoodsId(goods.getId()); + //删除获取分销商品 + DistributionGoods distributionGoods = distributionGoodsService.getDistributionGoods(searchParams); + + if (distributionGoods != null) { + + //删除分销商品绑定关系 + distributionSelectedGoodsService.deleteByDistributionGoodsId(distributionGoods.getId()); + + //删除分销商品 + distributionGoodsService.removeById(distributionGoods.getId()); + } + } + + /** + * 商品购买完成 + * 1.更新商品购买数量 + * 2.更新SKU购买数量 + * 3.更新索引购买数量 + * + * @param messageExt 信息体 + */ + private void goodsBuyComplete(MessageExt messageExt) { + String goodsCompleteMessageStr = new String(messageExt.getBody()); + List goodsCompleteMessageList = JSONUtil.toList(JSONUtil.parseArray(goodsCompleteMessageStr), GoodsCompleteMessage.class); + for (GoodsCompleteMessage goodsCompleteMessage : goodsCompleteMessageList) { + Goods goods = goodsService.getById(goodsCompleteMessage.getGoodsId()); + if (goods != null) { + //更新商品购买数量 + if (goods.getBuyCount() == null) { + goods.setBuyCount(0); + } + int buyCount = goods.getBuyCount() + goodsCompleteMessage.getBuyNum(); + this.goodsService.updateGoodsBuyCount(goodsCompleteMessage.getGoodsId(), buyCount); + } else { + log.error("商品Id为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!"); + } + GoodsSku goodsSku = goodsSkuService.getById(goodsCompleteMessage.getSkuId()); + if (goodsSku != null) { + //更新商品购买数量 + if (goodsSku.getBuyCount() == null) { + goodsSku.setBuyCount(0); + } + int buyCount = goodsSku.getBuyCount() + goodsCompleteMessage.getBuyNum(); + goodsSku.setBuyCount(buyCount); + goodsSkuService.update(goodsSku); + + this.goodsIndexService.updateIndex(MapUtil.builder(new HashMap()).put("id", goodsCompleteMessage.getSkuId()).build(), MapUtil.builder(new HashMap()).put("buyCount", buyCount).build()); + + } else { + log.error("商品SkuId为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!"); + } + } + } } diff --git a/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java b/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java index a32489d6..05a928c7 100644 --- a/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/MemberMessageListener.java @@ -1,16 +1,15 @@ package cn.lili.listener; import cn.hutool.json.JSONUtil; -import cn.lili.common.rocketmq.tags.MemberTagsEnum; -import cn.lili.event.MemberPointChangeEvent; -import cn.lili.event.MemberRegisterEvent; -import cn.lili.event.MemberWithdrawalEvent; +import cn.lili.event.*; +import cn.lili.event.impl.ImTalkExecute; +import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberSign; import cn.lili.modules.member.entity.dto.MemberPointMessage; -import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage; import cn.lili.modules.member.service.MemberSignService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; +import cn.lili.rocketmq.tags.MemberTagsEnum; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -28,19 +27,39 @@ import java.util.List; **/ @Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RocketMQMessageListener(topic = "${lili.data.rocketmq.member-topic}", consumerGroup = "${lili.data.rocketmq.member-group}") public class MemberMessageListener implements RocketMQListener { - //会员签到 - private final MemberSignService memberSignService; - //会员积分变化 - private final List memberPointChangeEvents; - //会员提现 - private final List memberWithdrawalEvents; - //会员注册 - private final List memberSignEvents; + /** + * 会员签到 + */ + @Autowired + private MemberSignService memberSignService; + /** + * 会员积分变化 + */ + @Autowired + private List memberPointChangeEvents; + /** + * 会员提现 + */ + @Autowired + private List memberWithdrawalEvents; + /** + * 会员注册 + */ + @Autowired + private List memberSignEvents; + /** + * 会员注册 + */ + @Autowired + private List memberLoginEvents; + @Autowired + private List memberInfoChangeEvents; + @Autowired + private List memberConnectLoginEvents; @Override public void onMessage(MessageExt messageExt) { @@ -59,6 +78,21 @@ public class MemberMessageListener implements RocketMQListener { } } break; + //用户登录 + case MEMBER_LOGIN: + + for (MemberLoginEvent memberLoginEvent : memberLoginEvents) { + try { + Member member = JSONUtil.toBean(new String(messageExt.getBody()), Member.class); + memberLoginEvent.memberLogin(member); + } catch (Exception e) { + log.error("会员{},在{}业务中,状态修改事件执行异常", + new String(messageExt.getBody()), + memberLoginEvent.getClass().getName(), + e); + } + } + break; //会员签到 case MEMBER_SING: MemberSign memberSign = JSONUtil.toBean(new String(messageExt.getBody()), MemberSign.class); @@ -78,6 +112,20 @@ public class MemberMessageListener implements RocketMQListener { } } break; + //会员信息更改 + case MEMBER_INFO_EDIT: + for (MemberInfoChangeEvent memberInfoChangeEvent : memberInfoChangeEvents) { + try { + Member member = JSONUtil.toBean(new String(messageExt.getBody()), Member.class); + memberInfoChangeEvent.memberInfoChange(member); + } catch (Exception e) { + log.error("会员{},在{}业务中,提现事件执行异常", + new String(messageExt.getBody()), + memberInfoChangeEvent.getClass().getName(), + e); + } + } + break; //会员提现 case MEMBER_WITHDRAWAL: for (MemberWithdrawalEvent memberWithdrawalEvent : memberWithdrawalEvents) { @@ -91,7 +139,21 @@ public class MemberMessageListener implements RocketMQListener { e); } } - + break; + //用户第三方登录 + case MEMBER_CONNECT_LOGIN: + for (MemberConnectLoginEvent memberConnectLoginEvent : memberConnectLoginEvents) { + try { + MemberConnectLoginMessage memberConnectLoginMessage = JSONUtil.toBean(new String(messageExt.getBody()), MemberConnectLoginMessage.class); + memberConnectLoginEvent.memberConnectLogin(memberConnectLoginMessage.getMember(), memberConnectLoginMessage.getConnectAuthUser()); + } catch (Exception e) { + log.error("会员{},在{}业务中,状态修改事件执行异常", + new String(messageExt.getBody()), + memberConnectLoginEvent.getClass().getName(), + e); + } + } + break; default: break; } diff --git a/consumer/src/main/java/cn/lili/listener/NoticeMessageListener.java b/consumer/src/main/java/cn/lili/listener/NoticeMessageListener.java index eb3499c9..98a894a6 100644 --- a/consumer/src/main/java/cn/lili/listener/NoticeMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/NoticeMessageListener.java @@ -3,7 +3,6 @@ package cn.lili.listener; import cn.hutool.json.JSONUtil; import cn.lili.modules.message.entity.dto.NoticeMessageDTO; import cn.lili.modules.message.service.NoticeMessageService; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; @@ -17,12 +16,14 @@ import org.springframework.stereotype.Component; * @since 2020/12/9 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RocketMQMessageListener(topic = "${lili.data.rocketmq.notice-topic}", consumerGroup = "${lili.data.rocketmq.notice-group}") public class NoticeMessageListener implements RocketMQListener { - //站内信 - private final NoticeMessageService noticeMessageService; + /** + * 站内信 + */ + @Autowired + private NoticeMessageService noticeMessageService; @Override public void onMessage(MessageExt messageExt) { diff --git a/consumer/src/main/java/cn/lili/listener/NoticeSendMessageListener.java b/consumer/src/main/java/cn/lili/listener/NoticeSendMessageListener.java index d241ce7c..62fa3d08 100644 --- a/consumer/src/main/java/cn/lili/listener/NoticeSendMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/NoticeSendMessageListener.java @@ -1,19 +1,26 @@ package cn.lili.listener; import cn.hutool.json.JSONUtil; -import cn.lili.common.rocketmq.tags.OtherTagsEnum; -import cn.lili.common.sms.SmsUtil; -import cn.lili.modules.member.mapper.MemberMapper; +import cn.lili.common.enums.SwitchEnum; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.member.entity.vo.MemberSearchVO; +import cn.lili.modules.member.entity.vo.MemberVO; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.message.entity.dos.MemberMessage; import cn.lili.modules.message.entity.dos.Message; import cn.lili.modules.message.entity.dos.StoreMessage; -import cn.lili.modules.message.entity.dto.SmsReachDTO; +import cn.lili.modules.message.entity.enums.MessageSendClient; import cn.lili.modules.message.entity.enums.MessageStatusEnum; import cn.lili.modules.message.entity.enums.RangeEnum; +import cn.lili.modules.message.service.MemberMessageService; import cn.lili.modules.message.service.StoreMessageService; +import cn.lili.modules.sms.SmsUtil; +import cn.lili.modules.sms.entity.dto.SmsReachDTO; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.service.StoreService; +import cn.lili.rocketmq.tags.OtherTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; @@ -30,18 +37,34 @@ import java.util.List; * @since 2020/12/9 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RocketMQMessageListener(topic = "${lili.data.rocketmq.notice-send-topic}", consumerGroup = "${lili.data.rocketmq.notice-send-group}") public class NoticeSendMessageListener implements RocketMQListener { - //会员 - private final MemberMapper memberMapper; - //短信 - private final SmsUtil smsUtil; - //店铺消息 - private final StoreMessageService storeMessageService; - //店铺 - private final StoreService storeService; + /** + * 短信 + */ + @Autowired + private SmsUtil smsUtil; + /** + * 店铺消息 + */ + @Autowired + private StoreMessageService storeMessageService; + /** + * 会员消息 + */ + @Autowired + private MemberMessageService memberMessageService; + /** + * 店铺 + */ + @Autowired + private StoreService storeService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; @Override public void onMessage(MessageExt messageExt) { @@ -49,52 +72,131 @@ public class NoticeSendMessageListener implements RocketMQListener { case SMS: String smsJsonStr = new String(messageExt.getBody()); SmsReachDTO smsReachDTO = JSONUtil.toBean(smsJsonStr, SmsReachDTO.class); - //发送全部会员 if (smsReachDTO.getSmsRange().equals(RangeEnum.ALL.name())) { //获取所有会员的手机号 - List list = memberMapper.getAllMemberMobile(); + List list = memberService.getAllMemberMobile(); smsUtil.sendBatchSms(smsReachDTO.getSignName(), list, smsReachDTO.getMessageCode()); //判断为发送部分用户 - } else if (smsReachDTO.getSmsRange().equals(RangeEnum.APPOINT.name())) { + } else { smsUtil.sendBatchSms(smsReachDTO.getSignName(), smsReachDTO.getMobile(), smsReachDTO.getMessageCode()); } break; //管理员发送站内信 case MESSAGE: Message message = JSONUtil.toBean(new String(messageExt.getBody()), Message.class); - List list = new ArrayList<>(); - //保存商家记录 - if (message.getMessageRange().equals("ALL")) { - List storeList = storeService.list(new QueryWrapper().eq("store_disable", "OPEN")); - storeList.forEach(item -> { - StoreMessage storeMessage = new StoreMessage(); - storeMessage.setMessageId(message.getId()); - storeMessage.setStoreName(item.getStoreName()); - storeMessage.setStoreId(item.getId()); - storeMessage.setStatus(MessageStatusEnum.UN_READY.name()); - storeMessage.setTitle(message.getTitle()); - storeMessage.setContent(message.getContent()); - list.add(storeMessage); - }); + // 管理端发送给商家的站内信 + if (message.getMessageClient().equals(MessageSendClient.STORE.name().toLowerCase())) { + saveStoreMessage(message); } else { - int i = 0; - for (String str : message.getUserIds()) { - StoreMessage storeMessage = new StoreMessage(); - storeMessage.setMessageId(message.getId()); - storeMessage.setStoreId(str); - storeMessage.setStoreName(message.getUserNames()[i]); - storeMessage.setStatus(MessageStatusEnum.UN_READY.name()); - storeMessage.setTitle(message.getTitle()); - storeMessage.setContent(message.getContent()); - list.add(storeMessage); - i++; - } + //管理员发送给会员的站内信 + saveMemberMessage(message); } - storeMessageService.save(list); break; default: break; } } + + /** + * 保存店铺消息 + * + * @param message 消息 + */ + private void saveStoreMessage(Message message) { + List list = new ArrayList<>(); + //发送全部商家情况 + if ("ALL".equals(message.getMessageRange())) { + List storeList = storeService.list(new QueryWrapper().eq("store_disable", "OPEN")); + storeList.forEach(item -> { + StoreMessage storeMessage = new StoreMessage(); + storeMessage.setMessageId(message.getId()); + storeMessage.setStoreName(item.getStoreName()); + storeMessage.setStoreId(item.getId()); + storeMessage.setStatus(MessageStatusEnum.UN_READY.name()); + storeMessage.setTitle(message.getTitle()); + storeMessage.setContent(message.getContent()); + list.add(storeMessage); + }); + } else { + //发送给指定商家情况 + int i = 0; + for (String str : message.getUserIds()) { + StoreMessage storeMessage = new StoreMessage(); + storeMessage.setMessageId(message.getId()); + storeMessage.setStoreId(str); + storeMessage.setStoreName(message.getUserNames()[i]); + storeMessage.setStatus(MessageStatusEnum.UN_READY.name()); + storeMessage.setTitle(message.getTitle()); + storeMessage.setContent(message.getContent()); + list.add(storeMessage); + i++; + } + } + if (list.size() > 0) { + //执行保存 + storeMessageService.save(list); + } + } + + /** + * 保存会员消息 + * + * @param message 消息 + */ + private void saveMemberMessage(Message message) { + List list = new ArrayList<>(); + //如果是给所有会员发送消息 + if ("ALL".equals(message.getMessageRange())) { + //查询所有会员总数,因为会员总数比较大 如果一次性查出来会占用数据库资源,所以要分页查询 + MemberSearchVO memberSearchVO = new MemberSearchVO(); + memberSearchVO.setDisabled(SwitchEnum.OPEN.name()); + long memberNum = memberService.getMemberNum(memberSearchVO); + //构建分页查询参数 + //100条查一次 + int pageSize = 100; + int pageCount; + pageCount = (int) (memberNum / pageSize); + pageCount = memberNum % pageSize > 0 ? pageCount + 1 : pageCount; + for (int i = 1; i <= pageCount; i++) { + PageVO pageVO = new PageVO(); + pageVO.setPageSize(pageSize); + pageVO.setPageNumber(i); + IPage page = memberService.getMemberPage(memberSearchVO, pageVO); + //循环要保存的信息 + page.getRecords().forEach(item -> { + MemberMessage memberMessage = new MemberMessage(); + memberMessage.setContent(message.getContent()); + memberMessage.setTitle(message.getTitle()); + memberMessage.setMessageId(message.getId()); + memberMessage.setMemberId(item.getId()); + memberMessage.setMemberName(item.getUsername()); + memberMessage.setStatus(MessageStatusEnum.UN_READY.name()); + list.add(memberMessage); + }); + } + + } else { + //如果是给指定会员发送消息 + int i = 0; + for (String str : message.getUserIds()) { + MemberMessage memberMessage = new MemberMessage(); + memberMessage.setMessageId(message.getId()); + memberMessage.setMemberId(str); + memberMessage.setMemberName(message.getUserNames()[i]); + memberMessage.setStatus(MessageStatusEnum.UN_READY.name()); + memberMessage.setTitle(message.getTitle()); + memberMessage.setContent(message.getContent()); + list.add(memberMessage); + i++; + } + } + if (list.size() > 0) { + //执行保存 + memberMessageService.save(list); + } + + } + + } diff --git a/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java b/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java index 8244554f..d72ff5fd 100644 --- a/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java @@ -1,13 +1,12 @@ package cn.lili.listener; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.rocketmq.tags.MqOrderTagsEnum; +import cn.lili.cache.Cache; import cn.lili.event.OrderStatusChangeEvent; import cn.lili.event.TradeEvent; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.order.entity.dto.OrderMessage; -import lombok.RequiredArgsConstructor; +import cn.lili.rocketmq.tags.OrderTagsEnum; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -25,24 +24,46 @@ import java.util.List; **/ @Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RocketMQMessageListener(topic = "${lili.data.rocketmq.order-topic}", consumerGroup = "${lili.data.rocketmq.order-group}") public class OrderMessageListener implements RocketMQListener { - //交易 - private final List tradeEvent; - //订单状态 - private final List orderStatusChangeEvents; - //缓存 - private final Cache cache; + /** + * 交易 + */ + @Autowired + private List tradeEvent; + /** + * 订单状态 + */ + @Autowired + private List orderStatusChangeEvents; + /** + * 缓存 + */ + @Autowired + private Cache cache; @Override public void onMessage(MessageExt messageExt) { - switch (MqOrderTagsEnum.valueOf(messageExt.getTags())) { + try { + this.orderStatusEvent(messageExt); + } catch (Exception e) { + log.error("订单状态变更事件调用异常", e); + } + } + + /** + * 订单状态变更 + * @param messageExt + */ + public void orderStatusEvent(MessageExt messageExt) { + + switch (OrderTagsEnum.valueOf(messageExt.getTags())) { //订单创建 case ORDER_CREATE: String key = new String(messageExt.getBody()); - TradeDTO tradeDTO = (TradeDTO) cache.get(key); + TradeDTO tradeDTO = JSONUtil.toBean(cache.getString(key), TradeDTO.class); + boolean result = true; for (TradeEvent event : tradeEvent) { try { event.orderCreate(tradeDTO); @@ -51,8 +72,14 @@ public class OrderMessageListener implements RocketMQListener { tradeDTO.getSn(), event.getClass().getName(), e); + result = false; } } + //如所有步骤顺利完成 + if (Boolean.TRUE.equals(result)) { + //清除记录信息的trade cache key + cache.remove(key); + } break; //订单状态变更 case STATUS_CHANGE: @@ -72,5 +99,4 @@ public class OrderMessageListener implements RocketMQListener { break; } } - } diff --git a/consumer/src/main/java/cn/lili/listener/StoreMessageListener.java b/consumer/src/main/java/cn/lili/listener/StoreMessageListener.java new file mode 100644 index 00000000..243de85f --- /dev/null +++ b/consumer/src/main/java/cn/lili/listener/StoreMessageListener.java @@ -0,0 +1,51 @@ +package cn.lili.listener; + +import cn.hutool.json.JSONUtil; +import cn.lili.event.MemberRegisterEvent; +import cn.lili.event.StoreSettingChangeEvent; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.rocketmq.tags.StoreTagsEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 店铺消息 + * @author chc + * @since 2022/6/2114:46 + */ +@Component +@Slf4j +@RocketMQMessageListener(topic = "${lili.data.rocketmq.store-topic}", consumerGroup = "${lili.data.rocketmq.store-group}") +public class StoreMessageListener implements RocketMQListener { + @Autowired + private List storeSettingChangeEventList; + + @Override + public void onMessage(MessageExt messageExt) { + switch (StoreTagsEnum.valueOf(messageExt.getTags())){ + //修改店铺 + case EDIT_STORE_SETTING: + for (StoreSettingChangeEvent storeSettingChangeEvent : storeSettingChangeEventList) { + try { + Store store = JSONUtil.toBean(new String(messageExt.getBody()), Store.class); + storeSettingChangeEvent.storeSettingChange(store); + } catch (Exception e) { + log.error("会员{},在{}业务中,状态修改事件执行异常", + new String(messageExt.getBody()), + storeSettingChangeEvent.getClass().getName(), + e); + } + } + break; + default: + break; + } + } +} diff --git a/consumer/src/main/java/cn/lili/service/NoticeSendMessageConsumer.java b/consumer/src/main/java/cn/lili/service/NoticeSendMessageConsumer.java deleted file mode 100644 index ef07b637..00000000 --- a/consumer/src/main/java/cn/lili/service/NoticeSendMessageConsumer.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.lili.service; - -import cn.lili.event.OrderStatusChangeEvent; -import cn.lili.modules.order.order.entity.dto.OrderMessage; -import org.springframework.stereotype.Component; - -/** - * 消息发送 - * - * @author paulG - * @since 2020/12/9 - */ -@Component -public class NoticeSendMessageConsumer implements OrderStatusChangeEvent { - - - @Override - public void orderChange(OrderMessage orderMessage) { - - - } -} diff --git a/consumer/src/main/java/cn/lili/sucurity/ConsumerSecurityConfig.java b/consumer/src/main/java/cn/lili/sucurity/ConsumerSecurityConfig.java new file mode 100644 index 00000000..761290bd --- /dev/null +++ b/consumer/src/main/java/cn/lili/sucurity/ConsumerSecurityConfig.java @@ -0,0 +1,18 @@ +package cn.lili.sucurity; + +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.stereotype.Component; + +/** + * @author paulG + * @since 2022/2/18 + **/ +@Component +public class ConsumerSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.formLogin().disable(); + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/TimedTaskJobHandler.java b/consumer/src/main/java/cn/lili/timetask/TimedTaskJobHandler.java index 3bf9d017..b8983582 100644 --- a/consumer/src/main/java/cn/lili/timetask/TimedTaskJobHandler.java +++ b/consumer/src/main/java/cn/lili/timetask/TimedTaskJobHandler.java @@ -71,7 +71,7 @@ public class TimedTaskJobHandler { try { everyHourExecutes.get(i).execute(); } catch (Exception e) { - log.error("每分钟任务异常", e); + log.error("每小时任务异常", e); } } return ReturnT.SUCCESS; @@ -94,7 +94,7 @@ public class TimedTaskJobHandler { try { everyDayExecutes.get(i).execute(); } catch (Exception e) { - log.error("每分钟任务异常", e); + log.error("每日任务异常", e); } } return ReturnT.SUCCESS; diff --git a/consumer/src/main/java/cn/lili/timetask/handler/EveryDayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/EveryDayExecute.java index dd927f90..e5fc9a59 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/EveryDayExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/EveryDayExecute.java @@ -5,7 +5,7 @@ package cn.lili.timetask.handler; * 每日凌晨1点执行 * * @author Chopper - * @date 2020/12/24 11:52 + * @since 2020/12/24 11:52 */ public interface EveryDayExecute { diff --git a/consumer/src/main/java/cn/lili/timetask/handler/EveryHourExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/EveryHourExecute.java index 9ebc83d8..46042203 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/EveryHourExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/EveryHourExecute.java @@ -4,7 +4,7 @@ package cn.lili.timetask.handler; * 每小时任务 * * @author Chopper - * @date 2020/12/24 11:52 + * @since 2020/12/24 11:52 */ public interface EveryHourExecute { diff --git a/consumer/src/main/java/cn/lili/timetask/handler/EveryMinuteExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/EveryMinuteExecute.java index 4d7e08c8..e1960e24 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/EveryMinuteExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/EveryMinuteExecute.java @@ -4,7 +4,7 @@ package cn.lili.timetask.handler; * 每分钟任务 * * @author Chopper - * @date 2020/12/24 11:52 + * @since 2020/12/24 11:52 */ public interface EveryMinuteExecute { diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java index 14a98d78..958402db 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java @@ -1,12 +1,11 @@ package cn.lili.timetask.handler.impl.bill; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.lili.modules.store.entity.dto.StoreSettlementDay; -import cn.lili.modules.store.mapper.StoreDetailMapper; import cn.lili.modules.store.service.BillService; +import cn.lili.modules.store.service.StoreDetailService; import cn.lili.timetask.handler.EveryDayExecute; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -16,16 +15,21 @@ import java.util.List; * 店铺结算执行 * * @author Bulbasaur - * @date 2021/2/18 3:45 下午 + * @since 2021/2/18 3:45 下午 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class BillExecute implements EveryDayExecute { - //结算单 - private final BillService billService; - //店铺详情 - private final StoreDetailMapper storeDetailMapper; + /** + * 结算单 + */ + @Autowired + private BillService billService; + /** + * 店铺详情 + */ + @Autowired + private StoreDetailService storeDetailService; /** * 1.查询今日待结算的商家 @@ -35,20 +39,22 @@ public class BillExecute implements EveryDayExecute { @Override public void execute() { - //获取当前时间的前一天 - String day = "," + DateUtil.date().dayOfMonth() + ","; + //获取当前天数 + int day = DateUtil.date().dayOfMonth(); //获取待结算商家列表 - List storeList = storeDetailMapper.getSettlementStore(new QueryWrapper().like("settlement_cycle", day)); + List storeList = storeDetailService.getSettlementStore(day); + //获取当前时间 + DateTime endTime = DateUtil.date(); //批量商家结算 for (StoreSettlementDay storeSettlementDay : storeList) { //生成结算单 - billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay()); + billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime); //修改店铺结算时间 - storeDetailMapper.updateSettlementDay(storeSettlementDay.getStoreId(), DateUtil.date()); + storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime); } } } diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java new file mode 100644 index 00000000..6be091e2 --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java @@ -0,0 +1,25 @@ +package cn.lili.timetask.handler.impl.broadcast; + +import cn.lili.modules.goods.service.CommodityService; +import cn.lili.timetask.handler.EveryHourExecute; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 小程序直播状态获取 + * + * @author Bulbasaur + * @since 2021/5/20 2:52 下午 + */ +@Component +public class BroadcastExecute implements EveryHourExecute { + + @Autowired + private CommodityService commodityService; + + @Override + public void execute() { + //同步直播商品状态 + commodityService.getGoodsWareHouse(); + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java new file mode 100644 index 00000000..acb0503c --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java @@ -0,0 +1,56 @@ +package cn.lili.timetask.handler.impl.coupon; + +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; +import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.timetask.handler.EveryDayExecute; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Calendar; +import java.util.Date; + +/** + * 优惠券状态监测 + * + * @author Bulbasaur + * @since 2021/5/24 10:08 上午 + */ +@Component +public class CouponExecute implements EveryDayExecute { + + /** + * 过期常量,过期后或者使用后一定时间内,删除无效的优惠券,物理删除 + */ + static final int EXPIRATION_DAY = 3; + + @Autowired + private MemberCouponService memberCouponService; + + /** + * 检测优惠券的使用时间,超期未使用则失效 + * 此方法用于领取*天后失效优惠券使用 + */ + @Override + public void execute() { + //将过期优惠券变更为过期状态 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()) + .le(MemberCoupon::getEndTime, new Date()) + .set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); + this.memberCouponService.update(updateWrapper); + + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - EXPIRATION_DAY); + Date removeTime = calendar.getTime(); + //删除过期/已使用的优惠券 + LambdaUpdateWrapper deleteWrapper = new LambdaUpdateWrapper() + //如果结束时间小于 当前时间增加指定删除日期,则删除 + .le(MemberCoupon::getEndTime, removeTime); + this.memberCouponService.remove(deleteWrapper); + + + } + +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java index f5ae0203..85a68132 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java @@ -1,5 +1,6 @@ package cn.lili.timetask.handler.impl.goods; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.lili.modules.goods.mapper.GoodsMapper; @@ -7,10 +8,9 @@ import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.mapper.MemberEvaluationMapper; import cn.lili.timetask.handler.EveryDayExecute; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.List; import java.util.Map; @@ -18,15 +18,20 @@ import java.util.Map; * 商品定时器 * * @author Chopper - * @date 2021/3/18 3:23 下午 + * @since 2021/3/18 3:23 下午 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsExecute implements EveryDayExecute { - //会员评价 - private final MemberEvaluationMapper memberEvaluationMapper; - //商品 - private final GoodsMapper goodsMapper; + /** + * 会员评价 + */ + @Resource + private MemberEvaluationMapper memberEvaluationMapper; + /** + * 商品 + */ + @Resource + private GoodsMapper goodsMapper; /** * 查询已上架的商品的评价数量并赋值 @@ -39,9 +44,8 @@ public class GoodsExecute implements EveryDayExecute { new QueryWrapper() .between("create_time", DateUtil.yesterday(), new DateTime())); - System.out.println("评论数量" + list.size()); for (Map map : list) { - goodsMapper.addGoodsCommentNum(Integer.parseInt(map.get("num").toString()), map.get("goods_id").toString()); + goodsMapper.addGoodsCommentNum(Convert.toInt(map.get("num").toString()), map.get("goods_id").toString()); } } diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java new file mode 100644 index 00000000..ecf63d58 --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java @@ -0,0 +1,84 @@ +package cn.lili.timetask.handler.impl.hotwords; + +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.service.HotWordsHistoryService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.HotWordsSetting; +import cn.lili.modules.system.entity.dto.HotWordsSettingItem; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import cn.lili.timetask.handler.EveryDayExecute; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.DefaultTypedTuple; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * @author paulG + * @since 2021/3/11 + **/ +@Slf4j +@Component +public class HotWordsEveryDayTaskExecute implements EveryDayExecute { + + @Autowired + private Cache cache; + + @Autowired + private HotWordsHistoryService hotWordsHistoryService; + @Autowired + private SettingService settingService; + + /** + * 执行每日任务 + */ + @Override + public void execute() { + //获取大于0分的热词 + Set tuples = cache.zRangeByScore(CachePrefix.HOT_WORD.getPrefix(), 1, Integer.MAX_VALUE); + //如果任务不为空 + if (!CollectionUtils.isEmpty(tuples)) { + + //因为是第二天统计第一天的数据,所以这里获取昨天凌晨的时间 + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1); + + //批量保存热词 + List hotWordsHistories = new ArrayList<>(); + for (DefaultTypedTuple tuple : tuples) { + String keywords = (String) tuple.getValue(); + Double score = tuple.getScore(); + hotWordsHistories.add(new HotWordsHistory(keywords, score.intValue(), calendar.getTime())); + } + + hotWordsHistoryService.saveBatch(hotWordsHistories); + } + //移除昨日的热搜词 + cache.remove(CachePrefix.HOT_WORD.getPrefix()); + + //设置今日默认热词 + Setting setting = settingService.get(SettingEnum.HOT_WORDS.name()); + if (setting == null) { + return; + } + HotWordsSetting hotWordsSetting = JSONUtil.toBean(setting.getSettingValue(), HotWordsSetting.class); + List hotWordsSettingItems = hotWordsSetting.getHotWordsSettingItems(); + if (hotWordsSettingItems != null && !hotWordsSettingItems.isEmpty()) { + for (HotWordsSettingItem hotWordsSettingItem : hotWordsSettingItems) { + cache.zAdd(CachePrefix.HOT_WORD.getPrefix(), hotWordsSettingItem.getScore(), hotWordsSettingItem.getKeywords()); + } + } + } + +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java index 6e10e4a2..84e34132 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java @@ -12,7 +12,6 @@ import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import cn.lili.timetask.handler.EveryMinuteExecute; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -24,16 +23,21 @@ import java.util.stream.Collectors; * 订单自动取消(每分钟执行) * * @author paulG - * @date 2021/3/11 + * @since 2021/3/11 **/ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CancelOrderTaskExecute implements EveryMinuteExecute { - //订单 - private final OrderService orderService; - //设置 - private final SettingService settingService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; @Override @@ -41,11 +45,11 @@ public class CancelOrderTaskExecute implements EveryMinuteExecute { Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name()); OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class); if (orderSetting != null && orderSetting.getAutoCancel() != null) { - // 订单自动取消时间 = 当前时间 - 自动取消时间分钟数 + //订单自动取消时间 = 当前时间 - 自动取消时间分钟数 DateTime cancelTime = DateUtil.offsetMinute(DateUtil.date(), -orderSetting.getAutoCancel()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.UNPAID.name()); - // 订单创建时间 <= 订单自动取消时间 + //订单创建时间 <= 订单自动取消时间 queryWrapper.le(Order::getCreateTime, cancelTime); List list = orderService.list(queryWrapper); List cancelSnList = list.stream().map(Order::getSn).collect(Collectors.toList()); diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java index 13a3d372..53024820 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java @@ -3,13 +3,19 @@ package cn.lili.timetask.handler.impl.order; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.modules.distribution.service.DistributionOrderService; import cn.lili.modules.member.entity.dto.MemberEvaluationDTO; import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; import cn.lili.modules.member.service.MemberEvaluationService; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.entity.enums.CommentStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.mapper.OrderItemMapper; import cn.lili.modules.order.order.service.OrderItemService; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.system.entity.dos.Setting; @@ -18,13 +24,13 @@ import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import cn.lili.timetask.handler.EveryDayExecute; 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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.Date; +import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; @@ -34,34 +40,72 @@ import java.util.stream.Collectors; **/ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) + public class OrderEveryDayTaskExecute implements EveryDayExecute { - //订单 - private final OrderService orderService; - //订单货物 - private final OrderItemService orderItemService; - //设置 - private final SettingService settingService; - //会员评价 - private final MemberEvaluationService memberEvaluationService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 订单货物 + */ + @Autowired + private OrderItemService orderItemService; + @Resource + private OrderItemMapper orderItemMapper; + /** + * 设置 + */ + @Autowired + private SettingService settingService; + /** + * 会员评价 + */ + @Autowired + private MemberEvaluationService memberEvaluationService; + + @Autowired + private DistributionOrderService distributionOrderService; /** * 执行每日任务 */ @Override public void execute() { + Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name()); - //自动确认收货 + //订单设置 OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class); if (orderSetting == null) { - throw new ServiceException("系统配置异常"); + throw new ServiceException(ResultCode.ORDER_SETTING_ERROR); } - //自动确认收货 - completedOrder(orderSetting); - //自动好评 - memberEvaluation(orderSetting); + try { + //自动确认收货 + completedOrder(orderSetting); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + try { + //自动好评 + memberEvaluation(orderSetting); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + try { + //关闭允许售后申请 + closeAfterSale(orderSetting); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + try { + //关闭允许投诉 + closeComplaint(orderSetting); + } catch (Exception e) { + log.error(e.getMessage(), e); + } } /** @@ -70,22 +114,27 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute { * @param orderSetting 订单设置 */ private void completedOrder(OrderSetting orderSetting) { - // 订单自动收货时间 = 当前时间 - 自动收货时间天数 - DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoEvaluation()); + + + //订单自动收货时间 = 当前时间 - 自动收货时间天数 + DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoReceive()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.DELIVERED.name()); - // 订单发货时间 >= 订单自动收货时间 - queryWrapper.ge(Order::getLogisticsTime, receiveTime); + + //订单发货时间 >= 订单自动收货时间 + queryWrapper.le(Order::getLogisticsTime, receiveTime); List list = orderService.list(queryWrapper); - List receiveSnList = list.stream().map(Order::getSn).collect(Collectors.toList()); - if (!receiveSnList.isEmpty()) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(Order::getSn, receiveSnList); - updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.COMPLETED.name()).set(Order::getCompleteTime, new Date()); - boolean update = orderService.update(updateWrapper); - if (Boolean.FALSE.equals(update)) { - log.error("自动收货订单失败!订单编号为[{}]", receiveSnList); + + try { + //判断是否有符合条件的订单,进行订单完成处理 + if (!list.isEmpty()) { + List receiveSnList = list.stream().map(Order::getSn).collect(Collectors.toList()); + for (String orderSn : receiveSnList) { + orderService.systemComplete(orderSn); + } } + } catch (Exception e) { + log.error(e.getMessage(), e); } } @@ -95,27 +144,115 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute { * @param orderSetting 订单设置 */ private void memberEvaluation(OrderSetting orderSetting) { - // 订单自动收货时间 = 当前时间 - 自动收货时间天数 - DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoReceive()); - // 订单完成时间 <= 订单自动好评时间 - List orderItems = orderItemService.waitEvaluate(receiveTime); + //订单自动收货时间 = 当前时间 - 自动收货时间天数 + DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoEvaluation()); - for (OrderItem orderItem : orderItems) { + //订单完成时间 <= 订单自动好评时间 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.le("o.complete_time", receiveTime); + queryWrapper.eq("oi.comment_status", CommentStatusEnum.UNFINISHED.name()); + List orderItems = orderItemMapper.waitOperationOrderItem(queryWrapper); - MemberEvaluationDTO memberEvaluationDTO = new MemberEvaluationDTO(); - memberEvaluationDTO.setOrderItemSn(orderItem.getSn()); - memberEvaluationDTO.setContent("系统默认好评"); - memberEvaluationDTO.setGoodsId(orderItem.getGoodsId()); - memberEvaluationDTO.setSkuId(orderItem.getSkuId()); - memberEvaluationDTO.setGrade(EvaluationGradeEnum.GOOD.name()); - memberEvaluationDTO.setDeliveryScore(5); - memberEvaluationDTO.setDescriptionScore(5); - memberEvaluationDTO.setServiceScore(5); + //判断是否有符合条件的订单,进行自动评价处理 + if (!orderItems.isEmpty()) { + for (OrderItem orderItem : orderItems) { + MemberEvaluationDTO memberEvaluationDTO = new MemberEvaluationDTO(); + memberEvaluationDTO.setOrderItemSn(orderItem.getSn()); + memberEvaluationDTO.setContent("系统默认好评"); + memberEvaluationDTO.setGoodsId(orderItem.getGoodsId()); + memberEvaluationDTO.setSkuId(orderItem.getSkuId()); + memberEvaluationDTO.setGrade(EvaluationGradeEnum.GOOD.name()); + memberEvaluationDTO.setDeliveryScore(5); + memberEvaluationDTO.setDescriptionScore(5); + memberEvaluationDTO.setServiceScore(5); - memberEvaluationService.addMemberEvaluation(memberEvaluationDTO); + try { + memberEvaluationService.addMemberEvaluation(memberEvaluationDTO, false); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } } } + /** + * 关闭允许售后申请 + * + * @param orderSetting 订单设置 + */ + private void closeAfterSale(OrderSetting orderSetting) { + //为0则不限制 + if (orderSetting.getCloseAfterSale() == null || orderSetting.getCloseAfterSale() == 0) { + return; + } + //订单关闭售后申请时间 = 当前时间 - 自动关闭售后申请天数 + DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getCloseAfterSale()); + + //关闭售后订单=未售后订单+小于订单关闭售后申请时间 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.le("o.complete_time", receiveTime); + queryWrapper.eq("oi.after_sale_status", OrderItemAfterSaleStatusEnum.NOT_APPLIED.name()); + List orderItems = orderItemMapper.waitOperationOrderItem(queryWrapper); + + //判断是否有符合条件的订单,关闭允许售后申请处理 + if (!orderItems.isEmpty()) { + + //获取订单货物ID + List orderItemIdList = orderItems.stream().map(OrderItem::getId).collect(Collectors.toList()); + + //修改订单售后状态 + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() + .set(OrderItem::getAfterSaleStatus, OrderItemAfterSaleStatusEnum.EXPIRED.name()) + .in(OrderItem::getId, orderItemIdList); + orderItemService.update(lambdaUpdateWrapper); + //修改订售后状态 + List orderItemsList = orderItems.stream() + .map((orderItem) -> { + orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.EXPIRED.name()); + return orderItem; + }) + .collect(Collectors.toList()); + //修改对应分销订单状态 + distributionOrderService.updateDistributionOrderStatus(orderItemsList); + } + + } + + /** + * 关闭允许交易投诉 + * + * @param orderSetting 订单设置 + */ + private void closeComplaint(OrderSetting orderSetting) { + + //为0则不限制 + if (orderSetting.getCloseComplaint() == null || orderSetting.getCloseComplaint() == 0) { + return; + } + //订单关闭交易投诉申请时间 = 当前时间 - 自动关闭交易投诉申请天数 + DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getCloseComplaint()); + + //关闭售后订单=未售后订单+小于订单关闭售后申请时间 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.le("o.complete_time", receiveTime); + queryWrapper.eq("oi.complain_status", OrderComplaintStatusEnum.NO_APPLY.name()); + List orderItems = orderItemMapper.waitOperationOrderItem(queryWrapper); + + //判断是否有符合条件的订单,关闭允许售后申请处理 + if (!orderItems.isEmpty()) { + + //获取订单货物ID + List orderItemIdList = orderItems.stream().map(OrderItem::getId).collect(Collectors.toList()); + + //修改订单投诉状态 + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() + .set(OrderItem::getComplainStatus, OrderItemAfterSaleStatusEnum.EXPIRED.name()) + .in(OrderItem::getId, orderItemIdList); + orderItemService.update(lambdaUpdateWrapper); + } + + } + } diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/RechargeOrderTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/RechargeOrderTaskExecute.java new file mode 100644 index 00000000..e0ca23a1 --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/RechargeOrderTaskExecute.java @@ -0,0 +1,61 @@ +package cn.lili.timetask.handler.impl.order; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.modules.order.order.entity.enums.PayStatusEnum; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.OrderSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import cn.lili.modules.wallet.entity.dos.Recharge; +import cn.lili.modules.wallet.service.RechargeService; +import cn.lili.timetask.handler.EveryMinuteExecute; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 充值订单自动取消(每分钟执行) + * + * @author zhuhai + * @since 2021/3/11 + **/ +@Slf4j +@Component +public class RechargeOrderTaskExecute implements EveryMinuteExecute { + /** + * 充值 + */ + @Autowired + private RechargeService rechargeService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; + + + @Override + public void execute() { + Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name()); + OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class); + if (orderSetting != null && orderSetting.getAutoCancel() != null) { + //充值订单自动取消时间 = 当前时间 - 自动取消时间分钟数 + DateTime cancelTime = DateUtil.offsetMinute(DateUtil.date(), -orderSetting.getAutoCancel()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Recharge::getPayStatus, PayStatusEnum.UNPAID.name()); + //充值订单创建时间 <= 订单自动取消时间 + queryWrapper.le(Recharge::getCreateTime, cancelTime); + List list = rechargeService.list(queryWrapper); + List cancelSnList = list.stream().map(Recharge::getRechargeSn).collect(Collectors.toList()); + for (String sn : cancelSnList) { + rechargeService.rechargeOrderCancel(sn); + } + } + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/MemberCouponSignEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/MemberCouponSignEverydayExecute.java new file mode 100644 index 00000000..13a5e7a3 --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/MemberCouponSignEverydayExecute.java @@ -0,0 +1,45 @@ +package cn.lili.timetask.handler.impl.promotion; + +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.modules.promotion.entity.dos.Seckill; +import cn.lili.modules.promotion.service.MemberCouponSignService; +import cn.lili.modules.promotion.service.SeckillService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SeckillSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import cn.lili.timetask.handler.EveryDayExecute; +import com.google.gson.Gson; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 促销活动每日定时器 + * + * @author Chopper + * @since 2021/3/18 3:23 下午 + */ +@Slf4j +@Component +public class MemberCouponSignEverydayExecute implements EveryDayExecute { + + @Autowired + private MemberCouponSignService memberCouponSignService; + + /** + * 将已过期的促销活动置为结束 + */ + @Override + public void execute() { + try { + memberCouponSignService.clean(); + } catch (Exception e) { + log.error("清除领取优惠券标记异常", e); + } + + } + +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java index d83ef5ad..2e285823 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java @@ -1,131 +1,84 @@ package cn.lili.timetask.handler.impl.promotion; -import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; -import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.vos.CouponVO; -import cn.lili.modules.promotion.entity.vos.PintuanVO; -import cn.lili.modules.promotion.service.*; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.modules.promotion.entity.dos.Seckill; +import cn.lili.modules.promotion.service.SeckillService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SeckillSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; import cn.lili.timetask.handler.EveryDayExecute; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import lombok.RequiredArgsConstructor; +import com.google.gson.Gson; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - /** * 促销活动每日定时器 * * @author Chopper - * @date 2021/3/18 3:23 下午 + * @since 2021/3/18 3:23 下午 */ +@Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PromotionEverydayExecute implements EveryDayExecute { - //Mongo - private final MongoTemplate mongoTemplate; - //满额活动 - private final FullDiscountService fullDiscountService; - //拼团 - private final PintuanService pintuanService; - //优惠券 - private final CouponService couponService; - //会员优惠券 - private final MemberCouponService memberCouponService; - //促销商品 - private final PromotionGoodsService promotionGoodsService; - + /** + * ES商品索引 + */ + @Autowired + private EsGoodsIndexService esGoodsIndexService; + /** + * 系统设置 + */ + @Autowired + private SettingService settingService; + /** + * 秒杀活动 + */ + @Autowired + private SeckillService seckillService; /** * 将已过期的促销活动置为结束 */ @Override public void execute() { - - Query query = new Query(); - query.addCriteria(Criteria.where("promotionStatus").ne(PromotionStatusEnum.END.name()).orOperator(Criteria.where("promotionStatus").ne(PromotionStatusEnum.CLOSE.name()))); - query.addCriteria(Criteria.where("endTime").lt(new Date())); - - List promotionIds = new ArrayList<>(); - - List fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); - if (!fullDiscountVOS.isEmpty()) { - List ids = new ArrayList<>(); - for (FullDiscountVO vo : fullDiscountVOS) { - vo.setPromotionStatus(PromotionStatusEnum.END.name()); - if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { - for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { - promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); - } - } - mongoTemplate.save(vo); - ids.add(vo.getId()); - } - fullDiscountService.update(this.getUpdatePromotionWrapper(ids)); - promotionIds.addAll(ids); + try { + //清除所有商品索引的无效促销活动 + this.esGoodsIndexService.cleanInvalidPromotion(); + } catch (Exception e) { + log.error("清楚商品索引中无效促销异常", e); } - - List pintuanVOS = mongoTemplate.find(query, PintuanVO.class); - if (!pintuanVOS.isEmpty()) { - List ids = new ArrayList<>(); - for (PintuanVO vo : pintuanVOS) { - vo.setPromotionStatus(PromotionStatusEnum.END.name()); - if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { - for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { - promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); - } - } - mongoTemplate.save(vo); - ids.add(vo.getId()); - } - pintuanService.update(this.getUpdatePromotionWrapper(ids)); - promotionIds.addAll(ids); + try { + //定时创建活动 + addSeckill(); + } catch (Exception e) { + log.error("秒杀活动添加异常", e); } - List couponVOS = mongoTemplate.find(query, CouponVO.class); - if (!couponVOS.isEmpty()) { - List ids = new ArrayList<>(); - for (CouponVO vo : couponVOS) { - vo.setPromotionStatus(PromotionStatusEnum.END.name()); - if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { - for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { - promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); - } - } - mongoTemplate.save(vo); - ids.add(vo.getId()); - } - couponService.update(this.getUpdatePromotionWrapper(ids)); - LambdaUpdateWrapper memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper().in(MemberCoupon::getCouponId, ids).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); - memberCouponService.update(memberCouponLambdaUpdateWrapper); - promotionIds.addAll(ids); - } - - promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(promotionIds)); - } - private UpdateWrapper getUpdatePromotionWrapper(List ids) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.in("id", ids); - updateWrapper.set("promotion_status", PromotionStatusEnum.END.name()); - return updateWrapper; - } + /** + * 添加秒杀活动 + * 从系统设置中获取秒杀活动的配置 + * 添加明天后的秒杀活动 + */ + private void addSeckill() { + Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); + SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); + log.info("生成秒杀活动设置:{}", seckillSetting); + for (int i = 1; i <= SeckillService.PRE_CREATION; i++) { + Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule()); - private UpdateWrapper getUpdatePromotionGoodsWrapper(List ids) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.in("promotion_id", ids); - updateWrapper.set("promotion_status", PromotionStatusEnum.END.name()); - return updateWrapper; + //如果已经存在促销,则不再次保存 + if (seckillService.list( + PromotionTools.checkActiveTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL, null, seckill.getId())).isEmpty()) { + boolean result = seckillService.savePromotions(seckill); + log.info("生成秒杀活动参数:{},结果:{}", seckill, result); + } + } } } diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/MemberStatisticsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/MemberStatisticsExecute.java index 257033b9..b349250d 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/MemberStatisticsExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/MemberStatisticsExecute.java @@ -1,9 +1,8 @@ package cn.lili.timetask.handler.impl.statistics; -import cn.lili.modules.statistics.model.dos.MemberStatisticsData; -import cn.lili.modules.statistics.service.MemberStatisticsDataService; +import cn.lili.modules.statistics.entity.dos.MemberStatisticsData; +import cn.lili.modules.statistics.service.MemberStatisticsService; import cn.lili.timetask.handler.EveryDayExecute; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -15,15 +14,17 @@ import java.util.Date; * 会员数据统计 * * @author Chopper - * @date 2021-03-02 14:56 + * @since 2021-03-02 14:56 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberStatisticsExecute implements EveryDayExecute { - //会员统计 - private final MemberStatisticsDataService memberStatisticsDataService; + /** + * 会员统计 + */ + @Autowired + private MemberStatisticsService memberStatisticsService; @Override public void execute() { @@ -42,30 +43,13 @@ public class MemberStatisticsExecute implements EveryDayExecute { calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - 1); startTime = calendar.getTime(); MemberStatisticsData memberStatisticsData = new MemberStatisticsData(); - memberStatisticsData.setMemberCount(memberStatisticsDataService.memberCount(endTime)); + memberStatisticsData.setMemberCount(memberStatisticsService.memberCount(endTime)); memberStatisticsData.setCreateDate(startTime); - memberStatisticsData.setActiveQuantity(memberStatisticsDataService.activeQuantity(startTime)); - memberStatisticsData.setNewlyAdded(memberStatisticsDataService.newlyAdded(startTime, endTime)); - memberStatisticsDataService.save(memberStatisticsData); + memberStatisticsData.setActiveQuantity(memberStatisticsService.activeQuantity(startTime)); + memberStatisticsData.setNewlyAdded(memberStatisticsService.newlyAdded(startTime, endTime)); + memberStatisticsService.save(memberStatisticsData); } catch (Exception e) { log.error("每日会员统计功能异常:", e); } } - - public static void main(String[] args) { - - //统计的时间(开始。结束时间) - Date startTime, endTime; - //初始值 - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 1); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.HOUR_OF_DAY, 0); - endTime = calendar.getTime(); - //-1天,即为开始时间 - calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - 1); - startTime = calendar.getTime(); - System.out.println(startTime); - } } \ No newline at end of file diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/OnlineMemberStatistics.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/OnlineMemberStatistics.java index 0dfa4f15..19f90bb1 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/OnlineMemberStatistics.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/OnlineMemberStatistics.java @@ -1,12 +1,11 @@ package cn.lili.timetask.handler.impl.statistics; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.security.enums.UserEnums; -import cn.lili.config.properties.StatisticsProperties; -import cn.lili.modules.statistics.model.vo.OnlineMemberVO; +import cn.lili.common.properties.StatisticsProperties; +import cn.lili.modules.statistics.entity.vo.OnlineMemberVO; import cn.lili.timetask.handler.EveryHourExecute; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -14,22 +13,28 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** * 实时在线人数统计 * * @author Chopper - * @date 2021-02-21 09:47 + * @since 2021-02-21 09:47 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OnlineMemberStatistics implements EveryHourExecute { - //缓存 - private final Cache cache; - //统计小时 - private final StatisticsProperties statisticsProperties; + /** + * 缓存 + */ + @Autowired + private Cache> cache; + /** + * 统计小时 + */ + @Autowired + private StatisticsProperties statisticsProperties; @Override @@ -37,12 +42,10 @@ public class OnlineMemberStatistics implements EveryHourExecute { Calendar calendar = Calendar.getInstance(); - Object object = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix()); - List onlineMemberVOS; - if (object == null) { + List onlineMemberVOS = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix()); + + if (onlineMemberVOS == null) { onlineMemberVOS = new ArrayList<>(); - } else { - onlineMemberVOS = (List) object; } //过滤 有效统计时间 @@ -52,8 +55,16 @@ public class OnlineMemberStatistics implements EveryHourExecute { calendar.set(Calendar.MILLISECOND, 0); Calendar finalCalendar = calendar; + + AtomicReference lastNum = new AtomicReference<>(0); onlineMemberVOS = onlineMemberVOS.stream() - .filter(onlineMemberVO -> onlineMemberVO.getDate().after(finalCalendar.getTime())) + .filter(onlineMemberVO -> { + //如果为过滤参数,则记录为过期参数,则为统一时段上一周期的在线人数 + if (!onlineMemberVO.getDate().after(finalCalendar.getTime())) { + lastNum.set(onlineMemberVO.getNum()); + } + return onlineMemberVO.getDate().after(finalCalendar.getTime()); + }) .collect(Collectors.toList()); //计入新数据 @@ -61,7 +72,8 @@ public class OnlineMemberStatistics implements EveryHourExecute { calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); - onlineMemberVOS.add(new OnlineMemberVO(calendar.getTime(), cache.keys(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + "*").size())); + onlineMemberVOS.add(new OnlineMemberVO(calendar.getTime(), cache.keys(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + "*").size(), + lastNum.get())); //写入缓存 cache.put(CachePrefix.ONLINE_MEMBER.getPrefix(), onlineMemberVOS); @@ -76,12 +88,10 @@ public class OnlineMemberStatistics implements EveryHourExecute { */ public void execute(Date time, Integer num) { - Object object = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix()); - List onlineMemberVOS; - if (object == null) { + List onlineMemberVOS = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix()); + + if (onlineMemberVOS == null) { onlineMemberVOS = new ArrayList<>(); - } else { - onlineMemberVOS = (List) object; } Calendar calendar = Calendar.getInstance(); @@ -92,11 +102,10 @@ public class OnlineMemberStatistics implements EveryHourExecute { calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 48); - Calendar finalCalendar = calendar; onlineMemberVOS = onlineMemberVOS.stream() - .filter(onlineMemberVO -> onlineMemberVO.getDate().after(finalCalendar.getTime())) + .filter(onlineMemberVO -> onlineMemberVO.getDate().after(calendar.getTime())) .collect(Collectors.toList()); - onlineMemberVOS.add(new OnlineMemberVO(time, num)); + onlineMemberVOS.add(new OnlineMemberVO(time, num, num)); //写入缓存 cache.put(CachePrefix.ONLINE_MEMBER.getPrefix(), onlineMemberVOS); diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreExecute.java new file mode 100644 index 00000000..283a1552 --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreExecute.java @@ -0,0 +1,49 @@ +package cn.lili.timetask.handler.impl.store; + +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.modules.store.entity.enums.StoreStatusEnum; +import cn.lili.modules.store.service.StoreService; +import cn.lili.timetask.handler.EveryDayExecute; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 店铺信息更新 + * + * @author Chopper + * @since 2021/3/15 5:30 下午 + */ +@Component +@Slf4j +public class StoreExecute implements EveryDayExecute { + /** + * 店铺 + */ + @Autowired + private StoreService storeService; + + @Autowired + private GoodsSkuService goodsSkuService; + + @Override + public void execute() { + //获取所有开启的店铺 + List storeList = storeService.list(new LambdaQueryWrapper().eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name())); + + for (Store store : storeList) { + try { + Long num = goodsSkuService.countSkuNum(store.getId()); + storeService.updateStoreGoodsNum(store.getId(), num); + } catch (Exception e) { + log.error("店铺id为{},更新商品数量失败", store.getId(), e); + } + } + + + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/storeRating/StoreRatingExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreRatingExecute.java similarity index 75% rename from consumer/src/main/java/cn/lili/timetask/handler/impl/storeRating/StoreRatingExecute.java rename to consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreRatingExecute.java index 73a6fa26..269ab947 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/storeRating/StoreRatingExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreRatingExecute.java @@ -1,4 +1,4 @@ -package cn.lili.timetask.handler.impl.storeRating; +package cn.lili.timetask.handler.impl.store; import cn.lili.common.enums.SwitchEnum; import cn.lili.modules.member.entity.dos.MemberEvaluation; @@ -11,25 +11,30 @@ import cn.lili.timetask.handler.EveryDayExecute; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.List; /** * 店铺评分 * * @author Chopper - * @date 2021/3/15 5:30 下午 + * @since 2021/3/15 5:30 下午 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreRatingExecute implements EveryDayExecute { - //店铺 - private final StoreService storeService; - //会员评价 - private final MemberEvaluationMapper memberEvaluationMapper; + /** + * 店铺 + */ + @Autowired + private StoreService storeService; + /** + * 会员评价 + */ + @Resource + private MemberEvaluationMapper memberEvaluationMapper; @Override @@ -38,10 +43,10 @@ public class StoreRatingExecute implements EveryDayExecute { List storeList = storeService.list(new LambdaQueryWrapper().eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name())); for (Store store : storeList) { //店铺所有开启的评价 - LambdaQueryWrapper QueryWrapper = Wrappers.lambdaQuery(); - QueryWrapper.eq(MemberEvaluation::getStoreId, store.getId()); - QueryWrapper.eq(MemberEvaluation::getStatus, SwitchEnum.OPEN.name()); - StoreRatingVO storeRatingVO = memberEvaluationMapper.getStoreRatingVO(QueryWrapper); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MemberEvaluation::getStoreId, store.getId()); + lambdaQueryWrapper.eq(MemberEvaluation::getStatus, SwitchEnum.OPEN.name()); + StoreRatingVO storeRatingVO = memberEvaluationMapper.getStoreRatingVO(lambdaQueryWrapper); if (storeRatingVO != null) { //保存评分 diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java index 91f75d15..0783517b 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java @@ -1,14 +1,13 @@ package cn.lili.timetask.handler.impl.view; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.hutool.core.convert.Convert; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.utils.BeanUtil; -import cn.lili.common.utils.DateUtil; -import cn.lili.modules.statistics.model.dos.PlatformViewData; -import cn.lili.modules.statistics.service.PlatformViewDataService; +import cn.lili.modules.statistics.entity.dos.PlatformViewData; +import cn.lili.modules.statistics.service.PlatformViewService; import cn.lili.timetask.handler.EveryDayExecute; import lombok.Data; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -24,16 +23,21 @@ import java.util.List; * 统计 入库 * * @author Chopper - * @date 2021-01-15 18:20 + * @since 2021-01-15 18:20 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PageViewStatisticsExecute implements EveryDayExecute { - //缓存 - private final Cache cache; - //平台PV统计 - private final PlatformViewDataService platformViewDataService; + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 平台PV统计 + */ + @Autowired + private PlatformViewService platformViewService; @Override public void execute() { @@ -119,7 +123,7 @@ public class PageViewStatisticsExecute implements EveryDayExecute { @Transactional(rollbackFor = Exception.class) void batchSave(List pvKeys, List uvKeys, List platformViewData) { log.debug("批量保存流量数据,共计【{}】条", platformViewData.size()); - platformViewDataService.saveBatch(platformViewData); + platformViewService.saveBatch(platformViewData); //批量删除缓存key cache.multiDel(pvKeys); cache.multiDel(uvKeys); @@ -167,15 +171,15 @@ class PageViewStatistics { //将字符串解析成需要的对象 str = str.substring(str.indexOf("}") + 2); String[] dateStr = str.split("-"); - Integer year = Integer.parseInt(dateStr[0]); - Integer month = Integer.parseInt(dateStr[1]); + Integer year = Convert.toInt(dateStr[0]); + Integer month = Convert.toInt(dateStr[1]); Integer day; //是否有店铺id if (dateStr.length > 3) { - day = Integer.parseInt(dateStr[2]); + day = Convert.toInt(dateStr[2]); this.storeId = dateStr[3]; } else { - day = Integer.parseInt(dateStr[2]); + day = Convert.toInt(dateStr[2]); } Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, year); @@ -186,7 +190,6 @@ class PageViewStatistics { calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); this.date = calendar.getTime(); - System.out.println(DateUtil.toString(date,DateUtil.STANDARD_FORMAT)); } } diff --git a/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java b/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java new file mode 100644 index 00000000..708f58a9 --- /dev/null +++ b/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java @@ -0,0 +1,94 @@ +package cn.lili.trigger; + +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.common.utils.ThreadPoolUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationRunner; +import org.springframework.data.redis.core.DefaultTypedTuple; +import org.springframework.util.CollectionUtils; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * 延时队列工厂 + * + * @author paulG + * @since 2020/11/7 + **/ +@Slf4j +public abstract class AbstractDelayQueueListen implements ApplicationRunner { + + @Autowired + private Cache cache; + + + /** + * 延时队列机器开始运作 + */ + private void startDelayQueueMachine() { + log.info("延时队列机器{}开始运作", setDelayQueueName()); + + //监听redis队列 + while (true) { + try { + //获取当前时间的时间戳 + long now = System.currentTimeMillis() / 1000; + //获取当前时间前需要执行的任务列表 + Set tuples = cache.zRangeByScore(setDelayQueueName(), 0, now); + + //如果任务不为空 + if (!CollectionUtils.isEmpty(tuples)) { + log.info("执行任务:{}", JSONUtil.toJsonStr(tuples)); + + for (DefaultTypedTuple tuple : tuples) { + String jobId = (String) tuple.getValue(); + //移除缓存,如果移除成功则表示当前线程处理了延时任务,则执行延时任务 + Long num = cache.zRemove(setDelayQueueName(), jobId); + //如果移除成功, 则执行 + if (num > 0) { + ThreadPoolUtil.execute(() -> invoke(jobId)); + } + } + } + + } catch (Exception e) { + log.error("处理延时任务发生异常,异常原因为{}", e.getMessage(), e); + } finally { + //间隔一秒钟搞一次 + try { + TimeUnit.SECONDS.sleep(5L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + } + + } + + /** + * 最终执行的任务方法 + * + * @param jobId 任务id + */ + public abstract void invoke(String jobId); + + + /** + * 要实现延时队列的名字 + * @return 促销延时队列名称 + */ + public abstract String setDelayQueueName(); + + + /** + * 监听队列 + */ + public void init() { + ThreadPoolUtil.getPool().execute(this::startDelayQueueMachine); + } + +} diff --git a/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java b/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java index 54efb65b..f53371a9 100644 --- a/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java +++ b/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java @@ -1,12 +1,10 @@ package cn.lili.trigger; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.trigger.interfaces.TimeTriggerExecutor; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import cn.lili.common.trigger.util.TimeTriggerUtil; +import cn.lili.cache.Cache; +import cn.lili.trigger.model.TimeTriggerMsg; +import cn.lili.trigger.util.DelayQueueTools; import cn.lili.common.utils.SpringContextUtil; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; @@ -17,20 +15,19 @@ import org.springframework.stereotype.Component; * 事件触发消费者 * * @author paulG - * @date 2020/11/17 7:19 下午 + * @since 2020/11/17 7:19 下午 */ @Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RocketMQMessageListener(topic = "${lili.data.rocketmq.promotion-topic}", consumerGroup = "${lili.data.rocketmq.promotion-group}") public class TimeTriggerConsumer implements RocketMQListener { - - private final Cache cache; + @Autowired + private Cache cache; @Override public void onMessage(TimeTriggerMsg timeTriggerMsg) { try { - String key = TimeTriggerUtil.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey()); + String key = DelayQueueTools.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey()); if (cache.get(key) == null) { log.info("执行器执行被取消:{} | 任务标识:{}", timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getUniqueKey()); diff --git a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/TimeTriggerExecutor.java similarity index 82% rename from framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTriggerExecutor.java rename to consumer/src/main/java/cn/lili/trigger/TimeTriggerExecutor.java index 93531920..0a086060 100644 --- a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTriggerExecutor.java +++ b/consumer/src/main/java/cn/lili/trigger/TimeTriggerExecutor.java @@ -1,15 +1,16 @@ -package cn.lili.common.trigger.interfaces; +package cn.lili.trigger; /** * 延时任务执行器接口 - * @author Chopper * + * @author Chopper */ public interface TimeTriggerExecutor { /** * 执行任务 + * * @param object 任务参数 */ void execute(Object object); diff --git a/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java new file mode 100644 index 00000000..5c4203ff --- /dev/null +++ b/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java @@ -0,0 +1,36 @@ +package cn.lili.trigger.executor; + +import cn.hutool.json.JSONUtil; +import cn.lili.modules.goods.service.StudioService; +import cn.lili.trigger.TimeTriggerExecutor; +import cn.lili.trigger.message.BroadcastMessage; +import cn.lili.trigger.model.TimeExecuteConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 直播间事件触发 + * + * @author Bulbasaur + * @since 2021/6/1 5:02 下午 + */ +@Slf4j +@Component(TimeExecuteConstant.BROADCAST_EXECUTOR) +public class BroadcastTimeTriggerExecutor implements TimeTriggerExecutor { + + + @Autowired + private StudioService studioService; + + @Override + public void execute(Object object) { + //直播间订单消息 + BroadcastMessage broadcastMessage = JSONUtil.toBean(JSONUtil.parseObj(object), BroadcastMessage.class); + if (broadcastMessage != null && broadcastMessage.getStudioId() != null) { + log.info("直播间消费:{}", broadcastMessage); + //修改直播间状态 + studioService.updateStudioStatus(broadcastMessage); + } + } +} diff --git a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java index b0a44642..70e908e8 100644 --- a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java +++ b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java @@ -1,18 +1,11 @@ package cn.lili.trigger.executor; import cn.hutool.json.JSONUtil; -import cn.lili.common.delayqueue.PintuanOrderMessage; -import cn.lili.common.delayqueue.PromotionMessage; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.interfaces.TimeTriggerExecutor; -import cn.lili.common.trigger.model.TimeExecuteConstant; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import cn.lili.common.utils.DateUtil; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.service.PromotionService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.promotion.entity.dos.Pintuan; +import cn.lili.trigger.TimeTriggerExecutor; +import cn.lili.trigger.message.PintuanOrderMessage; +import cn.lili.trigger.model.TimeExecuteConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -22,52 +15,31 @@ import org.springframework.stereotype.Component; * * @author Chopper * @version v4.1 - * @date 2020/11/17 7:20 下午 + * @since 2020/11/17 7:20 下午 */ @Slf4j @Component(TimeExecuteConstant.PROMOTION_EXECUTOR) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor { - //促销 - private final PromotionService promotionService; - //Rocketmq - private final RocketmqCustomProperties rocketmqCustomProperties; - //延时任务 - private final TimeTrigger timeTrigger; - //订单 - private final OrderService orderService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; @Override public void execute(Object object) { - PromotionMessage promotionMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PromotionMessage.class); - // 促销延时信息 - if (promotionMessage != null && promotionMessage.getPromotionId() != null) { - log.info("促销活动信息消费:{}", promotionMessage); - // 如果为促销活动开始,则需要发布促销活动结束的定时任务 - if (PromotionStatusEnum.START.name().equals(promotionMessage.getPromotionStatus())) { - if (!promotionService.updatePromotionStatus(promotionMessage)) { - log.error("开始促销活动失败: {}", promotionMessage); - return; - } - // 促销活动开始后,设置促销活动结束的定时任务 - promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name()); - String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId(); - // 结束时间(延时一分钟) - long closeTime = promotionMessage.getEndTime().getTime() + 60000; - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic()); - timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(promotionMessage.getEndTime().getTime())); - } else { - promotionService.updatePromotionStatus(promotionMessage); - } - return; - } + //拼团订单消息 PintuanOrderMessage pintuanOrderMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PintuanOrderMessage.class); if (pintuanOrderMessage != null && pintuanOrderMessage.getPintuanId() != null) { log.info("拼团订单信息消费:{}", pintuanOrderMessage); - // 拼团订单自动处理 + //拼团订单自动处理 orderService.agglomeratePintuanOrder(pintuanOrderMessage.getPintuanId(), pintuanOrderMessage.getOrderSn()); } + Pintuan pintuan = JSONUtil.toBean(JSONUtil.parseObj(object), Pintuan.class); + if (pintuan != null && pintuan.getId() != null) { + this.orderService.checkFictitiousOrder(pintuan.getId(), pintuan.getRequiredNum(), pintuan.getFictitious()); + } } diff --git a/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java b/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java new file mode 100644 index 00000000..66deba66 --- /dev/null +++ b/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java @@ -0,0 +1,40 @@ +package cn.lili.trigger.listen; + +import cn.hutool.json.JSONUtil; +import cn.lili.trigger.AbstractDelayQueueListen; +import cn.lili.trigger.enums.DelayQueueEnums; +import cn.lili.trigger.interfaces.TimeTrigger; +import cn.lili.trigger.model.TimeTriggerMsg; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.stereotype.Component; + +/** + * PromotionTimeTriggerListen + * + * @author Chopper + * @version v1.0 + * 2021-06-11 10:47 + */ +@Component +public class PromotionDelayQueueListen extends AbstractDelayQueueListen { + + @Autowired + private TimeTrigger timeTrigger; + + @Override + public void invoke(String jobId) { + timeTrigger.execute(JSONUtil.toBean(jobId, TimeTriggerMsg.class)); + } + + + @Override + public String setDelayQueueName() { + return DelayQueueEnums.PROMOTION.name(); + } + + @Override + public void run(ApplicationArguments args) throws Exception { + this.init(); + } +} diff --git a/consumer/src/main/resources/application.yml b/consumer/src/main/resources/application.yml index df974ce6..f3c3ed20 100644 --- a/consumer/src/main/resources/application.yml +++ b/consumer/src/main/resources/application.yml @@ -25,28 +25,15 @@ management: exposure: include: '*' spring: + application: + name: consumer # 要在其中注册的Spring Boot Admin Server的URL。 boot: admin: client: url: http://127.0.0.1:8000 - # mongodb - data: - mongodb: - host: 127.0.0.1 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset cache: type: redis - - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false # Redis redis: host: 127.0.0.1 @@ -80,7 +67,7 @@ spring: default-datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: lilishop maxActive: 20 @@ -118,13 +105,13 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: - show: true + show: false # 忽略鉴权url ignored: @@ -158,14 +145,10 @@ ignored: - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - /v2/api-docs - /configuration/ui - /boot-admin - statics: - /**/*.js - /**/*.css - /**/*.png @@ -193,19 +176,21 @@ mybatis-plus: # 日志 logging: + config: classpath:logback-spring.xml # 输出级别 level: - cn.lili: info + root: info # org.hibernate: debug # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 path: lili-logs - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-size: 5MB + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB #加密参数 jasypt: encryptor: @@ -262,7 +247,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 127.0.0.1:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group @@ -274,6 +260,8 @@ lili: order-group: lili_order_group member-topic: lili_member_topic member-group: lili_member_group + store-topic: lili_store_topic + store-group: lili_store_group other-topic: lili_other_topic other-group: lili_other_group notice-topic: lili_notice_topic diff --git a/consumer/src/main/resources/logback-spring.xml b/consumer/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..b7c9425a --- /dev/null +++ b/consumer/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE_PATH}/rocketmq.log + + ${LOG_FILE_PATH}/rocketmq/rocketmq-%d{yyyy-MM-dd}.log + 30 + 30MB + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n + + + + + + + + + + + ${LOGSTASH_SERVER} + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/consumer/src/test/java/cn/lili/buyer/test/bill/BillTest.java b/consumer/src/test/java/cn/lili/buyer/test/bill/BillTest.java new file mode 100644 index 00000000..969fa7fc --- /dev/null +++ b/consumer/src/test/java/cn/lili/buyer/test/bill/BillTest.java @@ -0,0 +1,61 @@ +package cn.lili.buyer.test.bill; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.lili.modules.store.entity.dto.StoreSettlementDay; +import cn.lili.modules.store.service.BillService; +import cn.lili.modules.store.service.StoreDetailService; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.List; + +/** + * @author paulG + * @since 2022/1/10 + **/ +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class BillTest { + + + /** + * 结算单 + */ + @Autowired + private BillService billService; + + /** + * 店铺详情 + */ + @Autowired + private StoreDetailService storeDetailService; + + @Test + void createBillTest() { + //获取当前天数 + int day = DateUtil.date().dayOfMonth(); + + //获取待结算商家列表 + List storeList = storeDetailService.getSettlementStore(day); + + //获取当前时间 + DateTime endTime = DateUtil.date(); + //批量商家结算 + for (StoreSettlementDay storeSettlementDay : storeList) { + + //生成结算单 + billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime); + + //修改店铺结算时间 + storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime); + } + Assertions.assertTrue(true); + } + + +} diff --git a/consumer/src/test/java/cn/lili/buyer/test/cart/CartTest.java b/consumer/src/test/java/cn/lili/buyer/test/cart/CartTest.java index 97631024..e8412dab 100644 --- a/consumer/src/test/java/cn/lili/buyer/test/cart/CartTest.java +++ b/consumer/src/test/java/cn/lili/buyer/test/cart/CartTest.java @@ -3,17 +3,17 @@ package cn.lili.buyer.test.cart; import cn.lili.event.impl.StockUpdateExecute; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; /** * 订单库存扣减 */ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class CartTest { diff --git a/consumer/src/test/java/cn/lili/buyer/test/cart/MemberStatisticsTest.java b/consumer/src/test/java/cn/lili/buyer/test/cart/MemberStatisticsTest.java index de7e3171..bc882363 100644 --- a/consumer/src/test/java/cn/lili/buyer/test/cart/MemberStatisticsTest.java +++ b/consumer/src/test/java/cn/lili/buyer/test/cart/MemberStatisticsTest.java @@ -2,13 +2,13 @@ package cn.lili.buyer.test.cart; import cn.lili.timetask.handler.impl.statistics.MemberStatisticsExecute; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class MemberStatisticsTest { diff --git a/consumer/src/test/java/cn/lili/buyer/test/cart/OnlineTest.java b/consumer/src/test/java/cn/lili/buyer/test/cart/OnlineTest.java index 741f002a..e67101d2 100644 --- a/consumer/src/test/java/cn/lili/buyer/test/cart/OnlineTest.java +++ b/consumer/src/test/java/cn/lili/buyer/test/cart/OnlineTest.java @@ -3,10 +3,10 @@ package cn.lili.buyer.test.cart; import cn.lili.common.utils.DateUtil; import cn.lili.timetask.handler.impl.statistics.OnlineMemberStatistics; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.Calendar; import java.util.Random; @@ -14,7 +14,7 @@ import java.util.Random; /** * 订单库存扣减 */ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class OnlineTest { diff --git a/deploy-api.yml b/deploy-api.yml new file mode 100644 index 00000000..baecfc31 --- /dev/null +++ b/deploy-api.yml @@ -0,0 +1,651 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: lilishop-service + +--- +apiVersion: v1 +kind: Service +metadata: + name: buyer-api-service + namespace: lilishop-service + labels: + app.kubernetes.io/name: buyer-api-service + app.kubernetes.io/instance: api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + type: NodePort + ports: + - name: "8888" + nodePort: 30888 + port: 8888 + targetPort: buyer8888 + selector: + lilishop.service: buyer-api + +--- +apiVersion: v1 +kind: Service +metadata: + name: common-api-service + namespace: lilishop-service + labels: + app.kubernetes.io/name: common-api-service + app.kubernetes.io/instance: api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + type: NodePort + ports: + - name: "8890" + nodePort: 30890 + port: 8890 + targetPort: common8890 + selector: + lilishop.service: common-api + +--- +apiVersion: v1 +kind: Service +metadata: + name: seller-api-service + namespace: lilishop-service + labels: + app.kubernetes.io/name: seller-api-service + app.kubernetes.io/instance: api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + type: NodePort + ports: + - name: "8889" + nodePort: 30889 + port: 8889 + targetPort: seller8889 + selector: + lilishop.service: seller-api + +--- +apiVersion: v1 +kind: Service +metadata: + name: manager-api-service + namespace: lilishop-service + labels: + app.kubernetes.io/name: manager-api-service + app.kubernetes.io/instance: api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + type: NodePort + ports: + - name: "8887" + nodePort: 30887 + port: 8887 + targetPort: manager8887 + selector: + lilishop.service: manager-api + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: api-config + namespace: lilishop-service + labels: + app.kubernetes.io/name: mysql-db-config + app.kubernetes.io/instance: mysql-single + app.kubernetes.io/version: "8.0.28" + app.kubernetes.io/component: database + app.kubernetes.io/part-of: lilishop +data: + application.yml: | + server: + servlet: + context-path: / + + tomcat: + uri-encoding: UTF-8 + threads: + min-spare: 50 + max: 1000 + + # 与Spring Boot 2一样,默认情况下,大多数端点都不通过http公开,我们公开了所有端点。对于生产,您应该仔细选择要公开的端点。 + management: + # health: + # elasticsearch: + # enabled: false + # datasource: + # enabled: false + endpoints: + web: + exposure: + include: '*' + spring: + # 要在其中注册的Spring Boot Admin Server的URL。 + boot: + admin: + client: + url: http://192.168.0.116:8000 + cache: + type: redis + # Redis + redis: + host: redis-service.lilishop-middleware + port: 6379 + password: lilishop + lettuce: + pool: + # 连接池最大连接数(使用负值表示没有限制) 默认 8 + max-active: 200 + # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 + max-wait: 20 + # 连接池中的最大空闲连接 默认 8 + max-idle: 10 + # 连接池中的最小空闲连接 默认 8 + min-idle: 8 + # 文件大小上传配置 + servlet: + multipart: + max-file-size: 20MB + max-request-size: 20MB + jackson: + time-zone: GMT+8 + serialization: + #关闭jackson 对json做解析 + fail-on-empty-beans: false + + shardingsphere: + datasource: + # 数据库名称,可自定义,可以为多个,以逗号隔开,每个在这里定义的库,都要在下面定义连接属性 + names: default-datasource + default-datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://mysql.lilishop-middleware:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: lilishop + maxActive: 50 + initialSize: 20 + maxWait: 60000 + minIdle: 5 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + #是否缓存preparedStatement,也就是PSCache。在mysql下建议关闭。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。 + poolPreparedStatements: false + #要启用PSCache,-1为关闭 必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true 可以把这个数值配置大一些,比如说100 + maxOpenPreparedStatements: -1 + #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,log4j2 + #通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + #合并多个DruidDataSource的监控数据 + useGlobalDataSourceStat: true + loginUsername: druid + loginPassword: druid + # sharding: + # default-data-source-name: default-datasource + # #需要拆分的表,可以设置多个 在 li_order 级别即可 + # tables: + # #需要进行分表的逻辑表名 + # li_order: + # #实际的表结点,下面代表的是li_order_为开头的所有表,如果能确定表的范围例如按月份分表,这里的写法是data2020.li_order_$->{2020..2021}_$->{01..12} 表示例如 li_order_2020_01 li_order_2020_03 li_order_2021_01 + # actual-data-nodes: data2020.li_order_$->{2019..2021}_$->{01..12} + # table-strategy: + # # 分表策略,根据创建日期 + # standard: + # sharding-column: create_time + # #分表策略 + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm + # #范围查询实现 + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm + props: + #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 + sql: + show: true + + # 忽略鉴权url + ignored: + urls: + - /editor-app/** + - /actuator** + - /actuator/** + - /MP_verify_qSyvBPhDsPdxvOhC.txt + - /weixin/** + - /source/** + - /store/passport/login/** + - /store/passport/login/refresh/** + - /common/common/slider/** + - /common/common/sms/** + - /buyer/payment/cashier/** + - /buyer/other/pageData/** + - /buyer/other/article/** + - /buyer/goods/** + - /buyer/store/** + - /buyer/passport/connect/** + - /buyer/members/** + - /buyer/passport/member/** + - /buyer/passport/member/refresh/** + - /buyer/promotion/pintuan/** + - /buyer/promotion/seckill/** + - /buyer/promotion/pointsGoods/** + - /buyer/promotion/coupon + - /buyer/member/evaluation/**/goodsEvaluation + - /buyer/member/evaluation/**/evaluationNumber + - /buyer/other/appVersion/** + - /buyer/broadcast/studio/** + - /manager/passport/user/login + - /manager/passport/user/refresh/** + - /manager/other/elasticsearch + - /manager/other/customWords + - /druid/** + - /swagger-ui.html + - /doc.html + - /swagger-resources/** + - /swagger/** + - /webjars/** + - /v2/api-docs** + - /configuration/ui + - /boot-admin + - /manager/promotion/seckill/init + - /**/*.js + - /**/*.css + - /**/*.png + - /**/*.ico + + # Swagger界面内容配置 + swagger: + title: lilishop API接口文档 + description: lilishop Api Documentation + version: 4.2.2 + termsOfServiceUrl: https://pickmall.cn + contact: + name: lili + url: https://pickmall.cn + email: admin@pickmall.com + + # Mybatis-plus + mybatis-plus: + mapper-locations: classpath*:mapper/*.xml + configuration: + #缓存开启 + cache-enabled: true + #日志 + # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + + # 日志 + logging: + # 输出级别 + level: + cn.lili: info + # org.hibernate: debug + # org.springframework: debug + file: + # 指定路径 + path: logs + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB + #加密参数 + jasypt: + encryptor: + password: lili + + + lili: + #验证码设置 + verification-code: + #图形验证码有效时间 秒 包含滑块验证码有效时间, 以及验证通过之后,缓存中存储的验证结果有效时间 + effectiveTime: 300 + #水印 + watermark: LILI-SHOP + #干扰项数量 最大2 默认0 + interfereNum: 1 + #允许误差像素 + faultTolerant: 3 + #短信模版配置 + sms: + #登录 + LOGIN: SMS_205755300 + #注册 + REGISTER: SMS_205755298 + #找回密码 + FIND_USER: SMS_205755301 + #设置密码 + UPDATE_PASSWORD: SMS_205755297 + #支付密码 + WALLET_PASSWORD: SMS_205755301 + system: + isDemoSite: false + isTestModel: true + # 脱敏级别: + # 0:不做脱敏处理 + # 1:管理端用户手机号等信息脱敏 + # 2:商家端信息脱敏(为2时,表示管理端,商家端同时脱敏) + sensitiveLevel: 1 + + statistics: + # 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数 + onlineMember: 48 + # 当前在线人数刷新时间间隔,单位秒,设置为600,则每10分钟刷新一次 + currentOnlineUpdate: 600 + #qq lbs 申请 + lbs: + key: 4BYBZ-7MT6S-PUAOA-6BNWL-FJUD7-UUFXT + sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6 + #域名 + domain: + pc: http://192.168.0.116:8888 + wap: http://192.168.0.116:8888 + seller: http://192.168.0.116:8888 + admin: http://192.168.0.116:8888 + #api地址 + api: + buyer: http://192.168.0.116:8888 + base: http://192.168.0.116:8888 + manager: http://192.168.0.116:8888 + seller: http://192.168.0.116:8888 + + # jwt 细节设定 + jwt-setting: + # token过期时间(分钟) + tokenExpireTime: 30 + + # 使用Spring @Cacheable注解失效时间 + cache: + # 过期时间 单位秒 永久不过期设为-1 + timeout: 1500 + #多线程配置 + thread: + corePoolSize: 5 + maxPoolSize: 50 + queueCapacity: 50 + data: + elasticsearch: + cluster-name: elasticsearch + cluster-nodes: elasticsearch.lilishop-middleware:9200 + index: + number-of-replicas: 0 + number-of-shards: 3 + index-prefix: lili + schema: http + # account: + # username: elastic + # password: LiLiShopES + + logstash: + server: logstash-service.lilishop-middleware:4560 + rocketmq: + promotion-topic: lili_promotion_topic + promotion-group: lili_promotion_group + msg-ext-topic: lili_msg_topic + msg-ext-group: lili_msg_group + goods-topic: lili_goods_topic + goods-group: lili_goods_group + order-topic: lili_order_topic + order-group: lili_order_group + member-topic: lili_member_topic + member-group: lili_member_group + other-topic: lili_other_topic + other-group: lili_other_group + notice-topic: lili_notice_topic + notice-group: lili_notice_group + notice-send-topic: lili_send_notice_topic + notice-send-group: lili_send_notice_group + after-sale-topic: lili_after_sale_topic + after-sale-group: lili_after_sale_group + rocketmq: + name-server: rocketmq.lilishop-middleware:9876 + isVIPChannel: false + producer: + group: lili_group + send-message-timeout: 30000 + + xxl: + job: + admin: + addresses: http://xxl-job-service.lilishop-middleware:9001/xxl-job-admin + executor: + appname: xxl-job-executor-lilishop + address: + ip: + port: 8891 + logpath: ./xxl-job/executor + logretentiondays: 7 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: buyer-api + namespace: lilishop-service + labels: + app.kubernetes.io/name: buyer-api-service + app.kubernetes.io/instance: buyer-api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + replicas: 1 + selector: + matchLabels: + lilishop.service: buyer-api + template: + metadata: + labels: + lilishop.service: buyer-api + spec: + containers: + - image: 192.168.0.108:31320/buyer-api:4.2.4.1 + name: buyer-api + env: + - name: TZ + value: Asia/Shanghai + - name: JAVA_OPTS + value: -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -Xms128m -Xmx256m -Xmn128m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC + ports: + - name: buyer8888 + containerPort: 8888 + volumeMounts: + - mountPath: /application.yml + name: application-yml + subPath: application.yml + restartPolicy: Always + volumes: + - configMap: + name: api-config + name: application-yml + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: common-api + namespace: lilishop-service + labels: + app.kubernetes.io/name: common-api-service + app.kubernetes.io/instance: common-api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + replicas: 1 + selector: + matchLabels: + lilishop.service: common-api + template: + metadata: + labels: + lilishop.service: common-api + spec: + containers: + - image: 192.168.0.108:31320/common-api:4.2.4.1 + name: common-api + env: + - name: TZ + value: Asia/Shanghai + - name: JAVA_OPTS + value: -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -Xms128m -Xmx256m -Xmn128m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC + ports: + - name: common8890 + containerPort: 8890 + volumeMounts: + - mountPath: /application.yml + name: application-yml + subPath: application.yml + restartPolicy: Always + volumes: + - configMap: + name: api-config + name: application-yml + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: seller-api + namespace: lilishop-service + labels: + app.kubernetes.io/name: seller-api-service + app.kubernetes.io/instance: seller-api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + replicas: 1 + selector: + matchLabels: + lilishop.service: seller-api + template: + metadata: + labels: + lilishop.service: seller-api + spec: + containers: + - image: 192.168.0.108:31320/seller-api:4.2.4.1 + name: seller-api + env: + - name: TZ + value: Asia/Shanghai + - name: JAVA_OPTS + value: -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -Xms128m -Xmx256m -Xmn128m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC + ports: + - name: seller8889 + containerPort: 8889 + volumeMounts: + - mountPath: /application.yml + name: application-yml + subPath: application.yml + restartPolicy: Always + volumes: + - configMap: + name: api-config + name: application-yml + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: manager-api + namespace: lilishop-service + labels: + app.kubernetes.io/name: manager-api-service + app.kubernetes.io/instance: manager-api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + replicas: 1 + selector: + matchLabels: + lilishop.service: manager-api + template: + metadata: + labels: + lilishop.service: manager-api + spec: + containers: + - image: 192.168.0.108:31320/manager-api:4.2.4.1 + name: manager-api + env: + - name: TZ + value: Asia/Shanghai + - name: JAVA_OPTS + value: -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -Xms128m -Xmx256m -Xmn128m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC + ports: + - name: manager8887 + containerPort: 8887 + volumeMounts: + - mountPath: /application.yml + name: application-yml + subPath: application.yml + restartPolicy: Always + volumes: + - configMap: + name: api-config + name: application-yml + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: consumer + namespace: lilishop-service + labels: + app.kubernetes.io/name: consumer-service + app.kubernetes.io/instance: buyer-api + app.kubernetes.io/version: "4.2.4.1" + app.kubernetes.io/component: api + app.kubernetes.io/part-of: lilishop + tier: "api-service" +spec: + replicas: 1 + selector: + matchLabels: + lilishop.service: consumer + template: + metadata: + labels: + lilishop.service: consumer + spec: + containers: + - image: 192.168.0.108:31320/consumer:4.2.4.1 + name: consumer + env: + - name: TZ + value: Asia/Shanghai + - name: JAVA_OPTS + value: -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -Xms128m -Xmx256m -Xmn128m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC + volumeMounts: + - mountPath: /application.yml + name: application-yml + subPath: application.yml + restartPolicy: Always + volumes: + - configMap: + name: api-config + name: application-yml \ No newline at end of file diff --git a/docker-image.sh b/docker-image.sh new file mode 100644 index 00000000..5acb242e --- /dev/null +++ b/docker-image.sh @@ -0,0 +1 @@ +mvn clean package docker:build -DskipTests -DpushImage \ No newline at end of file diff --git a/docs/diagram/OrderComplaintBuyerController.uml b/docs/diagram/OrderComplaintBuyerController.uml new file mode 100644 index 00000000..03d08218 --- /dev/null +++ b/docs/diagram/OrderComplaintBuyerController.uml @@ -0,0 +1,50 @@ + + + JAVA + cn.lili.controller.order.OrderComplaintBuyerController + + cn.lili.modules.order.order.service.OrderComplaintCommunicationService + cn.lili.controller.order.OrderComplaintStoreController + cn.lili.modules.order.order.service.OrderComplaintService + cn.lili.controller.order.OrderComplaintBuyerController + cn.lili.controller.order.OrderComplaintManagerController + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Inner Classes + Methods + Properties + + All + private + + diff --git a/docs/uml/AfterSaleRefundGodos.puml b/docs/uml/AfterSaleRefundGodos.puml new file mode 100644 index 00000000..17092a7e --- /dev/null +++ b/docs/uml/AfterSaleRefundGodos.puml @@ -0,0 +1,20 @@ +@startuml +'https://plantuml.com/sequence-diagram + +actor user +actor seller +actor manager + +user --> 平台: 申请售后 +seller -> 平台: 审核售后申请 +activate 平台 +平台 -> 平台: 更新售后状态 +return 售后审核响应 + +user -> 平台: 填写物流信息 +seller->平台: 确认收货 +activate 平台 +平台 -> 平台: 自动退款 +return 售后审核响应 +平台 -> user: 售后结束 +@enduml \ No newline at end of file diff --git a/docs/uml/AfterSaleRefundMoney.puml b/docs/uml/AfterSaleRefundMoney.puml new file mode 100644 index 00000000..2b75c663 --- /dev/null +++ b/docs/uml/AfterSaleRefundMoney.puml @@ -0,0 +1,16 @@ +@startuml +'https://plantuml.com/sequence-diagram + +actor user +actor seller +actor manager + +user --> 平台: 申请售后 +seller -> 平台: 审核售后申请 +activate 平台 +平台 -> 平台: 通过审核,自动退款 +manager --> 平台: 审核阶段可介入操作 +return 售后审核响应 + +user -> 平台: 查询售后结果 +@enduml \ No newline at end of file diff --git a/docs/uml/Complaint.puml b/docs/uml/Complaint.puml new file mode 100644 index 00000000..eb768b2e --- /dev/null +++ b/docs/uml/Complaint.puml @@ -0,0 +1,21 @@ +@startuml +'https://plantuml.com/sequence-diagram + +actor user +actor seller +actor manager + +activate 平台 +user -> 平台: 输入原因,发起投诉 +user --> 平台: 多次输出对话 +seller --> 平台: 多次输出对话 +manager --> 平台: 多次输出对话 +manager -> 平台: 根据各方意见,仲裁投诉结果 +activate 平台 +平台->平台: 仲裁结果,更新状态 + +平台 -> seller: 根据平台仲裁结果进行处理 +平台 -> user: 根据平台仲裁结果进行处理 +deactivate 平台 + +@enduml \ No newline at end of file diff --git a/framework/pom.xml b/framework/pom.xml index a47a8901..bfcd88a3 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -7,88 +7,59 @@ cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml framework jar - - 1.9.6 - 4.13.40.ALL - 5.1.48 - 3.3.1.tmp - 5.5.8 - 2.0.3.RELEASE - 3.0.0 - 2.9.10 - 1.18.10 - 6.0.11 - 4.5.18 - 3.11.1 - 2.0.1 - 2.1.1 - 0.10.7 - 4.7.2 - 4.0.0 - 1.1.20 - 1.0.3 - 4.7.2 - 4.4.1 - 4.5.12 - 2.9.10 - UTF-8 - UTF-8 - 1.8 - true - 2.0.8 - 2.3.1 - 1.21 - 1.2 - - - - javax.interceptor - javax.interceptor-api - ${interceptor-api} + com.qiniu + qiniu-java-sdk - de.codecentric - spring-boot-admin-starter-client - ${de.codecentric} - - - - com.google.zxing - core - 3.4.1 + com.qiniu + qiniu-java-sdk + 7.4.0 - com.google.zxing - javase - 3.4.1 + org.springframework.boot + spring-boot-properties-migrator + runtime - org.slf4j - slf4j-api - 1.7.28 + org.junit.vintage + junit-vintage-engine + test + + + org.hamcrest + hamcrest-core + + - + - com.github.xkzhangsan - xk-time - 2.2.0 + org.springframework.boot + spring-boot-starter-quartz + + + slf4j-api + org.slf4j + + - - - - - org.springframework.boot spring-boot-starter-web + + + log4j-to-slf4j + org.apache.logging.log4j + + org.springframework.boot @@ -115,6 +86,10 @@ HdrHistogram org.hdrhistogram + + slf4j-api + org.slf4j + @@ -124,84 +99,68 @@ org.springframework.integration spring-integration-redis + + + slf4j-api + org.slf4j + + org.apache.commons commons-pool2 - - - org.springframework.boot - spring-boot-starter-data-mongodb - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.springframework.boot - spring-boot-starter-websocket - + + + + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus-version} - - - org.mybatis.spring.boot - mybatis-spring-boot-starter-test - 1.3.2 + + + slf4j-api + org.slf4j + + mysql mysql-connector-java - ${mysql-connector-version} + 8.0.29 org.springframework.boot spring-boot-starter-data-redis - + + + org.redisson + redisson + ${redisson} + + + slf4j-api + org.slf4j + + + com.github.xiaoymin knife4j-spring-boot-starter ${knife4j.version} - - - - - - - - - - - - - - - - - - - - - - - com.github.xiaoymin - swagger-bootstrap-ui - ${swagger-bootstrap-ui-version} + + + slf4j-api + org.slf4j + + @@ -226,33 +185,17 @@ jasypt-spring-boot-starter ${jasypt-version} - - - com.ibeetl - beetl - ${beetl-version} - - - - io.minio - minio - ${minio-version} - - - jsr305 - com.google.code.findbugs - - - guava - com.google.guava - - - com.aliyun aliyun-java-sdk-core ${aliyun-version} + + + slf4j-api + org.slf4j + + @@ -271,6 +214,16 @@ com.aliyun dysmsapi20170525 ${aliyun-sdk-dysms-version} + + + org.jacoco.agent + org.jacoco + + + bcprov-jdk15on + org.bouncycastle + + @@ -282,6 +235,16 @@ org.apache.rocketmq rocketmq-spring-boot-starter ${rocketmq-version} + + + fastjson + com.alibaba + + + slf4j-api + org.slf4j + + @@ -305,13 +268,12 @@ org.springframework.boot spring-boot-starter-test - - - - - - - + + + slf4j-api + org.slf4j + + @@ -337,6 +299,18 @@ groovy org.codehaus.groovy + + commons-collections4 + org.apache.commons + + + antlr4-runtime + org.antlr + + + slf4j-api + org.slf4j + @@ -344,6 +318,12 @@ org.apache.shardingsphere sharding-jdbc-spring-namespace ${sharding-jdbc-version} + + + slf4j-api + org.slf4j + + @@ -356,27 +336,29 @@ simple-http ${simple-http-version} - org.antlr antlr4-runtime ${antlr4-runtime-version} - - - - - - - - - - - com.alipay.sdk alipay-sdk-java ${alipay-sdk-version} + + + bcprov-jdk15on + org.bouncycastle + + + commons-logging + commons-logging + + + xml-apis + xml-apis + + @@ -385,6 +367,107 @@ UserAgentUtils ${userAgentUtils} + + org.apache.poi + poi + ${poi-version} + + + org.apache.poi + poi-ooxml + ${poi-ooxml-version} + + + + net.logstash.logback + logstash-logback-encoder + ${logstash-logback-encoder} + + + de.codecentric + spring-boot-admin-starter-client + ${de.codecentric} + + + + com.google.zxing + core + ${zxing} + + + com.google.zxing + javase + ${zxing} + + + org.slf4j + slf4j-api + ${slf4j-api} + + + + com.github.xkzhangsan + xk-time + ${xk-time} + + + org.apache.commons + commons-text + ${commons-text} + + + + com.googlecode.owasp-java-html-sanitizer + owasp-java-html-sanitizer + ${owasp-java-html-sanitizer} + + + guava + com.google.guava + + + + + + io.minio + minio + ${minio.version} + + + com.huaweicloud + esdk-obs-java + ${huaweicloud-obs.version} + + + com.qcloud + cos_api + ${cos.version} + + + com.tencentcloudapi + tencentcloud-sdk-java + ${tencentcloud.version} + + + com.github.kuaidi100-api + sdk + ${kuaidi100-api.version} + + + com.qiyuesuo.sdk + SDK + 2.1.7 + system + ${project.basedir}/src/main/resources/maven-repository/SF-CSIM-EXPRESS-SDK-V2.1.7.jar + + + + io.netty + netty-resolver-dns-native-macos + 4.1.90.Final + runtime + osx-aarch_64 + diff --git a/framework/src/main/java/cn/lili/base/mybatisplus/MybatisPlusConfig.java b/framework/src/main/java/cn/lili/base/mybatisplus/MybatisPlusConfig.java deleted file mode 100644 index 9e5853a8..00000000 --- a/framework/src/main/java/cn/lili/base/mybatisplus/MybatisPlusConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.lili.base.mybatisplus; - -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @author Chopper - */ -@Configuration -@MapperScan({"cn.lili.modules.*.*.mapper","cn.lili.modules.*.mapper"}) -public class MybatisPlusConfig { - /** - * 分页插件,自动识别数据库类型 - */ - @Bean - public PaginationInterceptor paginationInterceptor() { - return new PaginationInterceptor(); - } -} diff --git a/framework/src/main/java/cn/lili/common/cache/Cache.java b/framework/src/main/java/cn/lili/cache/Cache.java similarity index 58% rename from framework/src/main/java/cn/lili/common/cache/Cache.java rename to framework/src/main/java/cn/lili/cache/Cache.java index 7b027b73..41d309dc 100644 --- a/framework/src/main/java/cn/lili/common/cache/Cache.java +++ b/framework/src/main/java/cn/lili/cache/Cache.java @@ -1,4 +1,4 @@ -package cn.lili.common.cache; +package cn.lili.cache; import org.springframework.data.redis.core.ZSetOperations; @@ -19,7 +19,7 @@ public interface Cache { /** * Get an item from the cache, nontransactionally * - * @param key + * @param key 缓存key * @return the cached object or null */ T get(Object key); @@ -27,7 +27,7 @@ public interface Cache { /** * Get an item from the cache, nontransactionally * - * @param key + * @param key 缓存key * @return the cached object or null */ String getString(Object key); @@ -37,14 +37,14 @@ public interface Cache { * multiGet * * @param keys 要查询的key集合 - * @return + * @return 集合 */ List multiGet(Collection keys); /** * 批量set * - * @param map + * @param map 键值对 */ void multiSet(Map map); @@ -60,16 +60,16 @@ public interface Cache { * Add an item to the cache, nontransactionally, with * failfast semantics * - * @param key - * @param value + * @param key 缓存key + * @param value 缓存value */ void put(Object key, T value); /** * 往缓存中写入内容 * - * @param key - * @param value + * @param key 缓存key + * @param value 缓存value * @param exp 超时时间,单位为秒 */ void put(Object key, T value, Long exp); @@ -77,24 +77,24 @@ public interface Cache { /** * 往缓存中写入内容 * - * @param key - * @param value - * @param exp - * @param timeUnit 写入单位 + * @param key 缓存key + * @param value 缓存value + * @param exp 过期时间 + * @param timeUnit 过期单位 */ void put(Object key, T value, Long exp, TimeUnit timeUnit); /** * 删除 * - * @param key + * @param key 缓存key */ - void remove(Object key); + Boolean remove(Object key); /** * 删除 * - * @param key + * @param key 缓存key */ void vagueDel(Object key); @@ -116,33 +116,33 @@ public interface Cache { /** * 玩缓存中写入内容 * - * @param key - * @param map + * @param key 缓存key + * @param map map value */ void putAllHash(Object key, Map map); /** * 读取缓存值 * - * @param key - * @param hashKey - * @return + * @param key 缓存key + * @param hashKey map value + * @return 返回缓存中的数据 */ T getHash(Object key, Object hashKey); /** * 读取缓存值 * - * @param key - * @return + * @param key 缓存key + * @return 缓存中的数据 */ Map getHash(Object key); /** * 是否包含 * - * @param key - * @return + * @param key 缓存key + * @return 缓存中的数据 */ boolean hasKey(Object key); @@ -150,10 +150,18 @@ public interface Cache { /** * 模糊匹配key * - * @param pattern - * @return + * @param pattern 模糊key + * @return 缓存中的数据 */ - List keys(String pattern); + List keys(String pattern); + + /** + * 原生阻塞keys 不推荐使用 + * + * @param pattern 模糊key + * @return 缓存中的数据 + */ + List keysBlock(String pattern); //-----------------------------------------------用于特殊场景,redis去重计数--------------------------------------------- @@ -163,8 +171,9 @@ public interface Cache { * 效率较高的 计数器 * 如需清零,按照普通key 移除即可 * - * @param key - * @return + * @param key key值 + * @param value 去重统计值 + * @return 计数器结果 */ Long cumulative(Object key, Object value); @@ -174,8 +183,8 @@ public interface Cache { * 效率较高的 计数器 统计返回 * 如需清零,按照普通key 移除即可 * - * @param key - * @return + * @param key 计数器key + * @return 计数器结果 */ Long counter(Object key); @@ -183,7 +192,7 @@ public interface Cache { * 批量计数 * * @param keys 要查询的key集合 - * @return + * @return 批量计数 */ List multiCounter(Collection keys); @@ -193,8 +202,8 @@ public interface Cache { * 效率较高的 计数器 统计返回 * 如需清零,按照普通key 移除即可 * - * @param key - * @return + * @param key key值 + * @return 计数器结果 */ Long mergeCounter(Object... key); //---------------------------------------------------用于特殊场景,redis去重统计----------------------------------------- @@ -207,9 +216,18 @@ public interface Cache { * * @param key 为累计的key,同一key每次调用则值 +1 * @param liveTime 单位秒后失效 - * @return + * @return 计数器结果 */ Long incr(String key, long liveTime); + + /** + * redis 计数器 累加 + * 注:到达liveTime之后,该次增加取消,即自动-1,而不是redis值为空 + * + * @param key 为累计的key,同一key每次调用则值 +1 + * @return 计数器结果 + */ + Long incr(String key); //-----------------------------------------------redis计数--------------------------------------------- /** @@ -221,6 +239,16 @@ public interface Cache { */ void incrementScore(String sortedSetName, String keyword); + /** + * 使用Sorted Set记录keyword + * zincrby命令,对于一个Sorted Set,存在的就把分数加x(x可自行设定),不存在就创建一个分数为1的成员 + * + * @param sortedSetName sortedSetName的Sorted Set不用预先创建,不存在会自动创建,存在则向里添加数据 + * @param keyword 关键词 + * @param score 分数 + */ + void incrementScore(String sortedSetName, String keyword, Integer score); + /** * zrevrange命令, 查询Sorted Set中指定范围的值 * 返回的有序集合中,score大的在前面 @@ -229,7 +257,49 @@ public interface Cache { * @param sortedSetName sortedSetName * @param start 查询范围开始位置 * @param end 查询范围结束位置 - * @return + * @return 获取满足条件的集合 */ Set> reverseRangeWithScores(String sortedSetName, Integer start, Integer end); + + /** + * zrevrange命令, 查询Sorted Set中指定范围的值 + * 返回的有序集合中,score大的在前面 + * zrevrange方法无需担心用于指定范围的start和end出现越界报错问题 + * + * @param sortedSetName sortedSetName + * @param count 查询数量 + * @return 获取满足条件的集合 + */ + Set> reverseRangeWithScores(String sortedSetName, Integer count); + + + /** + * 向Zset里添加成员 + * + * @param key key值 + * @param score 分数 + * @param value 值 + * @return 增加状态 + */ + boolean zAdd(String key, long score, String value); + + + /** + * 获取 某key 下 某一分值区间的队列 + * + * @param key 缓存key + * @param from 开始时间 + * @param to 结束时间 + * @return 数据 + */ + Set> zRangeByScore(String key, int from, long to); + + /** + * 移除 Zset队列值 + * + * @param key key值 + * @param value 删除的集合 + * @return 删除数量 + */ + Long zRemove(String key, String... value); } diff --git a/framework/src/main/java/cn/lili/common/cache/CachePrefix.java b/framework/src/main/java/cn/lili/cache/CachePrefix.java similarity index 73% rename from framework/src/main/java/cn/lili/common/cache/CachePrefix.java rename to framework/src/main/java/cn/lili/cache/CachePrefix.java index 65466d36..f25f042d 100644 --- a/framework/src/main/java/cn/lili/common/cache/CachePrefix.java +++ b/framework/src/main/java/cn/lili/cache/CachePrefix.java @@ -1,7 +1,7 @@ -package cn.lili.common.cache; +package cn.lili.cache; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.security.enums.UserEnums; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; /** * 缓存前缀 @@ -125,9 +125,13 @@ public enum CachePrefix { GOODS_STOCK, /** - * 商品分类 + * 商品分类 树状结构 */ CATEGORY, + /** + * 商品分类 集合 + */ + CATEGORY_ARRAY, /** * 浏览次数 */ @@ -177,7 +181,7 @@ public enum CachePrefix { /** * 店铺管理员角色权限对照表 */ - SHOP_URL_ROLE, + STORE_URL_ROLE, /** * 手机验证标识 @@ -204,6 +208,10 @@ public enum CachePrefix { * 促销活动 */ PROMOTION, + /** + * 当前优惠券活动 + */ + CURRENT_COUPON_ACTIVITY, /** * 促销活动 */ @@ -219,7 +227,7 @@ public enum CachePrefix { STORE_ID_FULL_DISCOUNT, /** - * 限时抢购活动缓存key前缀 + * 秒杀活动活动缓存key前缀 */ STORE_ID_SECKILL, @@ -232,6 +240,10 @@ public enum CachePrefix { * 积分商品缓存key前缀 */ STORE_ID_EXCHANGE, + /** + * 会员领取标记 + */ + MEMBER_COUPON_SIGN, //================交易================= @@ -437,6 +449,10 @@ public enum CachePrefix { * 分销员 */ DISTRIBUTION, + /** + * 邀请人 + */ + INVITER, /** * 找回手机 @@ -449,26 +465,106 @@ public enum CachePrefix { /** * 文章 */ - ARTICLE_CACHE - ; + ARTICLE_CACHE, + + /** + * 初始化索引 + */ + INIT_INDEX_PROCESS, + + /** + * 初始化索引标示 + */ + INIT_INDEX_FLAG, + + /** + * 店铺 + */ + STORE, + /** + * 店铺分类 + */ + STORE_CATEGORY, + /** + * 用户菜单 + */ + MENU_USER_ID, + /** + * 用户菜单 + *

+ * 这个缓存并非永久缓存,而是300秒缓存,也就是说修改用户关联的部门,关联的角色, + * 部门关联的角色,角色关联的菜单等等,最多需要5分钟才能生效 + */ + STORE_MENU_USER_ID, + /** + * 用户菜单 + */ + USER_MENU, + /** + * 用户菜单 + */ + STORE_USER_MENU, + /** + * 订单暂时缓存 + */ + ORDER, + /** + * 敏感词 + */ + SENSITIVE, + + /** + * 扫码登录 + * + * @param str + * @return + */ + QR_CODE_LOGIN_SESSION; public static String removePrefix(String str) { return str.substring(str.lastIndexOf("}_") + 2); } - //通用获取缓存key值 + /** + * 通用获取缓存key值 + * + * @return 缓存key值 + */ public String getPrefix() { return "{" + this.name() + "}_"; } - //通用获取缓存key值 + /** + * 通用获取缓存key值 + * + * @param typeEnum 促销枚举 + * @return 缓存key值 + */ public String getPrefix(PromotionTypeEnum typeEnum) { return "{" + this.name() + "_" + typeEnum.name() + "}_"; } - //获取缓存key值 + 用户端,例如:三端都有用户体系,需要分别登录,如果用户名一致,则redis中的权限可能会冲突出错 + /** + * 获取缓存key值 + 用户端 + * 例如:三端都有用户体系,需要分别登录,如果用户名一致,则redis中的权限可能会冲突出错 + * + * @param user 角色 + * @return 缓存key值 + 用户端 + */ public String getPrefix(UserEnums user) { return "{" + this.name() + "_" + user.name() + "}_"; } + + /** + * 获取缓存key值 + 用户端 +自定义前缀 + * 例如:三端都有用户体系,需要分别登录,如果用户名一致,则redis中的权限可能会冲突出错 + * + * @param user 角色 + * @param customPrefix 自定义前缀 + * @return 缓存key值 + */ + public String getPrefix(UserEnums user, String customPrefix) { + return "{" + this.name() + "_" + user.name() + "}_" + customPrefix + "_"; + } } diff --git a/framework/src/main/java/cn/lili/config/cache/FastJsonRedisSerializer.java b/framework/src/main/java/cn/lili/cache/config/redis/FastJsonRedisSerializer.java similarity index 62% rename from framework/src/main/java/cn/lili/config/cache/FastJsonRedisSerializer.java rename to framework/src/main/java/cn/lili/cache/config/redis/FastJsonRedisSerializer.java index a7f741d3..f0071468 100644 --- a/framework/src/main/java/cn/lili/config/cache/FastJsonRedisSerializer.java +++ b/framework/src/main/java/cn/lili/cache/config/redis/FastJsonRedisSerializer.java @@ -1,4 +1,4 @@ -package cn.lili.config.cache; +package cn.lili.cache.config.redis; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; @@ -6,13 +6,16 @@ import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; -/* - *要实现对象的缓存,定义自己的序列化和反序列化器。使用阿里的fastjson来实现的比较多。 +/** + * 要实现对象的缓存,定义自己的序列化和反序列化器。使用阿里的fastjson来实现的比较多 + * + * @author Bulbasaur */ public class FastJsonRedisSerializer implements RedisSerializer { - private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); - private Class clazz; + private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; + private final Class clazz; public FastJsonRedisSerializer(Class clazz) { super(); @@ -24,7 +27,10 @@ public class FastJsonRedisSerializer implements RedisSerializer { if (null == t) { return new byte[0]; } - return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); + return JSON.toJSONString(t, + SerializerFeature.WriteClassName, + SerializerFeature.DisableCircularReferenceDetect) + .getBytes(DEFAULT_CHARSET); } @Override diff --git a/framework/src/main/java/cn/lili/config/cache/RedisConfig.java b/framework/src/main/java/cn/lili/cache/config/redis/RedisConfig.java similarity index 63% rename from framework/src/main/java/cn/lili/config/cache/RedisConfig.java rename to framework/src/main/java/cn/lili/cache/config/redis/RedisConfig.java index ffcd587e..8af75596 100644 --- a/framework/src/main/java/cn/lili/config/cache/RedisConfig.java +++ b/framework/src/main/java/cn/lili/cache/config/redis/RedisConfig.java @@ -1,9 +1,16 @@ -package cn.lili.config.cache; +package cn.lili.cache.config.redis; +import cn.hutool.core.text.CharSequenceUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.ClusterServersConfig; +import org.redisson.config.Config; +import org.redisson.config.SentinelServersConfig; +import org.redisson.config.SingleServerConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -28,7 +35,9 @@ import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -36,7 +45,6 @@ import java.util.Map; * * @author Chopper * @version v4.0 - * @Description: * @since 2021/3/20 09:37 */ @@ -47,12 +55,19 @@ import java.util.Map; public class RedisConfig extends CachingConfigurerSupport { + private static final String REDIS_PREFIX = "redis://"; + @Value("${lili.cache.timeout:7200}") private Integer timeout; - + /** + * 当有多个管理器的时候,必须使用该注解在一个管理器上注释:表示该管理器为默认的管理器 + * + * @param connectionFactory 链接工厂 + * @return 缓存 + */ @Bean - @Primary//当有多个管理器的时候,必须使用该注解在一个管理器上注释:表示该管理器为默认的管理器 + @Primary public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { //初始化一个RedisCacheWriter RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory); @@ -73,6 +88,7 @@ public class RedisConfig extends CachingConfigurerSupport { 可参考 https://blog.csdn.net/u012240455/article/details/80538540 */ ParserConfig.getGlobalInstance().addAccept("cn.lili."); + ParserConfig.getGlobalInstance().addAccept("cn.hutool.json."); return cacheManager; } @@ -82,17 +98,55 @@ public class RedisConfig extends CachingConfigurerSupport { public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate template = new RedisTemplate<>(); //使用fastjson序列化 - FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class); - // value值的序列化采用fastJsonRedisSerializer + FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); + //value值的序列化采用fastJsonRedisSerializer template.setValueSerializer(fastJsonRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer); - // key的序列化采用StringRedisSerializer + //key的序列化采用StringRedisSerializer template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setConnectionFactory(lettuceConnectionFactory); return template; } + @Bean(destroyMethod = "shutdown") + public RedissonClient redisson(RedisProperties redisProperties) { + Config config = new Config(); + if (redisProperties.getSentinel() != null && !redisProperties.getSentinel().getNodes().isEmpty()) { + // 哨兵模式 + SentinelServersConfig sentinelServersConfig = config.useSentinelServers(); + sentinelServersConfig.setMasterName(redisProperties.getSentinel().getMaster()); + List sentinelAddress = new ArrayList<>(); + for (String node : redisProperties.getCluster().getNodes()) { + sentinelAddress.add(REDIS_PREFIX + node); + } + sentinelServersConfig.setSentinelAddresses(sentinelAddress); + if (CharSequenceUtil.isNotEmpty(redisProperties.getSentinel().getPassword())) { + sentinelServersConfig.setSentinelPassword(redisProperties.getSentinel().getPassword()); + } + } else if (redisProperties.getCluster() != null && !redisProperties.getCluster().getNodes().isEmpty()) { + // 集群模式 + ClusterServersConfig clusterServersConfig = config.useClusterServers(); + List clusterNodes = new ArrayList<>(); + for (String node : redisProperties.getCluster().getNodes()) { + clusterNodes.add(REDIS_PREFIX + node); + } + clusterServersConfig.setNodeAddresses(clusterNodes); + if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) { + clusterServersConfig.setPassword(redisProperties.getPassword()); + } + } else { + SingleServerConfig singleServerConfig = config.useSingleServer(); + singleServerConfig.setAddress(REDIS_PREFIX + redisProperties.getHost() + ":" + redisProperties.getPort()); + if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) { + singleServerConfig.setPassword(redisProperties.getPassword()); + } + singleServerConfig.setPingConnectionInterval(1000); + } + + return Redisson.create(config); + } + /** * 自定义缓存key生成策略,默认将使用该策略 */ @@ -102,19 +156,19 @@ public class RedisConfig extends CachingConfigurerSupport { return (target, method, params) -> { Map container = new HashMap<>(3); Class targetClassClass = target.getClass(); - // 类地址 + //类地址 container.put("class", targetClassClass.toGenericString()); - // 方法名称 + //方法名称 container.put("methodName", method.getName()); - // 包名称 + //包名称 container.put("package", targetClassClass.getPackage()); - // 参数列表 + //参数列表 for (int i = 0; i < params.length; i++) { container.put(String.valueOf(i), params[i]); } - // 转为JSON字符串 + //转为JSON字符串 String jsonString = JSON.toJSONString(container); - // 做SHA256 Hash计算,得到一个SHA256摘要作为Key + //做SHA256 Hash计算,得到一个SHA256摘要作为Key return DigestUtils.sha256Hex(jsonString); }; } @@ -122,7 +176,7 @@ public class RedisConfig extends CachingConfigurerSupport { @Bean @Override public CacheErrorHandler errorHandler() { - // 异常处理,当Redis发生异常时,打印日志,但是程序正常走 + //异常处理,当Redis发生异常时,打印日志,但是程序正常走 log.info("初始化 -> [{}]", "Redis CacheErrorHandler"); return new CacheErrorHandler() { @Override diff --git a/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java b/framework/src/main/java/cn/lili/cache/impl/RedisCache.java similarity index 66% rename from framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java rename to framework/src/main/java/cn/lili/cache/impl/RedisCache.java index 39925133..ac56702b 100644 --- a/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java +++ b/framework/src/main/java/cn/lili/cache/impl/RedisCache.java @@ -1,6 +1,7 @@ -package cn.lili.common.cache.impl; +package cn.lili.cache.impl; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.*; @@ -18,6 +19,7 @@ import java.util.function.Consumer; * * @author Chopepr */ +@Slf4j @Component public class RedisCache implements Cache { @@ -76,26 +78,25 @@ public class RedisCache implements Cache { } @Override - public void remove(Object key) { + public Boolean remove(Object key) { - redisTemplate.delete(key); + return redisTemplate.delete(key); } /** * 删除 * - * @param key + * @param key 模糊删除key */ @Override public void vagueDel(Object key) { - Set keys = redisTemplate.keys(key + "*"); + List keys = this.keys(key + "*"); redisTemplate.delete(keys); } @Override public void clear() { - - Set keys = redisTemplate.keys("*"); + List keys = this.keys("*"); redisTemplate.delete(keys); } @@ -128,11 +129,11 @@ public class RedisCache implements Cache { * 获取符合条件的key * * @param pattern 表达式 - * @return + * @return 模糊匹配key */ @Override - public List keys(String pattern) { - List keys = new ArrayList<>(); + public List keys(String pattern) { + List keys = new ArrayList<>(); this.scan(pattern, item -> { //符合条件的key String key = new String(item, StandardCharsets.UTF_8); @@ -141,6 +142,13 @@ public class RedisCache implements Cache { return keys; } + @Override + public List keysBlock(String pattern) { + Set set = redisTemplate.keys(pattern); + List list = new ArrayList<>(); + list.addAll(set); + return list; + } /** * scan 实现 @@ -158,7 +166,7 @@ public class RedisCache implements Cache { return null; } catch (IOException e) { - e.printStackTrace(); + log.error("scan错误", e); throw new RuntimeException(e); } }); @@ -168,7 +176,7 @@ public class RedisCache implements Cache { @Override public Long cumulative(Object key, Object value) { HyperLogLogOperations operations = redisTemplate.opsForHyperLogLog(); - // add 方法对应 PFADD 命令 + //add 方法对应 PFADD 命令 return operations.add(key, value); } @@ -177,7 +185,7 @@ public class RedisCache implements Cache { public Long counter(Object key) { HyperLogLogOperations operations = redisTemplate.opsForHyperLogLog(); - // add 方法对应 PFADD 命令 + //add 方法对应 PFCOUNT 命令 return operations.size(key); } @@ -196,7 +204,7 @@ public class RedisCache implements Cache { @Override public Long mergeCounter(Object... key) { HyperLogLogOperations operations = redisTemplate.opsForHyperLogLog(); - // 计数器合并累加 + //计数器合并累加 return operations.union(key[0], key); } @@ -204,14 +212,20 @@ public class RedisCache implements Cache { public Long incr(String key, long liveTime) { RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); Long increment = entityIdCounter.getAndIncrement(); - - if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间 + //初始设置过期时间 + if (increment == 0 && liveTime > 0) { entityIdCounter.expire(liveTime, TimeUnit.SECONDS); } return increment; } + @Override + public Long incr(String key) { + RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); + return entityIdCounter.getAndIncrement(); + } + /** * 使用Sorted Set记录keyword * zincrby命令,对于一个Sorted Set,存在的就把分数加x(x可自行设定),不存在就创建一个分数为1的成员 @@ -221,9 +235,13 @@ public class RedisCache implements Cache { */ @Override public void incrementScore(String sortedSetName, String keyword) { - // x 的含义请见本方法的注释 - double x = 1.0; - this.redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, x); + //指向key名为KEY的zset元素 + redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, 1); + } + + @Override + public void incrementScore(String sortedSetName, String keyword, Integer score) { + redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, score); } /** @@ -234,10 +252,66 @@ public class RedisCache implements Cache { * @param sortedSetName sortedSetName * @param start 查询范围开始位置 * @param end 查询范围结束位置 - * @return + * @return 符合排序的集合 */ @Override public Set> reverseRangeWithScores(String sortedSetName, Integer start, Integer end) { return this.redisTemplate.opsForZSet().reverseRangeWithScores(sortedSetName, start, end); } + + /** + * zrevrange命令, 查询Sorted Set中指定范围的值 + * 返回的有序集合中,score大的在前面 + * zrevrange方法无需担心用于指定范围的start和end出现越界报错问题 + * + * @param sortedSetName sortedSetName + * @param count 获取数量 + * @return 符合排序的集合 + */ + @Override + public Set> reverseRangeWithScores(String sortedSetName, Integer count) { + return this.redisTemplate.opsForZSet().reverseRangeWithScores(sortedSetName, 0, count); + } + + + /** + * 向Zset里添加成员 + * + * @param key key值 + * @param score 分数,通常用于排序 + * @param value 值 + * @return 增加状态 + */ + @Override + public boolean zAdd(String key, long score, String value) { + return redisTemplate.opsForZSet().add(key, value, score); + + } + + + /** + * 获取 某key 下 某一分值区间的队列 + * + * @param key 缓存key + * @param from 开始时间 + * @param to 结束时间 + * @return 数据 + */ + @Override + public Set> zRangeByScore(String key, int from, long to) { + Set> set = redisTemplate.opsForZSet().rangeByScoreWithScores(key, from, to); + return set; + } + + /** + * 移除 Zset队列值 + * + * @param key key值 + * @param value 删除的集合 + * @return 删除数量 + */ + @Override + public Long zRemove(String key, String... value) { + return redisTemplate.opsForZSet().remove(key, value); + } } diff --git a/framework/src/main/java/cn/lili/common/aop/limiter/annotation/LimitPoint.java b/framework/src/main/java/cn/lili/cache/limit/annotation/LimitPoint.java similarity index 88% rename from framework/src/main/java/cn/lili/common/aop/limiter/annotation/LimitPoint.java rename to framework/src/main/java/cn/lili/cache/limit/annotation/LimitPoint.java index cee99c07..182bb506 100644 --- a/framework/src/main/java/cn/lili/common/aop/limiter/annotation/LimitPoint.java +++ b/framework/src/main/java/cn/lili/cache/limit/annotation/LimitPoint.java @@ -1,7 +1,7 @@ -package cn.lili.common.aop.limiter.annotation; +package cn.lili.cache.limit.annotation; -import cn.lili.common.aop.limiter.LimitType; +import cn.lili.cache.limit.enums.LimitTypeEnums; import java.lang.annotation.*; @@ -60,5 +60,5 @@ public @interface LimitPoint { * * @return LimitType */ - LimitType limitType() default LimitType.IP; + LimitTypeEnums limitType() default LimitTypeEnums.IP; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/aop/limiter/LimitType.java b/framework/src/main/java/cn/lili/cache/limit/enums/LimitTypeEnums.java similarity index 78% rename from framework/src/main/java/cn/lili/common/aop/limiter/LimitType.java rename to framework/src/main/java/cn/lili/cache/limit/enums/LimitTypeEnums.java index 110f2195..50b060bc 100644 --- a/framework/src/main/java/cn/lili/common/aop/limiter/LimitType.java +++ b/framework/src/main/java/cn/lili/cache/limit/enums/LimitTypeEnums.java @@ -1,4 +1,4 @@ -package cn.lili.common.aop.limiter; +package cn.lili.cache.limit.enums; /** @@ -8,7 +8,7 @@ package cn.lili.common.aop.limiter; * @since 2018年2月02日 下午4:58:52 */ -public enum LimitType { +public enum LimitTypeEnums { /** * 自定义key(即全局限流) */ diff --git a/framework/src/main/java/cn/lili/cache/limit/interceptor/LimitInterceptor.java b/framework/src/main/java/cn/lili/cache/limit/interceptor/LimitInterceptor.java new file mode 100644 index 00000000..5fbbfe27 --- /dev/null +++ b/framework/src/main/java/cn/lili/cache/limit/interceptor/LimitInterceptor.java @@ -0,0 +1,79 @@ +package cn.lili.cache.limit.interceptor; + +import cn.lili.cache.limit.annotation.LimitPoint; +import cn.lili.cache.limit.enums.LimitTypeEnums; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.IpUtils; +import com.google.common.collect.ImmutableList; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.Serializable; + +/** + * 流量拦截 + * + * @author Chopper + */ +@Aspect +@Configuration +@Slf4j +public class LimitInterceptor { + private RedisTemplate redisTemplate; + + private DefaultRedisScript limitScript; + + @Autowired + public void setRedisTemplate(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(DefaultRedisScript limitScript) { + this.limitScript = limitScript; + } + + @Before("@annotation(limitPointAnnotation)") + public void interceptor(LimitPoint limitPointAnnotation) { + LimitTypeEnums limitTypeEnums = limitPointAnnotation.limitType(); + + String key; + int limitPeriod = limitPointAnnotation.period(); + int limitCount = limitPointAnnotation.limit(); + if (limitTypeEnums == LimitTypeEnums.CUSTOMER) { + key = limitPointAnnotation.key(); + } else { + key = limitPointAnnotation.key() + IpUtils + .getIpAddress(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); + } + ImmutableList keys = ImmutableList.of(StringUtils.join(limitPointAnnotation.prefix(), key)); + try { + Number count = redisTemplate.execute(limitScript, keys, limitCount, limitPeriod); + assert count != null; + log.info("限制请求{}, 当前请求{},缓存key{}", limitCount, count.intValue(), key); + //如果缓存里没有值,或者他的值小于限制频率 + if (count.intValue() > limitCount) { + throw new ServiceException(ResultCode.LIMIT_ERROR); + } + } + //如果从redis中执行都值判定为空,则这里跳过 + catch (NullPointerException e) { + return; + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("限流异常", e); + throw new ServiceException(ResultCode.ERROR); + } + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/script/LuaScript.java b/framework/src/main/java/cn/lili/cache/script/LuaScript.java similarity index 82% rename from framework/src/main/java/cn/lili/modules/script/LuaScript.java rename to framework/src/main/java/cn/lili/cache/script/LuaScript.java index 2c837a5c..1df7e524 100644 --- a/framework/src/main/java/cn/lili/modules/script/LuaScript.java +++ b/framework/src/main/java/cn/lili/cache/script/LuaScript.java @@ -1,4 +1,4 @@ -package cn.lili.modules.script; +package cn.lili.cache.script; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -33,10 +33,10 @@ public class LuaScript { * @return */ @Bean - public DefaultRedisScript limitScript() { - DefaultRedisScript redisScript = new DefaultRedisScript<>(); + public DefaultRedisScript limitScript() { + DefaultRedisScript redisScript = new DefaultRedisScript<>(); redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("script/limit.lua"))); - redisScript.setResultType(Number.class); + redisScript.setResultType(Long.class); return redisScript; } } diff --git a/framework/src/main/java/cn/lili/modules/base/aspect/DemoSite.java b/framework/src/main/java/cn/lili/common/aop/annotation/DemoSite.java similarity index 53% rename from framework/src/main/java/cn/lili/modules/base/aspect/DemoSite.java rename to framework/src/main/java/cn/lili/common/aop/annotation/DemoSite.java index a0e344e0..8d119f17 100644 --- a/framework/src/main/java/cn/lili/modules/base/aspect/DemoSite.java +++ b/framework/src/main/java/cn/lili/common/aop/annotation/DemoSite.java @@ -1,9 +1,14 @@ -package cn.lili.modules.base.aspect; +package cn.lili.common.aop.annotation; import java.lang.annotation.*; /** * 演示站点注解 + *

+ * PS 此注解需要用户登录之后才可以使用 + * + * @author Bulbasaur + * @since 2021/7/9 1:40 上午 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) diff --git a/framework/src/main/java/cn/lili/common/aop/annotation/PreventDuplicateSubmissions.java b/framework/src/main/java/cn/lili/common/aop/annotation/PreventDuplicateSubmissions.java new file mode 100644 index 00000000..5ee36a05 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/aop/annotation/PreventDuplicateSubmissions.java @@ -0,0 +1,29 @@ +package cn.lili.common.aop.annotation; + +import java.lang.annotation.*; + +/** + * 防止重复提交注解 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2022/1/25 09:17 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface PreventDuplicateSubmissions { + + + /** + * 过期时间 默认3秒,即3秒内无法重复点击。 + */ + long expire() default 3; + /** + * 用户间隔离,默认false。 + * 如果为true则全局限制,为true需要用户登录状态,否则则是全局隔离 + */ + boolean userIsolation() default false; +} diff --git a/framework/src/main/java/cn/lili/common/aop/annotation/RetryOperation.java b/framework/src/main/java/cn/lili/common/aop/annotation/RetryOperation.java new file mode 100644 index 00000000..d12ab403 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/aop/annotation/RetryOperation.java @@ -0,0 +1,25 @@ +package cn.lili.common.aop.annotation; + +import java.lang.annotation.*; + +/** + * 异常重试注解 + * + * @author paulG + * @since 2022/4/26 + **/ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface RetryOperation { + /** + * 重试次数 + */ + int retryCount() default 3; + + /** + * 重试间隔 + */ + int waitSeconds() default 10; +} diff --git a/framework/src/main/java/cn/lili/modules/base/aspect/DemoInterceptor.java b/framework/src/main/java/cn/lili/common/aop/interceptor/DemoInterceptor.java similarity index 69% rename from framework/src/main/java/cn/lili/modules/base/aspect/DemoInterceptor.java rename to framework/src/main/java/cn/lili/common/aop/interceptor/DemoInterceptor.java index b7d71308..ed5a365a 100644 --- a/framework/src/main/java/cn/lili/modules/base/aspect/DemoInterceptor.java +++ b/framework/src/main/java/cn/lili/common/aop/interceptor/DemoInterceptor.java @@ -1,8 +1,9 @@ -package cn.lili.modules.base.aspect; +package cn.lili.common.aop.interceptor; +import cn.lili.common.aop.annotation.DemoSite; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.config.properties.SystemSetting; +import cn.lili.common.properties.SystemSettingProperties; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.beans.factory.annotation.Autowired; @@ -21,11 +22,11 @@ import org.springframework.stereotype.Component; public class DemoInterceptor { @Autowired - private SystemSetting systemSetting; + private SystemSettingProperties systemSettingProperties; @Before("@annotation(demoSite)") public void doAfter(DemoSite demoSite) { - if (systemSetting.getIsDemoSite()) { + if (Boolean.TRUE.equals(systemSettingProperties.getIsDemoSite())) { throw new ServiceException(ResultCode.DEMO_SITE_EXCEPTION); } } diff --git a/framework/src/main/java/cn/lili/common/aop/interceptor/PreventDuplicateSubmissionsInterceptor.java b/framework/src/main/java/cn/lili/common/aop/interceptor/PreventDuplicateSubmissionsInterceptor.java new file mode 100644 index 00000000..33e2fde7 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/aop/interceptor/PreventDuplicateSubmissionsInterceptor.java @@ -0,0 +1,93 @@ +package cn.lili.common.aop.interceptor; + +/** + * 防重复提交业务 + * + * @author Chopper + * @version v1.0 + * 2022-01-25 09:20 + */ + +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +@Aspect +@Component +@Slf4j +public class PreventDuplicateSubmissionsInterceptor { + + @Autowired + private Cache cache; + + + @Before("@annotation(preventDuplicateSubmissions)") + public void interceptor(PreventDuplicateSubmissions preventDuplicateSubmissions) { + + try { + String redisKey = getParams(preventDuplicateSubmissions.userIsolation()); + Long count = cache.incr(redisKey, preventDuplicateSubmissions.expire()); + log.debug("防重复提交:params-{},value-{}", redisKey, count); + //如果超过0或者设置的参数,则表示重复提交了 + if (count.intValue() > 0) { + throw new ServiceException(ResultCode.LIMIT_ERROR); + } + } + //如果参数为空,则表示用户未登录,直接略过,不做处理 + catch (NullPointerException e) { + return; + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("防重复提交拦截器异常", e); + throw new ServiceException(ResultCode.ERROR); + } + } + + /** + * 获取表单参数 + * + * @param userIsolation 用户是否隔离 + * @return 计数器key + */ + private String getParams(Boolean userIsolation) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + StringBuilder stringBuilder = new StringBuilder(); + //拼接请求地址 + stringBuilder.append(request.getRequestURI()); + + //参数不为空则拼接参数 + if (!request.getParameterMap().isEmpty()) { + stringBuilder.append(JSONUtil.toJsonStr(request.getParameterMap())); + } + //用户隔离设置为开启,则选择当前用回顾 + if (userIsolation) { + AuthUser authUser = UserContext.getCurrentUser(); + //用户为空则发出警告,但不拼接,否则拼接用户id + if (authUser == null) { + log.warn("user isolation settings are on,but current user is null"); + } +// 不为空则拼接用户id + else { + stringBuilder.append(authUser.getId()); + } + } + //请求地址 + return stringBuilder.toString(); + } + + +} diff --git a/framework/src/main/java/cn/lili/common/aop/interceptor/RetryAspect.java b/framework/src/main/java/cn/lili/common/aop/interceptor/RetryAspect.java new file mode 100644 index 00000000..bc9173b6 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/aop/interceptor/RetryAspect.java @@ -0,0 +1,50 @@ +package cn.lili.common.aop.interceptor; + +import cn.lili.common.aop.annotation.RetryOperation; +import cn.lili.common.exception.RetryException; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +/** + * @author paulG + * @since 2022/4/26 + **/ +@Aspect +@Component +@Slf4j +public class RetryAspect { + + + @Around(value = "@annotation(retryOperation)") + public Object retryOperation(ProceedingJoinPoint joinPoint, RetryOperation retryOperation) throws Throwable { + + Object response = null; + int retryCount = retryOperation.retryCount(); + int waitSeconds = retryOperation.waitSeconds(); + boolean successful = false; + + do { + try { + response = joinPoint.proceed(); + successful = true; + } catch (RetryException ex) { + log.info("Operation failed, retries remaining: {}", retryCount); + retryCount--; + if (retryCount < 0) { + successful = true; + log.error(ex.getMessage()); + } + if (waitSeconds > 0 && !successful) { + log.info("Waiting for {} second(s) before next retry", waitSeconds); + Thread.sleep(waitSeconds * 1000L); + } + } + } while (!successful); + + return response; + } + +} diff --git a/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java b/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java deleted file mode 100644 index 0e35a46a..00000000 --- a/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.lili.common.aop.limiter; - -import cn.lili.common.aop.limiter.annotation.LimitPoint; -import com.google.common.collect.ImmutableList; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.script.DefaultRedisScript; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import java.io.Serializable; -import java.lang.reflect.Method; - -/** - * 流量拦截 - * @author Chopper - */ -@Aspect -@Configuration -@Slf4j -public class LimitInterceptor { - private RedisTemplate redisTemplate; - - private DefaultRedisScript limitScript; - - @Autowired - public void setRedisTemplate(RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - } - - @Autowired - public void setLimitScript(DefaultRedisScript limitScript) { - this.limitScript = limitScript; - } - - @Around("execution(public * *(..)) && @annotation(cn.lili.common.aop.limiter.annotation.LimitPoint)") - public Object interceptor(ProceedingJoinPoint pjp) { - MethodSignature signature = (MethodSignature) pjp.getSignature(); - Method method = signature.getMethod(); - LimitPoint limitPointAnnotation = method.getAnnotation(LimitPoint.class); - LimitType limitType = limitPointAnnotation.limitType(); - String name = limitPointAnnotation.name(); - String key; - int limitPeriod = limitPointAnnotation.period(); - int limitCount = limitPointAnnotation.limit(); - switch (limitType) { - case IP: - key = limitPointAnnotation.key() + getIpAddress(); - break; - case CUSTOMER: - key = limitPointAnnotation.key(); - break; - default: - key = StringUtils.upperCase(method.getName()); - } - ImmutableList keys = ImmutableList.of(StringUtils.join(limitPointAnnotation.prefix(), key)); - try { - Number count = redisTemplate.execute(limitScript, keys, limitCount, limitPeriod); - log.info("Access try count is {} for name={} and key = {}", count, name, key); - if (count != null && count.intValue() <= limitCount) { - return pjp.proceed(); - } else { - throw new RuntimeException("访问过于频繁,请稍后再试"); - } - } catch (Throwable e) { - if (e instanceof RuntimeException) { - throw new RuntimeException(e.getLocalizedMessage()); - } - throw new RuntimeException("服务器异常,请稍后再试"); - } - } - - - private static final String UNKNOWN = "unknown"; - - public String getIpAddress() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String ip = request.getHeader("x-forwarded-for"); - if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { - ip = request.getHeader("Proxy-Client-IP"); - } - if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { - ip = request.getHeader("WL-Proxy-Client-IP"); - } - if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { - ip = request.getRemoteAddr(); - } - return ip; - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/cache/MybatisRedisCache.java b/framework/src/main/java/cn/lili/common/cache/MybatisRedisCache.java deleted file mode 100644 index e47185bd..00000000 --- a/framework/src/main/java/cn/lili/common/cache/MybatisRedisCache.java +++ /dev/null @@ -1,101 +0,0 @@ -package cn.lili.common.cache; - -import cn.lili.common.utils.SpringContextUtil; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.cache.Cache; -import org.springframework.data.redis.connection.RedisServerCommands; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.util.CollectionUtils; - -import java.util.Set; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -/** - * MybatisRedisCache - * - * @author Chopper - * @version v1.0 - * @since - * 2020-04-01 2:59 下午 - * 不赞成使用此方式注解,统一使用Cacheable 更为合适 - * - * 使用方法 @CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class) - */ -@Deprecated -@Slf4j -public class MybatisRedisCache implements Cache { - - private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true); - - - private RedisTemplate getRedisTemplate() { - return (RedisTemplate) SpringContextUtil.getBean("redisTemplate"); - } - - private final String id; - - public MybatisRedisCache(final String id) { - if (id == null) { - throw new IllegalArgumentException("Cache instances require an ID"); - } - this.id = id; - } - - @Override - public String getId() { - return this.id; - } - - @Override - public void putObject(Object key, Object value) { - try { - if (value != null) { - log.info("写入缓存:" + key.toString()+"----"+value.toString()); - getRedisTemplate().opsForValue().set(key.toString(), value); - } - } catch (Exception e) { - log.error("写入mybatis缓存异常 ", e); - } - } - - @Override - public Object getObject(Object key) { - try { - if (key != null) { - log.info("获取缓存:" + key); - return getRedisTemplate().opsForValue().get(key.toString()); - } - } catch (Exception e) { - log.error("mybatis缓存获取异常 ", e); - } - return null; - } - - @Override - public Object removeObject(Object key) { - if (key != null) { - getRedisTemplate().delete(key.toString()); - } - return null; - } - - @Override - public void clear() { - Set keys = getRedisTemplate().keys("*:" + this.id + "*"); - if (!CollectionUtils.isEmpty(keys)) { - getRedisTemplate().delete(keys); - } - } - - @Override - public int getSize() { - Long size = getRedisTemplate().execute(RedisServerCommands::dbSize); - return size.intValue(); - } - - @Override - public ReadWriteLock getReadWriteLock() { - return this.readWriteLock; - } -} diff --git a/framework/src/main/java/cn/lili/common/context/ThreadContextHolder.java b/framework/src/main/java/cn/lili/common/context/ThreadContextHolder.java new file mode 100644 index 00000000..7e4b15f1 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/context/ThreadContextHolder.java @@ -0,0 +1,30 @@ +package cn.lili.common.context; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * request / response 获取工具 + * + * @author paulG + * @since 2020/10/16 + **/ +public class ThreadContextHolder { + + public static HttpServletResponse getHttpResponse() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + assert servletRequestAttributes != null; + return servletRequestAttributes.getResponse(); + } + + public static HttpServletRequest getHttpRequest() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + assert servletRequestAttributes != null; + return servletRequestAttributes.getRequest(); + } + + +} diff --git a/framework/src/main/java/cn/lili/common/delayqueue/AbstractDelayQueueMachineFactory.java b/framework/src/main/java/cn/lili/common/delayqueue/AbstractDelayQueueMachineFactory.java deleted file mode 100644 index 5189cff0..00000000 --- a/framework/src/main/java/cn/lili/common/delayqueue/AbstractDelayQueueMachineFactory.java +++ /dev/null @@ -1,100 +0,0 @@ -package cn.lili.common.delayqueue; - -import cn.lili.common.utils.RedisUtil; -import cn.lili.common.utils.ThreadPoolUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.DefaultTypedTuple; -import org.springframework.util.CollectionUtils; - -import javax.annotation.PostConstruct; -import java.util.Calendar; -import java.util.Set; -import java.util.TimeZone; -import java.util.concurrent.TimeUnit; - -/** - * 延时队列工厂 - * - * @author paulG - * @since 2020/11/7 - **/ -@Slf4j -public abstract class AbstractDelayQueueMachineFactory { - - @Autowired - private RedisUtil redisUtil; - - /** - * 插入任务id - * - * @param jobId 任务id(队列内唯一) - * @param time 延时时间(单位 :秒) - * @return 是否插入成功 - */ - public boolean addJobId(String jobId, Integer time) { - Calendar instance = Calendar.getInstance(); - instance.add(Calendar.SECOND, time); - long delaySeconds = instance.getTimeInMillis() / 1000; - return redisUtil.zadd(setDelayQueueName(), delaySeconds, jobId); - - } - - private void startDelayQueueMachine() { - log.info(String.format("延时队列机器{%s}开始运作", setDelayQueueName())); - - // 发生异常捕获并且继续不能让战斗停下来 - while (true) { - try { - // 获取当前时间的时间戳 - long now = System.currentTimeMillis() / 1000; - // 获取当前时间前的任务列表 - Set tuples = redisUtil.zrangeByScoreWithScores(setDelayQueueName(), 0, now); - // 如果不为空则遍历判断其是否满足取消要求 - if (!CollectionUtils.isEmpty(tuples)) { - for (DefaultTypedTuple tuple : tuples) { - - String jobId = (String) tuple.getValue(); - Long num = redisUtil.zremove(setDelayQueueName(), jobId); - // 如果移除成功, 则执行 - if (num > 0) { - ThreadPoolUtil.execute(() -> invoke(jobId)); - } - } - } - - } catch (Exception e) { -// log.warn(String.format("处理延时任务发生异常,异常原因为{%s}", e.getMessage()), e); - } finally { - // 间隔一秒钟搞一次 - try { - TimeUnit.SECONDS.sleep(1L); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - } - - } - - /** - * 最终执行的任务方法 - * - * @param jobId 任务id - */ - public abstract void invoke(String jobId); - - - /** - * 要实现延时队列的名字 - */ - public abstract String setDelayQueueName(); - - - @PostConstruct - public void init() { - new Thread(this::startDelayQueueMachine).start(); - } - -} diff --git a/framework/src/main/java/cn/lili/common/delayqueue/DelayQueueTools.java b/framework/src/main/java/cn/lili/common/delayqueue/DelayQueueTools.java deleted file mode 100644 index e6be4cf9..00000000 --- a/framework/src/main/java/cn/lili/common/delayqueue/DelayQueueTools.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.lili.common.delayqueue; - -/** - * 延时任务工具类 - * - * @author paulG - * @since 2021/5/7 - **/ -public class DelayQueueTools { - - /** - * 组装延时任务唯一键 - * - * @param type 延时任务类型 - * @param id id - * @return 唯一键 - */ - public static String wrapperUniqueKey(DelayQueueType type, String id) { - return "{TIME_TRIGGER_" + type.name() + "}_" + id; - } - -} diff --git a/framework/src/main/java/cn/lili/common/delayqueue/DelayQueueType.java b/framework/src/main/java/cn/lili/common/delayqueue/DelayQueueType.java deleted file mode 100644 index bb5c1a87..00000000 --- a/framework/src/main/java/cn/lili/common/delayqueue/DelayQueueType.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.lili.common.delayqueue; - -/** - * 延时任务类型 - * - * @author paulG - * @since 2021/5/7 - **/ -public enum DelayQueueType { - - /** - * 促销活动 - */ - PROMOTION("促销活动"), - /** - * 拼团订单 - */ - PINTUAN_ORDER("拼团订单"); - - private final String description; - - DelayQueueType(String des) { - this.description = des; - } - - public String description() { - return this.description; - } - -} diff --git a/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java b/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java deleted file mode 100644 index 906f5876..00000000 --- a/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java +++ /dev/null @@ -1,186 +0,0 @@ -package cn.lili.common.elasticsearch; - -import cn.hutool.core.bean.BeanUtil; -import cn.lili.config.elasticsearch.ElasticsearchProperties; -import lombok.extern.slf4j.Slf4j; -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.delete.DeleteRequest; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.client.HttpAsyncResponseConsumerFactory; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.client.indices.CreateIndexRequest; -import org.elasticsearch.client.indices.CreateIndexResponse; -import org.elasticsearch.client.indices.GetIndexRequest; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; - -import java.io.IOException; - -/** - * @author paulG - * @since 2020/10/14 - **/ -@Slf4j -public abstract class BaseElasticsearchService { - - protected static final RequestOptions COMMON_OPTIONS; - - static { - RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); - - // 默认缓冲限制为100MB,此处修改为30MB。 - builder.setHttpAsyncResponseConsumerFactory(new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024)); - COMMON_OPTIONS = builder.build(); - } - - @Autowired - @Qualifier("elasticsearchClient") - protected RestHighLevelClient client; - - @Autowired - private ElasticsearchProperties elasticsearchProperties; - - /** - * build DeleteIndexRequest - * - * @param index elasticsearch index name - * @author fxbin - */ - private static DeleteIndexRequest buildDeleteIndexRequest(String index) { - return new DeleteIndexRequest(index); - } - - /** - * build IndexRequest - * - * @param index elasticsearch index name - * @param id request object id - * @param object request object - * @return {@link IndexRequest} - * @author fxbin - */ - protected static IndexRequest buildIndexRequest(String index, String id, Object object) { - return new IndexRequest(index).id(id).source(BeanUtil.beanToMap(object), XContentType.JSON); - } - - /** - * create elasticsearch index (asyc) - * - * @param index elasticsearch index - * @author fxbin - */ - protected void createIndexRequest(String index) { - try { - CreateIndexRequest request = new CreateIndexRequest(index); - // Settings for this index - request.settings(Settings.builder().put("index.number_of_shards", elasticsearchProperties.getIndex().getNumberOfShards()).put("index.number_of_replicas", elasticsearchProperties.getIndex().getNumberOfReplicas())); - - CreateIndexResponse createIndexResponse = client.indices().create(request, COMMON_OPTIONS); - - log.info(" whether all of the nodes have acknowledged the request : {}", createIndexResponse.isAcknowledged()); - log.info(" Indicates whether the requisite number of shard copies were started for each shard in the index before timing out :{}", createIndexResponse.isShardsAcknowledged()); - } catch (Exception e) { - throw new ElasticsearchException("创建索引 {" + index + "} 失败:" + e.getMessage()); - } - } - - /** - * Description: 判断某个index是否存在 - * - * @param index index名 - * @return boolean - * @author fanxb - * @date 2019/7/24 14:57 - */ - public boolean indexExist(String index) { - try { - GetIndexRequest request = new GetIndexRequest(index); - request.local(false); - request.humanReadable(true); - request.includeDefaults(false); - return client.indices().exists(request, RequestOptions.DEFAULT); - } catch (Exception e) { - throw new ElasticsearchException("获取索引 {" + index + "} 是否存在失败:" + e.getMessage()); - } - } - - /** - * delete elasticsearch index - * - * @param index elasticsearch index name - * @author fxbin - */ - protected void deleteIndexRequest(String index) { - DeleteIndexRequest deleteIndexRequest = buildDeleteIndexRequest(index); - try { - client.indices().delete(deleteIndexRequest, COMMON_OPTIONS); - } catch (IOException e) { - throw new ElasticsearchException("删除索引 {" + index + "} 失败:" + e.getMessage()); - } - } - - /** - * exec updateRequest - * - * @param index elasticsearch index name - * @param id Document id - * @param object request object - * @author fxbin - */ - protected void updateRequest(String index, String id, Object object) { - try { - UpdateRequest updateRequest = new UpdateRequest(index, id).doc(BeanUtil.beanToMap(object), XContentType.JSON); - client.update(updateRequest, COMMON_OPTIONS); - } catch (IOException e) { - throw new ElasticsearchException("更新索引 {" + index + "} 数据 {" + object + "} 失败: " + e.getMessage()); - } - } - - /** - * exec deleteRequest - * - * @param index elasticsearch index name - * @param id Document id - * @author fxbin - */ - protected void deleteRequest(String index, String id) { - try { - DeleteRequest deleteRequest = new DeleteRequest(index, id); - client.delete(deleteRequest, COMMON_OPTIONS); - } catch (IOException e) { - throw new ElasticsearchException("删除索引 {" + index + "} 数据id {" + id + "} 失败: " + e.getMessage()); - } - } - - /** - * search all - * - * @param index elasticsearch index name - * @return {@link SearchResponse} - * @author fxbin - */ - protected SearchResponse search(String index) { - SearchRequest searchRequest = new SearchRequest(index); - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(QueryBuilders.matchAllQuery()); - searchRequest.source(searchSourceBuilder); - SearchResponse searchResponse = null; - try { - searchResponse = client.search(searchRequest, COMMON_OPTIONS); - } catch (IOException e) { - e.printStackTrace(); - } - return searchResponse; - } - - -} diff --git a/framework/src/main/java/cn/lili/modules/base/entity/enums/ClientTypeEnum.java b/framework/src/main/java/cn/lili/common/enums/ClientTypeEnum.java similarity index 60% rename from framework/src/main/java/cn/lili/modules/base/entity/enums/ClientTypeEnum.java rename to framework/src/main/java/cn/lili/common/enums/ClientTypeEnum.java index e4a7b838..6ba9190f 100644 --- a/framework/src/main/java/cn/lili/modules/base/entity/enums/ClientTypeEnum.java +++ b/framework/src/main/java/cn/lili/common/enums/ClientTypeEnum.java @@ -1,22 +1,37 @@ -package cn.lili.modules.base.entity.enums; +package cn.lili.common.enums; /** * 客户端类型 * * @author Chopper - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum ClientTypeEnum { + /** + * "移动端" + */ H5("移动端"), + /** + * "PC端" + */ PC("PC端"), + /** + * "小程序端" + */ WECHAT_MP("小程序端"), + /** + * "移动应用端" + */ APP("移动应用端"), + /** + * "未知" + */ UNKNOWN("未知"); - private final String clientName; + private String clientName; ClientTypeEnum(String des) { this.clientName = des; diff --git a/framework/src/main/java/cn/lili/common/enums/MessageCode.java b/framework/src/main/java/cn/lili/common/enums/MessageCode.java deleted file mode 100644 index 92b0e7d0..00000000 --- a/framework/src/main/java/cn/lili/common/enums/MessageCode.java +++ /dev/null @@ -1,166 +0,0 @@ -package cn.lili.common.enums; - -/** - * @author Chopper - * @version v4.1 - * @Description: 错误码 5位 - * 第一位 1:商品;2:会员;3:订单,4:店铺,5:页面,6:其他 - * @since 2020/11/17 4:44 下午 - */ -public enum MessageCode { - - E401("认证过期"), - - E10001("商品ID不存在"), - E10002("商品名称不正确,名称应为2-50字符"), - E10003("此规格已绑定分类不允许删除"), - E10004("该分类名称已存在"), - E10005("父分类不存在"), - E10006("最多为三级分类,添加失败"), - E10007("此类别下存在子类别不能删除"), - E10008("此类别下存在商品不能删除"), - E10009("通过categoryId获取分类失败"), - E10010("不能重复添加分销商品"), - E10011("无法将此商品放入回收站"), - E10012("无法彻底删除从此商品"), - E10013("无法下架此商品"), - E10014("无法还原此商品"), - - - E20001("用户名密码不能为空"), - E20002("该用户名已被注册"), - E20003("该手机号已被注册"), - E20004("用户不存在"), - E20005("修改资料成功"), - E20006("修改资料失败"), - E20007("手机号不存在"), - E20008("重置密码成功"), - E20009("修改手机号成功"), - E20010("旧密码不正确"), - E20011("修改密码成功"), - E20012("用户未登录"), - E20013("发布评价成功"), - E20014("领取优惠券成功"), - E20015("分销商不存在"), - E20016("分销商已申请,无需重复提交"), - E20017("密码错误"), - E20018("分销商清退失败"), - E20019("审核分销商失败"), - E20020("用户名或密码错误"), - E20021("订单状态不允许申请售后,请联系平台或商家"), - E20022("无权操作此数据!"), - E20023("此用户已禁用!"), - E20024("未对当前用户做手机号码校验!"), - E20025("可提现金额不足!"), - E20026("零钱提现失败!"), - E20027("请填写审核备注!"), - E20028("请勿重复签到"), - E20029("分销商不存在或已被清退"), - E20030("分销商提现记录不存在"), - E20031("分销商提现状态不正确,无法提现"), - E20032("余额账户不存在,无法操作"), - E20033("验证码错误,请重新输入"), - E20034("最多可以设置10个角色"), - E20035("订单已支付,请勿反复支付"), - E20036("该订单已部分支付,请前往订单中心进行支付"), - E20037("余额充值已支付成功,请勿重复支付"), - E20038("余额不足以支付订单,请充值"), - E20039("支付业务异常,请稍后重试"), - E20040("当前订单不需要付款,请返回订单列表重新操作"), - E20041("非当前用户的手机号"), - E20101("联合第三方登录,未绑定会员"), - E20102("联合第三方登录,授权信息错误"), - E20103("会员发票信息重复"), - E20104("会员发票信息不存在"), - E20105("权限不足"), - - E30001("购物车添加成功"), - E30002("购物车数量更新成功"), - E30003("购物车选中更新成功"), - E30004("清空购物车成功"), - E30005("删除购物车中的一个或多个产品成功"), - E30006("读取结算页的购物车异常"), - E30007("创建订单异常,请稍后重试"), - E30008("订单状态错误,无法进行确认收货"), - E30009("订单确定收货成功"), - E30010("订单不存在"), - E30011("已支付的订单不能修改金额"), - E30013("物流错误"), - E30014("当前订单不能发货"), - E30015("非当前会员的订单"), - E30016("无法重复提交评价"), - E30017("付款金额和应付金额不一致"), - E30018("售后已审核,无法重复操作"), - E30019("物流公司错误,请重新选择"), - E30020("请选择要投诉的商品"), - E30021("当前订单无法核销"), - E30022("当前售后单无法取消"), - E30023("当前订单未支付,不能申请售后"), - E30024("订单已支付,不能再次进行支付"), - E30025("收银台信息获取错误"), - E30026("积分不足,不能兑换"), - E30027("优惠券已使用/已过期,不能使用"), - E30028("投诉异常,请稍后重试"), - - E40001("非当前店铺数据,无法操作"), - E40002("此店铺不存在"), - E40003("店铺名称已存在!"), - E40004("参数有误!"), - E40005("已有店铺,无需重复申请"), - E40006("只有已出账结算单可以核对"), - E40007("只有已核对结算单可以审核"), - E40008("只有已审核结算单可以支付"), - E40009("只有商家可以操作结算单核对"), - E40010("只有管理可以操作结算单核对"), - E40011("存在不属于此店铺的商品"), - - E50001("该分类名称已存在"), - E50002("父分类不存在"), - E50003("最多为三级分类,添加失败"), - E50004("最多为三级分类,修改失败"), - E50005("文章分类名称重复,修改失败"), - E50006("该文章分类下存在子分类,不能删除"), - E50007("专题自动发布,无需操作发布"), - E50008("当前页面为开启状态,无法删除"), - E50009("当前页面为唯一页面,无法删除"), - E50010("页面已发布,无需重复提交"), - E50011("需传入查询ID"), - E50012("当前消息模板不存在"), - E50013("短信签名已存在"), - E50014("该文章分类下存在文章,不能删除"), - - E60000("请先登录再访问此接口"), - E60001("操作失败"), - E60002("非法请求"), - E60003("请求正在处理,请稍后再试"), - E60004("验证码为空或已过期,请重新获取"), - E60005("验证失败"), - E60007("OSS未配置"), - E60008("支付暂不支持"), - E60009("错误的客户端"), - - E60010("角色已绑定部门,请逐个删除"), - E60011("角色已绑定管理员,请逐个删除"), - E60012("菜单已绑定角色,请先删除或编辑角色"), - E60013("部门已经绑定管理员,请先删除或编辑管理员"), - - S21001("分销商清退成功"), - S21002("审核分销商成功"), - - S44000("操作成功"), - S50001("删除文章分类成功"); - - private final String value; - - MessageCode(String value) { - this.value = value; - } - - public Integer getCode() { - return Integer.parseInt(this.name().replace("E", "").replace("S", "")); - } - - public String getValue() { - return value; - } -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionTypeEnum.java b/framework/src/main/java/cn/lili/common/enums/PromotionTypeEnum.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionTypeEnum.java rename to framework/src/main/java/cn/lili/common/enums/PromotionTypeEnum.java index 2a346080..44dfa687 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionTypeEnum.java +++ b/framework/src/main/java/cn/lili/common/enums/PromotionTypeEnum.java @@ -1,22 +1,29 @@ -package cn.lili.modules.promotion.entity.enums; +package cn.lili.common.enums; /** * 促销分类枚举 * * @author Chopper - * @date 2021/2/1 19:32 + * @since 2021/2/1 19:32 */ public enum PromotionTypeEnum { /** * 促销枚举 */ - PINTUAN("拼团"), SECKILL("秒杀"), COUPON("优惠券"), FULL_DISCOUNT("满减"), POINTS_GOODS("积分商品"); + PINTUAN("拼团"), + SECKILL("秒杀"), + COUPON("优惠券"), + PLATFORM_COUPON("平台优惠券"), + FULL_DISCOUNT("满减"), + POINTS_GOODS("积分商品"), + KANJIA("砍价"), + COUPON_ACTIVITY("优惠券活动"); /** - * 拼团秒杀拥有独立库存,如果其他促销也有独立库存涉及库存扣减的,请添加在下方 + * 有促销库存的活动类型 */ - static PromotionTypeEnum[] haveStockPromotion = new PromotionTypeEnum[]{PINTUAN, SECKILL}; + static final PromotionTypeEnum[] haveStockPromotion = new PromotionTypeEnum[]{PINTUAN, SECKILL, KANJIA, POINTS_GOODS}; private final String description; diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index 5ee40677..c1040bb8 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -3,8 +3,9 @@ package cn.lili.common.enums; /** * 返回状态码 * 第一位 1:商品;2:用户;3:交易,4:促销,5:店铺,6:页面,7:设置,8:其他 + * * @author Chopper - * @date 2020/4/8 1:36 下午 + * @since 2020/4/8 1:36 下午 */ public enum ResultCode { @@ -16,84 +17,151 @@ public enum ResultCode { /** * 失败返回码 */ - ERROR(400,"失败"), + ERROR(400, "服务器繁忙,请稍后重试"), + /** * 失败返回码 */ - DEMO_SITE_EXCEPTION(400,"演示站点禁止使用"), + DEMO_SITE_EXCEPTION(4001, "演示站点禁止使用"), + /** + * 参数异常 + */ + PARAMS_ERROR(4002, "参数异常"), + + /** + * 系统异常 + */ + WECHAT_CONNECT_NOT_EXIST(1001, "微信联合登录未配置"), + VERIFICATION_EXIST(1002, "验证码服务异常"), + LIMIT_ERROR(1003, "访问过于频繁,请稍后再试"), + ILLEGAL_REQUEST_ERROR(1004, "非法请求,请重新刷新页面操作"), + IMAGE_FILE_EXT_ERROR(1005, "不支持图片格式"), + FILE_NOT_EXIST_ERROR(1011, "上传文件不能为空"), + FILE_TYPE_NOT_SUPPORT(1010, "不支持上传的文件类型!"), + PLATFORM_NOT_SUPPORTED_IM(1006, "平台未开启IM"), + STORE_NOT_SUPPORTED_IM(1007, "店铺未开启IM"), + UNINITIALIZED_PASSWORD(1008, "非初始化密码,无法进行初始化设置"), /** * 分类 */ - CATEGORY_NOT_EXIST(10001,"商品分类不存在"), - CATEGORY_NAME_IS_EXIST(10002,"该分类名称已存在"), - CATEGORY_PARENT_NOT_EXIST(10003,"该分类名称已存在"), - CATEGORY_BEYOND_THREE(10004,"最多为三级分类,添加失败"), - CATEGORY_HAS_CHILDREN(10005,"此类别下存在子类别不能删除"), - CATEGORY_HAS_GOODS(10006,"此类别下存在商品不能删除"), - CATEGORY_SAVE_ERROR(10007,"此类别下存在商品不能删除"), - CATEGORY_PARAMETER_SAVE_ERROR(10008,"分类绑定参数组添加失败"), - CATEGORY_PARAMETER_UPDATE_ERROR(10009,"分类绑定参数组添加失败"), + CATEGORY_NOT_EXIST(10001, "商品分类不存在"), + CATEGORY_NAME_IS_EXIST(10002, "该分类名称已存在"), + CATEGORY_PARENT_NOT_EXIST(10003, "该分类名称已存在"), + CATEGORY_BEYOND_THREE(10004, "最多为三级分类,添加失败"), + CATEGORY_HAS_CHILDREN(10005, "此类别下存在子类别不能删除"), + CATEGORY_HAS_GOODS(10006, "此类别下存在商品不能删除"), + CATEGORY_SAVE_ERROR(10007, "此类别下存在商品不能删除"), + CATEGORY_PARAMETER_NOT_EXIST(10012, "分类绑定参数组不存在"), + CATEGORY_PARAMETER_SAVE_ERROR(10008, "分类绑定参数组添加失败"), + CATEGORY_PARAMETER_UPDATE_ERROR(10009, "分类绑定参数组添加失败"), + CATEGORY_DELETE_FLAG_ERROR(10010, "子类状态不能与父类不一致!"), + CATEGORY_COMMISSION_RATE_ERROR(10011, "分类的佣金不正确!"), /** * 商品 */ - GOODS_NOT_EXIST(11001,"商品已下架"), - GOODS_NAME_ERROR(11002,"商品名称不正确,名称应为2-50字符"), - GOODS_UNDER_ERROR(11003,"商品下架失败"), - GOODS_UPPER_ERROR(11004,"商品上架失败"), - GOODS_AUTH_ERROR(11005,"商品审核失败"), + GOODS_ERROR(11001, "商品异常,请稍后重试"), + GOODS_NOT_EXIST(11001, "商品已下架"), + GOODS_NAME_ERROR(11002, "商品名称不正确,名称应为2-50字符"), + GOODS_UNDER_ERROR(11003, "商品下架失败"), + GOODS_UPPER_ERROR(11004, "商品上架失败"), + GOODS_AUTH_ERROR(11005, "商品审核失败"), + POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"), + POINT_GOODS_NOT_EXIST(11020, "积分商品不存在"), + POINT_GOODS_CATEGORY_EXIST(11021, "当前积分商品分类已存在"), + GOODS_SKU_SN_ERROR(11007, "商品SKU货号不能为空"), + GOODS_SKU_PRICE_ERROR(11008, "商品SKU价格不能小于等于0"), + GOODS_SKU_COST_ERROR(11009, "商品SKU成本价不能小于等于0"), + GOODS_SKU_WEIGHT_ERROR(11010, "商品重量不能为负数"), + GOODS_SKU_QUANTITY_ERROR(11011, "商品库存数量不能为负数"), + GOODS_SKU_QUANTITY_NOT_ENOUGH(11011, "商品库存不足"), + MUST_HAVE_GOODS_SKU(11012, "规格必须要有一个!"), + MUST_HAVE_SALES_MODEL(11022, "销售模式为批发时必须要有批发规则!"), + + HAVE_INVALID_SALES_MODEL(11023, "批发规则存在小于等于0的无效数据!"), + MUST_HAVE_GOODS_SKU_VALUE(11024, "规格值不能为空!"), + DO_NOT_MATCH_WHOLESALE(11025, "批发商品购买数量不能低于起拍量!"), + GOODS_NOT_ERROR(11026, "商品不存在"), + + GOODS_PARAMS_ERROR(11013, "商品参数错误,刷新后重试"), + PHYSICAL_GOODS_NEED_TEMP(11014, "实物商品需选择配送模板"), + VIRTUAL_GOODS_NOT_NEED_TEMP(11015, "虚拟商品无需选择配送模板"), + GOODS_NOT_EXIST_STORE(11017, "当前用户无权操作此商品"), + GOODS_TYPE_ERROR(11016, "需选择商品类型"), /** * 参数 */ - PARAMETER_SAVE_ERROR(12001,"参数添加失败"), - PARAMETER_UPDATE_ERROR(12002,"参数编辑失败"), + PARAMETER_SAVE_ERROR(12001, "参数添加失败"), + PARAMETER_UPDATE_ERROR(12002, "参数编辑失败"), /** * 规格 */ - SPEC_SAVE_ERROR(13001,"规格修改失败"), - SPEC_UPDATE_ERROR(13002,"规格修改失败"), - SPEC_DELETE_ERROR(13003,"此规格已绑定分类不允许删除"), + SPEC_SAVE_ERROR(13001, "规格修改失败"), + SPEC_UPDATE_ERROR(13002, "规格修改失败"), + SPEC_DELETE_ERROR(13003, "分类已经绑定此规格,请先解除关联"), /** * 品牌 */ - BRAND_SAVE_ERROR(14001,"品牌添加失败"), - BRAND_UPDATE_ERROR(14002,"品牌修改失败"), - BRAND_DISABLE_ERROR(14003,"品牌禁用失败"), - BRAND_DELETE_ERROR(14004,"品牌删除失败"), + BRAND_SAVE_ERROR(14001, "品牌添加失败"), + BRAND_UPDATE_ERROR(14002, "品牌修改失败"), + BRAND_DISABLE_ERROR(14003, "品牌禁用失败"), + BRAND_DELETE_ERROR(14004, "品牌删除失败"), + BRAND_NAME_EXIST_ERROR(20002, "品牌名称重复!"), + BRAND_USE_DISABLE_ERROR(20003, "分类已经绑定品牌,请先解除关联"), + BRAND_BIND_GOODS_ERROR(20005, "品牌已经绑定商品,请先解除关联"), + BRAND_NOT_EXIST(20004, "品牌不存在"), /** * 用户 */ - USER_EDIT_SUCCESS(20001,"用户修改成功"), + USER_EDIT_SUCCESS(20001, "用户修改成功"), USER_NOT_EXIST(20002, "用户不存在"), USER_NOT_LOGIN(20003, "用户未登录"), - USER_AUTH_EXPIRED(20004, "认证过期"), - USER_AUTHORITY_ERROR(20005,"权限不足"), - USER_CONNECT_LOGIN_ERROR(20006,"未找到登录信息"), - USER_NAME_EXIST(20007, "该用户名已被注册"), - USER_PHONE_EXIST(20008, "该手机号已被注册"), + USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"), + USER_AUTHORITY_ERROR(20005, "权限不足"), + USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"), + USER_EXIST(20008, "该用户名或手机号已被注册"), USER_PHONE_NOT_EXIST(20009, "手机号不存在"), USER_PASSWORD_ERROR(20010, "密码不正确"), - USER_NOT_PHONE(20011,"非当前用户的手机号"), - USER_CONNECT_ERROR(20012,"联合第三方登录,授权信息错误"), - USER_RECEIPT_REPEAT_ERROR(20013,"会员发票信息重复"), - USER_RECEIPT_NOT_EXIST(20014,"会员发票信息不存在"), - USER_EDIT_ERROR(20015,"用户修改失败"), + USER_NOT_PHONE(20011, "非当前用户的手机号"), + USER_CONNECT_ERROR(20012, "联合第三方登录,授权信息错误"), + USER_RECEIPT_REPEAT_ERROR(20013, "会员发票信息重复"), + USER_RECEIPT_NOT_EXIST(20014, "会员发票信息不存在"), + USER_EDIT_ERROR(20015, "用户修改失败"), USER_OLD_PASSWORD_ERROR(20016, "旧密码不正确"), - USER_COLLECTION_EXIST(2001,"无法重复收藏"), - + USER_COLLECTION_EXIST(20017, "无法重复收藏"), + USER_GRADE_IS_DEFAULT(20018, "会员等级为默认会员等级"), + USER_NOT_BINDING(20020, "未绑定用户"), + USER_AUTO_REGISTER_ERROR(20021, "自动注册失败,请稍后重试"), + USER_OVERDUE_CONNECT_ERROR(20022, "授权信息已过期,请重新授权/登录"), + USER_CONNECT_BANDING_ERROR(20023, "当前联合登陆方式,已绑定其他账号,需进行解绑操作"), + USER_CONNECT_NOT_EXIST_ERROR(20024, "暂无联合登陆信息,无法实现一键注册功能,请点击第三方登录进行授权"), + USER_POINTS_ERROR(20024, "用户积分不足"), + CLERK_SUPPER(20025, "店主无法操作"), + CLERK_SAVE_ERROR(20026, "店员保存失败"), + CLERK_NOT_FOUND_ERROR(20027, "店员不存在"), + USER_STATUS_ERROR(20028, "用户已禁用"), + CLERK_USER_ERROR(20029, "此账户已经绑定其他店铺"), + CLERK_ALREADY_EXIT_ERROR(20030, "店员已经存在"), + CLERK_DISABLED_ERROR(20031, "店员已禁用"), + CLERK_CURRENT_SUPPER(20032, "无法删除当前登录店员"), + CANT_EDIT_CLERK_SHOPKEEPER(20033, "无法在店员管理编辑店员信息"), /** * 权限 */ - PERMISSION_DEPARTMENT_ROLE_ERROR(21001,"角色已绑定部门,请逐个删除"), - PERMISSION_USER_ROLE_ERROR(21002,"角色已绑定管理员,请逐个删除"), - PERMISSION_MENU_ROLE_ERROR(21003,"菜单已绑定角色,请先删除或编辑角色"), - PERMISSION_DEPARTMENT_DELETE_ERROR(21004,"部门已经绑定管理员,请先删除或编辑管理员"), - PERMISSION_BEYOND_TEN(21005,"最多可以设置10个角色"), + PERMISSION_DEPARTMENT_ROLE_ERROR(21001, "角色已绑定部门,请逐个删除"), + PERMISSION_USER_ROLE_ERROR(21002, "角色已绑定管理员,请逐个删除"), + PERMISSION_MENU_ROLE_ERROR(21003, "菜单已绑定角色,请先删除或编辑角色"), + PERMISSION_DEPARTMENT_DELETE_ERROR(21004, "部门已经绑定管理员,请先删除或编辑管理员"), + PERMISSION_BEYOND_TEN(21005, "最多可以设置10个角色"), + PERMISSION_NOT_FOUND_ERROR(21006, "部门不存在"), + PERMISSION_ROLE_NOT_FOUND_ERROR(21007, "角色不存在"), + PERMISSION_CLERK_BAND_ERROR(21008, "此手机号码已绑定其他店铺 "), + /** * 分销 @@ -110,8 +178,11 @@ public enum ResultCode { * 购物车 */ CART_ERROR(30001, "读取结算页的购物车异常"), + CART_NUM_ERROR(30010, "购买数量必须大于0"), + CART_PINTUAN_NOT_EXIST_ERROR(30002, "拼团活动已关闭,请稍后重试"), + CART_PINTUAN_LIMIT_ERROR(30003, "购买数量超过拼团活动限制数量"), + SHIPPING_NOT_APPLY(30005, "购物商品不支持当前收货地址配送"), - SHIPPING_NOT_APPLY(30005, "当前选择地址暂不支持配送!"), /** * 订单 */ @@ -122,148 +193,327 @@ public enum ResultCode { ORDER_LOGISTICS_ERROR(31005, "物流错误"), ORDER_DELIVER_ERROR(31006, "物流错误"), ORDER_NOT_USER(31007, "非当前会员的订单"), - ORDER_TAKE_ERROR(31008,"当前订单无法核销"), + ORDER_TAKE_ERROR(31008, "当前订单无法核销"), + MEMBER_ADDRESS_NOT_EXIST(31009, "订单无收货地址,请先配置收货地址"), + STORE_ADDRESS_NOT_EXIST(31009, "订单没有自提地址,请先选择自提地址"), + ORDER_DELIVER_NUM_ERROR(31010, "没有待发货的订单"), + ORDER_NOT_SUPPORT_DISTRIBUTION(31011, "购物车中包含不支持配送的商品,请重新选择收货地址,或者重新选择商品"), + ORDER_NOT_EXIST_VALID(31041, "购物车中无有效商品,请检查购物车内商品,或者重新选择商品"), + ORDER_CAN_NOT_CANCEL(31012, "当前订单状态不可取消"), + ORDER_BATCH_DELIVER_ERROR(31013, "批量发货,文件读取失败"), + ORDER_ITEM_NOT_EXIST(31014, "当前订单项不存在!"), + POINT_NOT_ENOUGH(31015, "当前会员积分不足购买当前积分商品!"), + ORDER_LABEL_ORDER_ERROR(31016, "订单不能打印电子面单"), + ORDER_PRICE_ERROR(31017,"订单金额不能小于等于0"), + /** * 支付 */ - PAY_SUCCESS(32001,"支付成功"), - PAY_INCONSISTENT_ERROR(32002,"付款金额和应付金额不一致"), - PAY_DOUBLE_ERROR(32003,"订单已支付,不能再次进行支付"), - PAY_CASHIER_ERROR(32004,"收银台信息获取错误"), - PAY_ERROR(32005,"支付业务异常,请稍后重试"), - PAY_BAN(32006,"当前订单不需要付款,请返回订单列表重新操作"), - PAY_PARTIAL_ERROR(32007,"该订单已部分支付,请前往订单中心进行支付"), - PAY_NOT_SUPPORT(32008,"支付暂不支持"), - PAY_CLIENT_TYPE_ERROR(32009,"错误的客户端"), - PAY_POINT_ENOUGH(32010,"积分不足,不能兑换"), - PAY_NOT_EXIST_ORDER(32011,"支付订单不存在"), + PAY_UN_WANTED(32000, "当前订单不需要付款,返回订单列表等待系统订单出库即可"), + PAY_SUCCESS(32001, "支付成功"), + PAY_INCONSISTENT_ERROR(32002, "付款金额和应付金额不一致"), + PAY_DOUBLE_ERROR(32003, "订单已支付,不能再次进行支付"), + PAY_CASHIER_ERROR(32004, "收银台信息获取错误"), + PAY_ERROR(32005, "支付业务异常,请稍后重试"), + PAY_BAN(32006, "当前订单不需要付款,请返回订单列表重新操作"), + PAY_PARTIAL_ERROR(32007, "该订单已部分支付,请前往订单中心进行支付"), + PAY_NOT_SUPPORT(32008, "支付暂不支持"), + PAY_CLIENT_TYPE_ERROR(32009, "错误的客户端"), + PAY_POINT_ENOUGH(32010, "积分不足,不能兑换"), + PAY_NOT_EXIST_ORDER(32011, "支付订单不存在"), + CAN_NOT_RECHARGE_WALLET(32012, "不能使用余额进行充值"), + RECHARGE_PRICE_ERROR(32013, "充值金额错误"), /** * 售后 */ - AFTER_SALES_NOT_PAY_ERROR(33001,"当前订单未支付,不能申请售后"), - AFTER_SALES_CANCEL_ERROR(33002,"当前售后单无法取消"), - AFTER_SALES_BAN(33003,"订单状态不允许申请售后,请联系平台或商家"), - AFTER_SALES_DOUBLE_ERROR(33004,"售后已审核,无法重复操作"), - AFTER_SALES_LOGISTICS_ERROR(33005,"物流公司错误,请重新选择"), + AFTER_SALES_NOT_PAY_ERROR(33001, "当前订单未支付,不能申请售后"), + AFTER_SALES_CANCEL_ERROR(33002, "当前售后单无法取消"), + AFTER_SALES_BAN(33003, "订单状态不允许申请售后,请联系平台或商家"), + AFTER_SALES_DOUBLE_ERROR(33004, "售后已审核,无法重复操作"), + AFTER_SALES_LOGISTICS_ERROR(33005, "物流公司错误,请重新选择"), + AFTER_STATUS_ERROR(33006, "售后状态错误,请刷新页面"), + RETURN_MONEY_OFFLINE_BANK_ERROR(33007, "当账号类型为银行转账时,银行信息不能为空"), + AFTER_SALES_PRICE_ERROR(33004, "申请退款金额错误"), + AFTER_GOODS_NUMBER_ERROR(33008, "申请售后商品数量错误"), /** * 投诉 */ - COMPLAINT_ORDER_ITEM_EMPTY_ERROR(33100,"订单不存在"), - COMPLAINT_SKU_EMPTY_ERROR(33101,"商品已下架,如需投诉请联系平台客服"), - COMPLAINT_ERROR(33102,"投诉异常,请稍后重试"), + COMPLAINT_ORDER_ITEM_EMPTY_ERROR(33100, "订单不存在"), + COMPLAINT_SKU_EMPTY_ERROR(33101, "商品已下架,如需投诉请联系平台客服"), + COMPLAINT_ERROR(33102, "投诉异常,请稍后重试"), + COMPLAINT_NOT_EXIT(33103, "当前投诉记录不存在"), + COMPLAINT_ARBITRATION_RESULT_ERROR(33104, "结束订单投诉时,仲裁结果不能为空"), + COMPLAINT_APPEAL_CONTENT_ERROR(33105, "商家申诉时,申诉内容不能为空"), + COMPLAINT_CANCEL_ERROR(33106, "申诉已完成,不需要进行取消申诉操作"), + /** * 余额 */ - WALLET_INSUFFICIENT(34001,"余额不足以支付订单,请充值!"), - WALLET_WITHDRAWAL_INSUFFICIENT(34002,"可提现金额不足!"), - WALLET_ERROR_INSUFFICIENT(34003,"零钱提现失败!"), - WALLET_REMARK_ERROR(34004,"请填写审核备注!"), - + WALLET_NOT_EXIT_ERROR(34000, "钱包不存在,请联系管理员"), + WALLET_INSUFFICIENT(34001, "余额不足以支付订单,请充值!"), + WALLET_WITHDRAWAL_INSUFFICIENT(34002, "可提现金额不足!"), + WALLET_WITHDRAWAL_FROZEN_AMOUNT_INSUFFICIENT(34006, "冻结金额不足,无法处理提现申请请求!"), + WALLET_ERROR_INSUFFICIENT(34003, "零钱提现失败!"), + WALLET_REMARK_ERROR(34004, "请填写审核备注!"), + WALLET_EXIT_ERROR(34005, "钱包已存在,无法重复创建"), + WALLET_APPLY_ERROR(34006, "提现申请异常!"), + WALLET_APPLY_MIN_PRICE_ERROR(34007, "提现最低提现金额错误!"), + WALLET_WITHDRAWAL_AMOUNT_ERROR(34008, "申请提现金额异常!"), /** * 评价 */ - EVALUATION_DOUBLE_ERROR(35001,"无法重复提交评价"), + EVALUATION_DOUBLE_ERROR(35001, "无法重复提交评价"), /** - * 签到 + * 活动 */ - MEMBER_SIGN_REPEAT(40001,"请勿重复签到"), + PROMOTION_GOODS_NOT_EXIT(40000, "当前促销商品不存在!"), + PROMOTION_GOODS_QUANTITY_NOT_EXIT(40020, "当前促销商品库存不足!"), + PROMOTION_GOODS_DO_NOT_JOIN_WHOLESALE(40050, "批发商品无法参加促销"), + PROMOTION_SAME_ACTIVE_EXIST(40001, "活动时间内已存在同类活动,请选择关闭、删除当前时段的活动"), + PROMOTION_START_TIME_ERROR(40002, "活动起始时间不能小于当前时间"), + PROMOTION_END_TIME_ERROR(40003, "活动结束时间不能小于当前时间"), + PROMOTION_TIME_ERROR(40004, "活动起始时间必须大于结束时间"), + PROMOTION_TIME_NOT_EXIST(40011, "活动起始时间和活动结束时间不能为空"), + PROMOTION_SAME_ERROR(40005, "当前时间段已存在相同活动!"), + PROMOTION_GOODS_ERROR(40006, "请选择要参与活动的商品"), + PROMOTION_STATUS_END(40007, "当前活动已停止"), + PROMOTION_UPDATE_ERROR(40008, "当前活动已开始/结束,无法编辑!"), + PROMOTION_ACTIVITY_GOODS_ERROR(40009, "当前活动已经开始无法添加商品"), + PROMOTION_ACTIVITY_ERROR(400010, "当前促销活动不存在"), + PROMOTION_LOG_EXIST(40011, "活动已参加,已发重复参加"), + APPLY_END_TIME_ERROR(40012, "参与截至时间不能小于当前时间,不能大于活动开始时间"), /** * 优惠券 */ - COUPON_EDIT_STATUS_SUCCESS(41001,"修改状态成功!"), - COUPON_CANCELLATION_SUCCESS(41002,"会员优惠券作废成功"), - COUPON_EXPIRED(41003,"优惠券已使用/已过期,不能使用"), - COUPON_EDIT_STATUS_ERROR(41004,"优惠券修改状态失败!"), + COUPON_LIMIT_ERROR(41000, "超出领取限制"), + COUPON_EDIT_STATUS_SUCCESS(41001, "修改状态成功!"), + COUPON_CANCELLATION_SUCCESS(41002, "会员优惠券作废成功"), + COUPON_EXPIRED(41003, "优惠券已使用/已过期,不能使用"), + COUPON_EDIT_STATUS_ERROR(41004, "优惠券修改状态失败!"), + COUPON_RECEIVE_ERROR(41005, "当前优惠券已经被领取完了,下次要早点来哦"), + COUPON_NUM_INSUFFICIENT_ERROR(41006, "优惠券剩余领取数量不足"), + COUPON_NOT_EXIST(41007, "当前优惠券不存在"), + COUPON_LIMIT_NUM_LESS_THAN_0(41008, "领取限制数量不能为负数"), + COUPON_LIMIT_GREATER_THAN_PUBLISH(41009, "领取限制数量超出发行数量"), + COUPON_DISCOUNT_ERROR(41010, "优惠券折扣必须小于10且大于0"), + COUPON_SCOPE_TYPE_GOODS_ERROR(41011, "当前关联范围类型为指定商品时,商品列表不能为空"), + COUPON_SCOPE_TYPE_CATEGORY_ERROR(41012, "当前关联范围类型为部分商品分类时,范围关联的id不能为空"), + COUPON_SCOPE_TYPE_STORE_ERROR(41013, "当前关联范围类型为部分店铺分类时,范围关联的id不能为空"), + COUPON_SCOPE_ERROR(41014, "指定商品范围关联id无效!"), + COUPON_MEMBER_NOT_EXIST(41015, "没有当前会员优惠券"), + COUPON_MEMBER_STATUS_ERROR(41016, "当前会员优惠券已过期/作废无法变更状态!"), + COUPON_RANGE_ERROR(41017, "优惠券使用时间范围错误"), + + SPECIAL_CANT_USE(41019, "特殊商品不能使用优惠券,不能使用"), + + COUPON_SAVE_ERROR(41020, "保存优惠券失败"), + COUPON_DELETE_ERROR(41021, "删除优惠券失败"), + COUPON_ACTIVITY_NOT_EXIST(41022, "当前优惠券活动不存在"), + COUPON_ACTIVITY_SAVE_ERROR(41023, "保存优惠券活动失败"), + COUPON_ACTIVITY_MAX_NUM(41024, "优惠券活动赠券数量最多为5"), + + COUPON_DO_NOT_RECEIVER(41030, "当前优惠券不允许主动领取"), /** * 拼团 */ - PINTUAN_MANUAL_OPEN_SUCCESS(42001,"手动开启拼团活动成功"), - PINTUAN_MANUAL_CLOSE_SUCCESS(42002,"手动关闭拼团活动成功"), - PINTUAN_ADD_SUCCESS(42003,"添加拼团活动成功"), - PINTUAN_EDIT_SUCCESS(42004,"修改拼团活动成功"), - PINTUAN_DELETE_SUCCESS(42005,"删除拼团活动成功"), - PINTUAN_MANUAL_OPEN_ERROR(42006,"手动开启拼团活动失败"), - PINTUAN_MANUAL_CLOSE_ERROR(42007,"手动关闭拼团活动失败"), - PINTUAN_ADD_ERROR(42008,"添加拼团活动失败"), - PINTUAN_EDIT_ERROR(42009,"修改拼团活动失败"), - PINTUAN_DELETE_ERROR(42010,"删除拼团活动失败"), + PINTUAN_MANUAL_OPEN_SUCCESS(42001, "手动开启拼团活动成功"), + PINTUAN_MANUAL_CLOSE_SUCCESS(42002, "手动关闭拼团活动成功"), + PINTUAN_ADD_SUCCESS(42003, "添加拼团活动成功"), + PINTUAN_EDIT_SUCCESS(42004, "修改拼团活动成功"), + PINTUAN_DELETE_SUCCESS(42005, "删除拼团活动成功"), + PINTUAN_MANUAL_OPEN_ERROR(42006, "手动开启拼团活动失败"), + PINTUAN_MANUAL_CLOSE_ERROR(42007, "手动关闭拼团活动失败"), + PINTUAN_ADD_ERROR(42008, "添加拼团活动失败"), + PINTUAN_EDIT_ERROR(42009, "修改拼团活动失败"), + PINTUAN_EDIT_ERROR_ITS_OPEN(42019, "拼团活动已开启,无法修改拼团活动!"), + PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"), + PINTUAN_JOIN_ERROR(42011, "不能参与自己发起的拼团活动!"), + PINTUAN_LIMIT_NUM_ERROR(42012, "购买数量超过拼团活动限制数量!"), + PINTUAN_NOT_EXIST_ERROR(42013, "当前拼团活动不存在!"), + PINTUAN_GOODS_NOT_EXIST_ERROR(42014, "当前拼团商品不存在!"), /** * 满额活动 */ - FULL_DISCOUNT_EDIT_SUCCESS(43001,"修改满优惠活动成功"), - FULL_DISCOUNT_EDIT_DELETE(43002,"删除满优惠活动成功"), + FULL_DISCOUNT_EDIT_SUCCESS(43001, "修改满优惠活动成功"), + FULL_DISCOUNT_EDIT_DELETE(43002, "删除满优惠活动成功"), + FULL_DISCOUNT_MODIFY_ERROR(43003, "当前编辑的满优惠活动已经开始或者已经结束,无法修改"), + FULL_DISCOUNT_NOT_EXIST_ERROR(43004, "当前要操作的满优惠活动不存在!"), + FULL_DISCOUNT_WAY_ERROR(43005, "请选择一种优惠方式!"), + FULL_DISCOUNT_GIFT_ERROR(43006, "请选择赠品!"), + FULL_DISCOUNT_COUPON_TIME_ERROR(43007, "赠送的优惠券有效时间必须在活动时间之内"), + FULL_DISCOUNT_MONEY_ERROR(43008, "请填写满减金额"), + FULL_DISCOUNT_MONEY_GREATER_THAN_MINUS(43009, "满减金额不能大于优惠门槛"), + FULL_RATE_NUM_ERROR(43010, "请填写打折数值"), + /** + * 直播 + */ + STODIO_GOODS_EXIST_ERROR(44001, "直播商品已存在"), + COMMODITY_ERROR(44002, "添加直播商品失败"), + + /** + * 秒杀 + */ + SECKILL_NOT_START_ERROR(45000, "今日没有限时抢购活动,请明天再来看看吧。"), + SECKILL_NOT_EXIST_ERROR(45001, "当前参与的秒杀活动不存在!"), + SECKILL_APPLY_NOT_EXIST_ERROR(45010, "当前参与的秒杀活动不存在!"), + SECKILL_UPDATE_ERROR(45002, "当前秒杀活动活动已经开始,无法修改!"), + SECKILL_PRICE_ERROR(45003, "活动价格不能大于商品原价"), + SECKILL_TIME_ERROR(45004, "时刻参数异常"), + SECKILL_DELETE_ERROR(45005, "该秒杀活动活动的状态不能删除"), + SECKILL_OPEN_ERROR(45010, "该秒杀活动活动的状态不能删除"), + SECKILL_CLOSE_ERROR(45006, "该秒杀活动活动的状态不能关闭"), + + + /** + * 优惠券活动 + */ + COUPON_ACTIVITY_START_TIME_ERROR(46001, "活动时间小于当前时间,不能进行编辑删除操作"), + COUPON_ACTIVITY_MEMBER_ERROR(46002, "指定精准发券则必须指定会员,会员不可以为空"), + COUPON_ACTIVITY_ITEM_ERROR(46003, "优惠券活动必须指定优惠券,不能为空"), + COUPON_ACTIVITY_ITEM_MUST_NUM_ERROR(46004, "优惠券活动最多指定10个优惠券"), + COUPON_ACTIVITY_ITEM_NUM_ERROR(46005, "赠券数量必须大于0"), + COUPON_ACTIVITY_ITEM_NUM_MAX_VALUE_2(46006, "赠券数量最大为2"), + + /** + * 其他促销 + */ + MEMBER_SIGN_REPEAT(47001, "请勿重复签到"), + POINT_GOODS_ACTIVE_STOCK_ERROR(47002, "活动库存数量不能高于商品库存"), + POINT_GOODS_ACTIVE_STOCK_INSUFFICIENT(47003, "积分商品库存不足"), + + /** + * 砍价活动 + */ + KANJIA_GOODS_ACTIVE_STOCK_ERROR(48001, "活动库存数量不能高于商品库存"), + KANJIA_GOODS_ACTIVE_PRICE_ERROR(48002, "最低购买金额不能高于商品金额"), + KANJIA_GOODS_ACTIVE_HIGHEST_PRICE_ERROR(48003, "最高砍价金额不能为0且不能超过商品金额"), + KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR(48004, "最低砍价金额不能为0且不能超过商品金额"), + KANJIA_GOODS_ACTIVE_HIGHEST_LOWEST_PRICE_ERROR(48005, "最低砍价金额不能高于最高砍价金额"), + KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR(48006, "结算金额不能高于商品金额"), + KANJIA_GOODS_DELETE_ERROR(48007, "删除砍价商品异常"), + KANJIA_GOODS_UPDATE_ERROR(48012, "更新砍价商品异常"), + KANJIA_ACTIVITY_NOT_FOUND_ERROR(48008, "砍价记录不存在"), + KANJIA_ACTIVITY_LOG_MEMBER_ERROR(48009, "当前会员已经帮砍"), + KANJIA_ACTIVITY_MEMBER_ERROR(48010, "当前会员已经发起此砍价商品活动"), + KANJIA_ACTIVITY_NOT_PASS_ERROR(48011, "当前砍价未满足条件,不能进行购买"), + KANJIA_NUM_BUY_ERROR(48012, "砍价商品购买数量不正确"), /** * 店铺 */ - STORE_NOT_EXIST(50001,"此店铺不存在"), - STORE_NAME_EXIST_ERROR(50002,"店铺名称已存在!"), - STORE_APPLY_DOUBLE_ERROR(50003,"已有店铺,无需重复申请!"), + + STORE_NOT_EXIST(50001, "此店铺不存在"), + STORE_NAME_EXIST_ERROR(50002, "店铺名称已存在!"), + STORE_APPLY_DOUBLE_ERROR(50003, "已经拥有店铺!"), + STORE_NOT_OPEN(50004, "该会员未开通店铺"), + STORE_NOT_LOGIN_ERROR(50005, "未登录店铺"), + STORE_CLOSE_ERROR(50006, "店铺关闭,请联系管理员"), + STORE_DELIVER_GOODS_ADDRESS(50007,"请填写商家发货地址"), + FREIGHT_TEMPLATE_NOT_EXIST(50010, "当前模版不存在"), + STORE_STATUS_ERROR(50011, "店铺状态异常,无法申请"), + STORE_DELIVER_ADDRESS_EXIST(50012,"请填写发货地址"), /** * 结算单 */ - BILL_CHECK_ERROR(51001,"只有已出账结算单可以核对"), - BILL_COMPLETE_ERROR(51002,"只有已审核结算单可以支付"), + BILL_CHECK_ERROR(51001, "只有已出账结算单可以核对"), + BILL_COMPLETE_ERROR(51002, "只有已审核结算单可以支付"), /** * 文章 */ - ARTICLE_CATEGORY_NAME_EXIST(60001,"文章分类名称已存在"), - ARTICLE_CATEGORY_PARENT_NOT_EXIST(60002,"文章分类父分类不存在"), - ARTICLE_CATEGORY_BEYOND_TWO(60003,"最多为二级分类,操作失败"), - ARTICLE_CATEGORY_DELETE_ERROR(60004,"该文章分类下存在子分类,不能删除"), - ARTICLE_CATEGORY_HAS_ARTICLE(60005,"该文章分类下存在文章,不能删除"), - ARTICLE_CATEGORY_NO_DELETION(60007,"默认文章分类不能进行删除"), - ARTICLE_NO_DELETION(60008,"默认文章不能进行删除"), - + ARTICLE_CATEGORY_NAME_EXIST(60001, "文章分类名称已存在"), + ARTICLE_CATEGORY_PARENT_NOT_EXIST(60002, "文章分类父分类不存在"), + ARTICLE_CATEGORY_BEYOND_TWO(60003, "最多为二级分类,操作失败"), + ARTICLE_CATEGORY_DELETE_ERROR(60004, "该文章分类下存在子分类,不能删除"), + ARTICLE_CATEGORY_HAS_ARTICLE(60005, "该文章分类下存在文章,不能删除"), + ARTICLE_CATEGORY_NO_DELETION(60007, "默认文章分类不能进行删除"), + ARTICLE_NO_DELETION(60008, "默认文章不能进行删除"), /** * 页面 */ - PAGE_NOT_EXIST(61001,"页面不存在"), - PAGE_OPEN_DELETE_ERROR(61002,"当前页面为开启状态,无法删除"), - PAGE_DELETE_ERROR(61003,"当前页面为唯一页面,无法删除"), - PAGE_RELEASE_ERROR(61004,"页面已发布,无需重复提交"), + PAGE_NOT_EXIST(61001, "页面不存在"), + PAGE_OPEN_DELETE_ERROR(61002, "当前页面为开启状态,无法删除"), + PAGE_DELETE_ERROR(61003, "当前页面为唯一页面,无法删除"), + PAGE_RELEASE_ERROR(61004, "页面已发布,无需重复提交"), /** * 设置 */ - SETTING_NOT_TO_SET(70001,"该参数不需要设置"), - - /** - * 短信 - */ - SMS_SIGN_EXIST_ERROR(80001,"短信签名已存在"), + SETTING_NOT_TO_SET(70001, "该参数不需要设置"), + ALIPAY_NOT_SETTING(70002, "支付宝支付未配置"), + ALIPAY_EXCEPTION(70003, "支付宝支付错误,请稍后重试"), + ALIPAY_PARAMS_EXCEPTION(70004, "支付宝参数异常"), + LOGISTICS_NOT_SETTING(70005, "您还未配置快递查询"), + LOGISTICS_CHECK_SETTING(70005, "操作失败,请检查您的快递鸟配置"), + ORDER_SETTING_ERROR(70006, "系统订单配置异常"), + ALI_SMS_SETTING_ERROR(70007, "您还未配置阿里云短信"), + SMS_SIGN_EXIST_ERROR(70008, "短信签名已存在"), /** * 站内信 */ - NOTICE_NOT_EXIST(80101,"当前消息模板不存在"), + NOTICE_NOT_EXIST(80001, "当前消息模板不存在"), + NOTICE_ERROR(80002, "修改站内信异常,请稍后重试"), + NOTICE_SEND_ERROR(80003, "发送站内信异常,请检查系统日志"), + /** * OSS */ - OSS_NOT_EXIST(80201,"OSS未配置"), + OSS_NOT_EXIST(80101, "OSS未配置"), + OSS_EXCEPTION_ERROR(80102, "文件上传失败,请稍后重试"), + OSS_DELETE_ERROR(80103, "图片删除失败"), /** * 验证码 */ - VERIFICATION_SEND_SUCCESS(80301,"短信验证码,发送成功"), - VERIFICATION_ERROR(80302,"验证失败"), - VERIFICATION_SMS_ERROR(80303,"短信验证码错误,请重新校验"), - VERIFICATION_SMS_EXPIRED_ERROR(80304,"验证码已失效,请重新校验") + VERIFICATION_SEND_SUCCESS(80201, "短信验证码,发送成功"), + VERIFICATION_ERROR(80202, "验证失败"), + VERIFICATION_CODE_INVALID(80204, "验证码已失效,请重新校验"), + VERIFICATION_SMS_CHECKED_ERROR(80210, "短信验证码错误,请重新校验"), + + /** + * 微信相关异常 + */ + WECHAT_CONNECT_NOT_SETTING(80300, "微信联合登陆信息未配置"), + WECHAT_PAYMENT_NOT_SETTING(80301, "微信支付信息未配置"), + WECHAT_QRCODE_ERROR(80302, "微信二维码生成异常"), + WECHAT_MP_MESSAGE_ERROR(80303, "微信小程序小消息订阅异常"), + WECHAT_JSAPI_SIGN_ERROR(80304, "微信JsApi签名异常"), + WECHAT_CERT_ERROR(80305, "证书获取失败"), + WECHAT_MP_MESSAGE_TMPL_ERROR(80306, "未能获取到微信模版消息id"), + WECHAT_ERROR(80307, "微信接口异常"), + APP_VERSION_EXIST(80307, "APP版本已存在"), + + /** + * IM + */ + IM_MESSAGE_ADD_ERROR(80400,"IM消息发送错误"), + IM_MESSAGE_EDIT_ERROR(80400,"IM消息更新错误"), + + /** + * 其他 + */ + CUSTOM_WORDS_EXIST_ERROR(90000, "当前自定义分词已存在!"), + CUSTOM_WORDS_NOT_EXIST_ERROR(90001, "当前自定义分词不存在!"), + CUSTOM_WORDS_SECRET_KEY_ERROR(90002, "秘钥验证失败!"), + CONNECT_NOT_EXIST(90000, "登录方式不存在!"), + ELASTICSEARCH_INDEX_INIT_ERROR(90003, "索引初始化失败!"), + PURCHASE_ORDER_DEADLINE_ERROR(90004, "供求单,已超过报名截止时间"), + INDEX_BUILDING(90005, "索引正在生成"); + - ; private final Integer code; private final String message; diff --git a/framework/src/main/java/cn/lili/common/utils/ResultUtil.java b/framework/src/main/java/cn/lili/common/enums/ResultUtil.java similarity index 80% rename from framework/src/main/java/cn/lili/common/utils/ResultUtil.java rename to framework/src/main/java/cn/lili/common/enums/ResultUtil.java index f08b0b37..e7076480 100644 --- a/framework/src/main/java/cn/lili/common/utils/ResultUtil.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultUtil.java @@ -1,10 +1,11 @@ -package cn.lili.common.utils; +package cn.lili.common.enums; -import cn.lili.common.enums.ResultCode; import cn.lili.common.vo.ResultMessage; /** + * 返回结果工具类 + * * @author lili */ public class ResultUtil { @@ -17,10 +18,6 @@ public class ResultUtil { * 正常响应 */ private static final Integer SUCCESS = 200; - /** - * 业务异常 - */ - private static final Integer ERROR = 400; /** @@ -36,38 +33,14 @@ public class ResultUtil { /** * 返回数据 * - * @param t - * @return + * @param t 范型 + * @return 消息 */ public ResultMessage setData(T t) { this.resultMessage.setResult(t); return this.resultMessage; } - /** - * 服务器异常 追加状态码 - * - * @param resultCode 返回码 - */ - public ResultMessage setErrorMsg(ResultCode resultCode) { - this.resultMessage.setSuccess(false); - this.resultMessage.setMessage(resultCode.message()); - this.resultMessage.setCode(resultCode.code()); - return this.resultMessage; - } - - /** - * 服务器异常 追加状态码 - * @param code 状态码 - * @param msg 返回消息 - */ - public ResultMessage setErrorMsg(Integer code, String msg) { - this.resultMessage.setSuccess(false); - this.resultMessage.setMessage(msg); - this.resultMessage.setCode(code); - return this.resultMessage; - } - /** * 返回成功消息 @@ -83,32 +56,79 @@ public class ResultUtil { } - //抽象静态方法,返回结果集 + /** + * 抽象静态方法,返回结果集 + * @param t 范型 + * @param 范型 + * @return 消息 + */ public static ResultMessage data(T t) { return new ResultUtil().setData(t); } /** * 返回成功 + * * @param resultCode 返回状态码 + * @return 消息 */ public static ResultMessage success(ResultCode resultCode) { return new ResultUtil().setSuccessMsg(resultCode); } + /** + * 返回成功 + * @return 消息 + */ + public static ResultMessage success() { + return new ResultUtil().setSuccessMsg(ResultCode.SUCCESS); + } + /** * 返回失败 + * * @param resultCode 返回状态码 + * @return 消息 */ public static ResultMessage error(ResultCode resultCode) { return new ResultUtil().setErrorMsg(resultCode); } + /** * 返回失败 + * * @param code 状态码 - * @param msg 返回消息 + * @param msg 返回消息 + * @return 消息 */ public static ResultMessage error(Integer code, String msg) { return new ResultUtil().setErrorMsg(code, msg); } + + /** + * 服务器异常 追加状态码 + * @param resultCode 返回码 + * @return 消息 + */ + public ResultMessage setErrorMsg(ResultCode resultCode) { + this.resultMessage.setSuccess(false); + this.resultMessage.setMessage(resultCode.message()); + this.resultMessage.setCode(resultCode.code()); + return this.resultMessage; + } + + /** + * 服务器异常 追加状态码 + * + * @param code 状态码 + * @param msg 返回消息 + * @return 消息 + */ + public ResultMessage setErrorMsg(Integer code, String msg) { + this.resultMessage.setSuccess(false); + this.resultMessage.setMessage(msg); + this.resultMessage.setCode(code); + return this.resultMessage; + } + } diff --git a/framework/src/main/java/cn/lili/common/enums/StoreLogType.java b/framework/src/main/java/cn/lili/common/enums/StoreLogType.java deleted file mode 100644 index 40c56ca6..00000000 --- a/framework/src/main/java/cn/lili/common/enums/StoreLogType.java +++ /dev/null @@ -1,129 +0,0 @@ -package cn.lili.common.enums; - -/** - * 日志枚举 - * - * @author Chopper - */ -public enum StoreLogType { - - /** - * 默认0操作 - */ - OPERATION, - - /** - * 1登录 - */ - LOGIN, - - /** - * 商品 - */ - - //商品上架 - - //商品下架 - - //发布商品 - - //修改商品 - - //删除商品 - - //添加商品模板 - - //编辑商品库存 - - //增加店铺商品分类 - - //编辑店铺商品分类 - - /** - * 订单 - */ - - //发货 - - //修改收件信息 - - /** - * 售后 - */ - - //审核退货单 - - //确定收货 - - //拒绝收货 - - //退款 - - //拒绝退款 - - - - /** - * 营销 - */ - - //添加分销商品 - - //下架分销商品 - - //编辑分销商品 - - //创建满减活动 - - //编辑满减活动 - - //下架满减活动 - - //上架满减活动 - - //删除满减活动 - - //添加优惠券 - - //编辑优惠券 - - //关闭优惠券 - - //参与秒杀活动 - - //编辑秒杀活动 - - //下架秒杀活动 - - //上架秒杀活动 - - //删除秒杀活动 - - - /** - * 设置 - */ - - //选择物流公司 - - //取消物流公司 - - //添加运费模板 - - //编辑运费模板 - - //删除运费模板 - - //设置店铺信息 - - //修改店铺退货地址 - - //新增自提点 - - //编辑自提点 - - //删除自提点 - - //发布店铺首页 - -} diff --git a/framework/src/main/java/cn/lili/common/event/TransactionCommitSendMQEvent.java b/framework/src/main/java/cn/lili/common/event/TransactionCommitSendMQEvent.java new file mode 100644 index 00000000..7b3d2e73 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/event/TransactionCommitSendMQEvent.java @@ -0,0 +1,32 @@ +package cn.lili.common.event; + +import lombok.Getter; +import org.springframework.context.ApplicationEvent; + +/** + * 事务提交后发生mq事件 + * + * @author paulG + * @since 2022/1/19 + **/ +public class TransactionCommitSendMQEvent extends ApplicationEvent { + + private static final long serialVersionUID = 5885956821347953071L; + + + @Getter + private final String topic; + + @Getter + private final String tag; + + @Getter + private final Object message; + + public TransactionCommitSendMQEvent(Object source, String topic, String tag, Object message) { + super(source); + this.topic = topic; + this.tag = tag; + this.message = message; + } +} diff --git a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java index 3da03776..14a1a010 100644 --- a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java +++ b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java @@ -1,7 +1,7 @@ package cn.lili.common.exception; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -14,16 +14,17 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.validation.ConstraintViolationException; import java.util.List; /** - * 全局异常异常处理 + * 异常处理 * * @author Chopper */ @RestControllerAdvice @Slf4j -public class GlobalControllerExceptionHandler { +public class GlobalControllerExceptionHandler { /** * 如果超过长度,则前后段交互体验不佳,使用默认错误消息 @@ -40,14 +41,42 @@ public class GlobalControllerExceptionHandler { @ResponseStatus(value = HttpStatus.BAD_REQUEST) public ResultMessage handleServiceException(HttpServletRequest request, final Exception e, HttpServletResponse response) { - log.error("全局异常[ServiceException]:", e); //如果是自定义异常,则获取异常,返回自定义错误消息 if (e instanceof ServiceException) { - ResultCode resultCode=((ServiceException) e).getResultCode(); + ServiceException serviceException = ((ServiceException) e); + ResultCode resultCode = serviceException.getResultCode(); + + Integer code = null; + String message = null; + if (resultCode != null) { - return ResultUtil.error(resultCode.code(), resultCode.message()); + code = resultCode.code(); + message = resultCode.message(); } + //如果有扩展消息,则输出异常中,跟随补充异常 + if (!serviceException.getMsg().equals(ServiceException.DEFAULT_MESSAGE)) { + message += ":" + serviceException.getMsg(); + } + + // 对一些特殊异常处理,不再打印error级别的日志 + assert serviceException.getResultCode() != null; + if (serviceException.getResultCode().equals(ResultCode.DEMO_SITE_EXCEPTION)) { + log.debug("[DEMO_SITE_EXCEPTION]:{}", serviceException.getResultCode().message(), e); + return ResultUtil.error(code, message); + } + if (serviceException.getResultCode().equals(ResultCode.USER_AUTH_EXPIRED)) { + log.debug("403 :{}", serviceException.getResultCode().message(), e); + return ResultUtil.error(code, message); + } + + + log.error("全局异常[ServiceException]:{}-{}", serviceException.getResultCode().code(), serviceException.getResultCode().message(), e); + return ResultUtil.error(code, message); + + } else { + + log.error("全局异常[ServiceException]:", e); } //默认错误消息 @@ -55,8 +84,17 @@ public class GlobalControllerExceptionHandler { if (e != null && e.getMessage() != null && e.getMessage().length() < MAX_LENGTH) { errorMsg = e.getMessage(); } - return ResultUtil.error(400, errorMsg); + return ResultUtil.error(ResultCode.ERROR.code(), errorMsg); } +/* + @ExceptionHandler(ConstraintViolationException.class) + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + public ResultMessage constraintExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { + + log.error("全局异常[RuntimeException]:", e); + + return ResultUtil.error(001, e.getMessage()); + }*/ @ExceptionHandler(RuntimeException.class) @ResponseStatus(value = HttpStatus.BAD_REQUEST) @@ -64,27 +102,27 @@ public class GlobalControllerExceptionHandler { log.error("全局异常[RuntimeException]:", e); - return ResultUtil.error(400, "服务器异常,请稍后重试"); + return ResultUtil.error(ResultCode.ERROR); } -// /** -// * 通用的接口映射异常处理方 -// */ -// @Override -// protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { -// if (ex instanceof MethodArgumentNotValidException) { -// MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex; -// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status); -// } -// if (ex instanceof MethodArgumentTypeMismatchException) { -// MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex; -// logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName() -// + ",信息:" + exception.getLocalizedMessage()); -// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("参数转换失败"), status); -// } -// ex.printStackTrace(); -// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("未知异常,请联系管理员"), status); -// } +// /** +// * 通用的接口映射异常处理方 +// */ +// @Override +// protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { +// if (ex instanceof MethodArgumentNotValidException) { +// MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex; +// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status); +// } +// if (ex instanceof MethodArgumentTypeMismatchException) { +// MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex; +// logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName() +// + ",信息:" + exception.getLocalizedMessage()); +// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("参数转换失败"), status); +// } +// ex.printStackTrace(); +// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("未知异常,请联系管理员"), status); +// } /** * bean校验未通过异常 @@ -101,9 +139,23 @@ public class GlobalControllerExceptionHandler { BindException exception = (BindException) e; List fieldErrors = exception.getBindingResult().getFieldErrors(); for (FieldError error : fieldErrors) { - return ResultUtil.error(400,error.getDefaultMessage()); + return ResultUtil.error(ResultCode.PARAMS_ERROR.code(), error.getDefaultMessage()); } - return ResultUtil.error(ResultCode.ERROR); + return ResultUtil.error(ResultCode.PARAMS_ERROR); } + /** + * bean校验未通过异常 + * + * @see javax.validation.Valid + * @see org.springframework.validation.Validator + * @see org.springframework.validation.DataBinder + */ + @ExceptionHandler(ConstraintViolationException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ResponseBody + public ResultMessage constraintViolationExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { + ConstraintViolationException exception = (ConstraintViolationException) e; + return ResultUtil.error(ResultCode.PARAMS_ERROR.code(), exception.getMessage()); + } } diff --git a/framework/src/main/java/cn/lili/common/exception/RetryException.java b/framework/src/main/java/cn/lili/common/exception/RetryException.java new file mode 100644 index 00000000..97ccb522 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/exception/RetryException.java @@ -0,0 +1,21 @@ +package cn.lili.common.exception; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 如需异常重试,则抛出此异常 + * + * @author paulG + * @since 2022/4/26 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class RetryException extends RuntimeException { + + private static final long serialVersionUID = 7886918292771470846L; + + public RetryException(String message) { + super(message); + } +} diff --git a/framework/src/main/java/cn/lili/common/exception/ServiceException.java b/framework/src/main/java/cn/lili/common/exception/ServiceException.java index 70e35d58..feb98e6d 100644 --- a/framework/src/main/java/cn/lili/common/exception/ServiceException.java +++ b/framework/src/main/java/cn/lili/common/exception/ServiceException.java @@ -2,29 +2,47 @@ package cn.lili.common.exception; import cn.lili.common.enums.ResultCode; import lombok.Data; +import lombok.EqualsAndHashCode; /** + * 全局业务异常类 + * * @author Chopper */ +@EqualsAndHashCode(callSuper = true) @Data public class ServiceException extends RuntimeException { - private String msg; + private static final long serialVersionUID = 3447728300174142127L; + public static final String DEFAULT_MESSAGE = "网络错误,请稍后重试!"; + + /** + * 异常消息 + */ + private String msg = DEFAULT_MESSAGE; + + /** + * 错误码 + */ private ResultCode resultCode; public ServiceException(String msg) { - super(msg); + this.resultCode = ResultCode.ERROR; this.msg = msg; } public ServiceException() { - super("网络错误,请稍后重试!"); - this.msg = "网络错误,请稍后重试!"; + super(); } public ServiceException(ResultCode resultCode) { this.resultCode = resultCode; } + public ServiceException(ResultCode resultCode, String message) { + this.resultCode = resultCode; + this.msg = message; + } + } diff --git a/framework/src/main/java/cn/lili/common/listener/TransactionCommitSendMQListener.java b/framework/src/main/java/cn/lili/common/listener/TransactionCommitSendMQListener.java new file mode 100644 index 00000000..c709df75 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/listener/TransactionCommitSendMQListener.java @@ -0,0 +1,38 @@ +package cn.lili.common.listener; + +import cn.lili.common.event.TransactionCommitSendMQEvent; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +/** + * 事务提交监听器 + * + * @author paulG + * @since 2022/1/19 + **/ +@Component +@Slf4j +public class TransactionCommitSendMQListener { + + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void send(TransactionCommitSendMQEvent event) { + log.info("事务提交,发送mq信息!{}", event); + String destination = event.getTopic() + ":" + event.getTag(); + //发送订单变更mq消息 + rocketMQTemplate.asyncSend(destination, event.getMessage(), RocketmqSendCallbackBuilder.commonCallback()); + } + + +} diff --git a/framework/src/main/java/cn/lili/config/properties/ApiProperties.java b/framework/src/main/java/cn/lili/common/properties/ApiProperties.java similarity index 94% rename from framework/src/main/java/cn/lili/config/properties/ApiProperties.java rename to framework/src/main/java/cn/lili/common/properties/ApiProperties.java index 806c891d..9a584dde 100644 --- a/framework/src/main/java/cn/lili/config/properties/ApiProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/ApiProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.properties; +package cn.lili.common.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/framework/src/main/java/cn/lili/config/properties/DomainProperties.java b/framework/src/main/java/cn/lili/common/properties/DomainProperties.java similarity index 94% rename from framework/src/main/java/cn/lili/config/properties/DomainProperties.java rename to framework/src/main/java/cn/lili/common/properties/DomainProperties.java index 7a56f007..0f7675f4 100644 --- a/framework/src/main/java/cn/lili/config/properties/DomainProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/DomainProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.properties; +package cn.lili.common.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/framework/src/main/java/cn/lili/config/properties/IgnoredUrlsProperties.java b/framework/src/main/java/cn/lili/common/properties/IgnoredUrlsProperties.java similarity index 81% rename from framework/src/main/java/cn/lili/config/properties/IgnoredUrlsProperties.java rename to framework/src/main/java/cn/lili/common/properties/IgnoredUrlsProperties.java index 097fdee6..67173628 100644 --- a/framework/src/main/java/cn/lili/config/properties/IgnoredUrlsProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/IgnoredUrlsProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.properties; +package cn.lili.common.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -17,6 +17,4 @@ import java.util.List; public class IgnoredUrlsProperties { private List urls = new ArrayList<>(); - - private List limitUrls = new ArrayList<>(); } diff --git a/framework/src/main/java/cn/lili/config/properties/JWTTokenProperties.java b/framework/src/main/java/cn/lili/common/properties/JWTTokenProperties.java similarity index 92% rename from framework/src/main/java/cn/lili/config/properties/JWTTokenProperties.java rename to framework/src/main/java/cn/lili/common/properties/JWTTokenProperties.java index b542694c..d56293cf 100644 --- a/framework/src/main/java/cn/lili/config/properties/JWTTokenProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/JWTTokenProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.properties; +package cn.lili.common.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/framework/src/main/java/cn/lili/config/rocketmq/RocketmqCustomProperties.java b/framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java similarity index 91% rename from framework/src/main/java/cn/lili/config/rocketmq/RocketmqCustomProperties.java rename to framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java index 9f17158f..cfc001ff 100644 --- a/framework/src/main/java/cn/lili/config/rocketmq/RocketmqCustomProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.rocketmq; +package cn.lili.common.properties; import lombok.AllArgsConstructor; import lombok.Builder; @@ -19,6 +19,7 @@ import org.springframework.stereotype.Component; @ConfigurationProperties(prefix = "lili.data.rocketmq") public class RocketmqCustomProperties { + private String promotionTopic; private String promotionGroup; @@ -61,4 +62,8 @@ public class RocketmqCustomProperties { private String afterSaleGroup; + private String broadcastTopic; + + private String broadcastGroup; + } diff --git a/framework/src/main/java/cn/lili/common/properties/SmsTemplateProperties.java b/framework/src/main/java/cn/lili/common/properties/SmsTemplateProperties.java new file mode 100644 index 00000000..36cec12c --- /dev/null +++ b/framework/src/main/java/cn/lili/common/properties/SmsTemplateProperties.java @@ -0,0 +1,36 @@ +package cn.lili.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 短信模版设置 + * + * @author Chopper + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "lili.sms") +public class SmsTemplateProperties { + /** + * 登录 + */ + private String lOGIN = "SMS_185821482"; + /** + * 注册 + */ + private String REGISTER = "SMS_185821482"; + /** + * 找回密码 + */ + private String FIND_USER = "SMS_185821482"; + /** + * 设置密码 + */ + private String UPDATE_PASSWORD = "SMS_185821482"; + /** + * 设置支付密码 + */ + private String WALLET_PASSWORD = "SMS_185821482"; +} diff --git a/framework/src/main/java/cn/lili/config/properties/StatisticsProperties.java b/framework/src/main/java/cn/lili/common/properties/StatisticsProperties.java similarity index 94% rename from framework/src/main/java/cn/lili/config/properties/StatisticsProperties.java rename to framework/src/main/java/cn/lili/common/properties/StatisticsProperties.java index a2e69777..30cd2ba3 100644 --- a/framework/src/main/java/cn/lili/config/properties/StatisticsProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/StatisticsProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.properties; +package cn.lili.common.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -9,7 +9,6 @@ import org.springframework.context.annotation.Configuration; * * @author Chopper * @version v4.0 - * @Description: * @since 2021/2/21 10:19 */ @Data diff --git a/framework/src/main/java/cn/lili/common/properties/SystemSettingProperties.java b/framework/src/main/java/cn/lili/common/properties/SystemSettingProperties.java new file mode 100644 index 00000000..2063270d --- /dev/null +++ b/framework/src/main/java/cn/lili/common/properties/SystemSettingProperties.java @@ -0,0 +1,60 @@ +package cn.lili.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 系统设置 + * + * @author Chopper + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "lili.system") +public class SystemSettingProperties { + + + /** + * 是否是演示站点 + */ + private Boolean isDemoSite = false; + + /** + * 测试模式 + * 验证码短信为6个1 + */ + private Boolean isTestModel = false; + + /** + * 脱敏级别: + * 0:不做脱敏处理 + * 1:管理端用户手机号等信息脱敏 + * 2:商家端信息脱敏(为2时,表示管理端,商家端同时脱敏) + *

+ * PS: + */ + private Integer sensitiveLevel = 0; + + + public Boolean getDemoSite() { + if (isDemoSite == null) { + return false; + } + return isDemoSite; + } + + public Boolean getTestModel() { + if (isTestModel == null) { + return false; + } + return isTestModel; + } + + public Integer getSensitiveLevel() { + if (sensitiveLevel == null) { + return 0; + } + return sensitiveLevel; + } +} diff --git a/framework/src/main/java/cn/lili/config/properties/ThreadProperties.java b/framework/src/main/java/cn/lili/common/properties/ThreadProperties.java similarity index 90% rename from framework/src/main/java/cn/lili/config/properties/ThreadProperties.java rename to framework/src/main/java/cn/lili/common/properties/ThreadProperties.java index 90dced01..df57a9c2 100644 --- a/framework/src/main/java/cn/lili/config/properties/ThreadProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/ThreadProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.properties; +package cn.lili.common.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -37,7 +37,7 @@ public class ThreadProperties { /** * 保持存活时间 */ - private Integer KeepAliveSeconds = 60; + private Integer keepAliveSeconds = 60; } diff --git a/framework/src/main/java/cn/lili/common/properties/VerificationCodeProperties.java b/framework/src/main/java/cn/lili/common/properties/VerificationCodeProperties.java new file mode 100644 index 00000000..bc98712c --- /dev/null +++ b/framework/src/main/java/cn/lili/common/properties/VerificationCodeProperties.java @@ -0,0 +1,49 @@ +package cn.lili.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 线程配置 + * + * @author Chopper + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "lili.verification-code") +public class VerificationCodeProperties { + + + /** + * 过期时间 + * 包含滑块验证码有效时间, 以及验证通过之后,缓存中存储的验证结果有效时间 + */ + private Long effectiveTime = 600L; + + /** + * 水印 + */ + private String watermark = ""; + /** + * 干扰数量 最大数量 + */ + private Integer interfereNum = 0; + + /** + * 容错像素 + */ + private Integer faultTolerant = 3; + + + public String getWatermark() { + return watermark; + } + + public Integer getInterfereNum() { + if (interfereNum > 2) { + return 2; + } + return interfereNum; + } +} diff --git a/framework/src/main/java/cn/lili/common/rocketmq/tags/GoodsTagsEnum.java b/framework/src/main/java/cn/lili/common/rocketmq/tags/GoodsTagsEnum.java deleted file mode 100644 index 0a7f3a39..00000000 --- a/framework/src/main/java/cn/lili/common/rocketmq/tags/GoodsTagsEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.lili.common.rocketmq.tags; - -/** - * @author paulG - * @since 2020/12/9 - **/ -public enum GoodsTagsEnum { - - GENERATOR_GOODS_INDEX("生成商品索引"), - GOODS_DELETE("删除商品"), - GOODS_AUDIT("审核商品"), - GOODS_COLLECTION("收藏商品"), - BUY_GOODS_COMPLETE("购买商品完成"), - SKU_DELETE("删除商品SKU"), - VIEW_GOODS("查看商品"), - GOODS_COMMENT_COMPLETE("商品评价"); - - private final String description; - - GoodsTagsEnum(String description) { - this.description = description; - } - - public String description() { - return description; - } - - -} diff --git a/framework/src/main/java/cn/lili/common/rocketmq/tags/MemberTagsEnum.java b/framework/src/main/java/cn/lili/common/rocketmq/tags/MemberTagsEnum.java deleted file mode 100644 index 1b26b23b..00000000 --- a/framework/src/main/java/cn/lili/common/rocketmq/tags/MemberTagsEnum.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.lili.common.rocketmq.tags; - -/** - * @author paulG - * @since 2020/12/9 - **/ -public enum MemberTagsEnum { - - MEMBER_REGISTER("会员注册"), - MEMBER_SING("会员签到"), - MEMBER_WITHDRAWAL("会员提现"), - MEMBER_POINT_CHANGE("会员积分变动"); - - private final String description; - - MemberTagsEnum(String description) { - this.description = description; - } - - public String description() { - return description; - } - - -} diff --git a/framework/src/main/java/cn/lili/common/security/AuthUser.java b/framework/src/main/java/cn/lili/common/security/AuthUser.java index 71e86fbd..cc384d19 100644 --- a/framework/src/main/java/cn/lili/common/security/AuthUser.java +++ b/framework/src/main/java/cn/lili/common/security/AuthUser.java @@ -2,7 +2,9 @@ package cn.lili.common.security; import cn.lili.common.security.enums.UserEnums; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; @@ -10,9 +12,13 @@ import java.io.Serializable; * @author Chopper */ @Data +@NoArgsConstructor @AllArgsConstructor +@Builder public class AuthUser implements Serializable { + private static final long serialVersionUID = 582441893336003319L; + /** * 用户名 */ @@ -23,6 +29,11 @@ public class AuthUser implements Serializable { */ private String nickName; + /** + * 头像 + */ + private String face; + /** * id */ @@ -44,6 +55,11 @@ public class AuthUser implements Serializable { * storeId */ private String storeId; + /** + * 如果角色是商家,则存在此店铺id字段 + * clerkId + */ + private String clerkId; /** * 如果角色是商家,则存在此店铺名称字段 @@ -56,18 +72,19 @@ public class AuthUser implements Serializable { */ private Boolean isSuper = false; - public AuthUser(String username, String id, String nickName, UserEnums role) { + /** + * 租户id + */ + private String tenantId; + + + public AuthUser(String username, String id, String nickName, String face, UserEnums role) { this.username = username; + this.face = face; this.id = id; this.role = role; this.nickName = nickName; } - public AuthUser(String username, String id, UserEnums manager, String nickName, Boolean isSuper) { - this.username = username; - this.id = id; - this.role = manager; - this.isSuper = isSuper; - this.nickName = nickName; - } + } diff --git a/framework/src/main/java/cn/lili/common/utils/OperationalJudgment.java b/framework/src/main/java/cn/lili/common/security/OperationalJudgment.java similarity index 68% rename from framework/src/main/java/cn/lili/common/utils/OperationalJudgment.java rename to framework/src/main/java/cn/lili/common/security/OperationalJudgment.java index bd8d02a8..c9a53675 100644 --- a/framework/src/main/java/cn/lili/common/utils/OperationalJudgment.java +++ b/framework/src/main/java/cn/lili/common/security/OperationalJudgment.java @@ -1,10 +1,11 @@ -package cn.lili.common.utils; +package cn.lili.common.security; -import cn.lili.common.enums.MessageCode; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.BeanUtil; + +import java.util.Objects; /** * 全局统一判定是否可操作某属性 @@ -13,30 +14,30 @@ import cn.lili.common.security.context.UserContext; * @version v1.0 * 2020-08-20 18:07 */ -public class OperationalJudgment { +public class OperationalJudgment { /** * 需要判定的对象必须包含属性 memberId,storeId 代表判定的角色 * * @param object 判定的对象 - * @param - * @return + * @param 判定处理对象 + * @return 处理结果 */ - public static t judgment(t object) { + public static T judgment(T object) { return judgment(object, "memberId", "storeId"); } /** * 需要判定的对象必须包含属性 memberId,storeId 代表判定的角色 * - * @param object - * @param buyerIdField - * @param storeIdField - * @param + * @param object 判定对象 + * @param buyerIdField 买家id + * @param storeIdField 店铺id + * @param 范型 * @return 返回判定本身,防止多次查询对象 */ - public static t judgment(t object, String buyerIdField, String storeIdField) { - AuthUser tokenUser = UserContext.getCurrentUser(); + public static T judgment(T object, String buyerIdField, String storeIdField) { + AuthUser tokenUser = Objects.requireNonNull(UserContext.getCurrentUser()); switch (tokenUser.getRole()) { case MANAGER: return object; @@ -52,7 +53,8 @@ public class OperationalJudgment { } else { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } + default: + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } - return object; } } diff --git a/framework/src/main/java/cn/lili/common/security/SecurityBean.java b/framework/src/main/java/cn/lili/common/security/SecurityBean.java index 5d186160..382426a0 100644 --- a/framework/src/main/java/cn/lili/common/security/SecurityBean.java +++ b/framework/src/main/java/cn/lili/common/security/SecurityBean.java @@ -7,6 +7,8 @@ import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import java.util.Collections; + /** * SecurityBean * @@ -19,8 +21,7 @@ public class SecurityBean { @Bean public BCryptPasswordEncoder passwordEncoder() { - BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); - return bCryptPasswordEncoder; + return new BCryptPasswordEncoder(); } /** @@ -33,7 +34,7 @@ public class SecurityBean { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); - config.addAllowedOrigin(CorsConfiguration.ALL); + config.setAllowedOriginPatterns(Collections.singletonList(CorsConfiguration.ALL)); config.addAllowedHeader(CorsConfiguration.ALL); config.addAllowedMethod(CorsConfiguration.ALL); source.registerCorsConfiguration("/**", config); diff --git a/framework/src/main/java/cn/lili/common/security/context/AuthenticationHandler.java b/framework/src/main/java/cn/lili/common/security/context/AuthenticationHandler.java deleted file mode 100644 index 0a7b8c55..00000000 --- a/framework/src/main/java/cn/lili/common/security/context/AuthenticationHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.lili.common.security.context; - -import cn.lili.common.security.AuthUser; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -/** - * 获取用户信息 处理 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/11/14 20:35 - */ -@Component -public class AuthenticationHandler { - - /** - * 获取当前用户信息 - * - * @return - */ - public AuthUser getAuthUser() { - //获取spring security 权限信息,如果token有权限,在这里就会得到内容 - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication == null) { - return null; - } - Object object = authentication.getDetails(); - if (object instanceof AuthUser) { - return (AuthUser) authentication.getDetails(); - } - return null; - } -} diff --git a/framework/src/main/java/cn/lili/common/security/context/UserContext.java b/framework/src/main/java/cn/lili/common/security/context/UserContext.java index 8c21c485..d2770bee 100644 --- a/framework/src/main/java/cn/lili/common/security/context/UserContext.java +++ b/framework/src/main/java/cn/lili/common/security/context/UserContext.java @@ -1,35 +1,55 @@ package cn.lili.common.security.context; -import cn.lili.common.cache.Cache; -import cn.lili.common.enums.MessageCode; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.enums.SecurityEnum; -import cn.lili.common.token.SecretKeyUtil; +import cn.lili.common.security.token.SecretKeyUtil; +import cn.lili.common.utils.StringUtils; import com.google.gson.Gson; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; /** * 用户上下文 * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/14 20:27 */ public class UserContext { - private static AuthenticationHandler authenticationHandler; - - public static void setHolder(AuthenticationHandler authenticationHandler) { - UserContext.authenticationHandler = authenticationHandler; + /** + * 根据request获取用户信息 + * + * @return 授权用户 + */ + public static AuthUser getCurrentUser() { + if (RequestContextHolder.getRequestAttributes() != null) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String accessToken = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); + return getAuthUser(accessToken); + } + return null; } - - public static AuthUser getCurrentUser() { - return authenticationHandler.getAuthUser(); + /** + * 根据request获取用户信息 + * + * @return 授权用户 + */ + public static String getUuid() { + if (RequestContextHolder.getRequestAttributes() != null) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + return request.getHeader(SecurityEnum.UUID.getValue()); + } + return null; } @@ -38,13 +58,38 @@ public class UserContext { * * @param cache 缓存 * @param accessToken token - * @return + * @return 授权用户 */ public static AuthUser getAuthUser(Cache cache, String accessToken) { try { - if (cache.keys("*" + accessToken).size() == 0) { + AuthUser authUser = getAuthUser(accessToken); + assert authUser != null; + + if (!cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole(), authUser.getId()) + accessToken)) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } + return authUser; + } catch (Exception e) { + return null; + } + } + + public static String getCurrentUserToken() { + if (RequestContextHolder.getRequestAttributes() != null) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + return request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); + } + return null; + } + + /** + * 根据jwt获取token重的用户信息 + * + * @param accessToken token + * @return 授权用户 + */ + public static AuthUser getAuthUser(String accessToken) { + try { //获取token的信息 Claims claims = Jwts.parser() @@ -57,4 +102,21 @@ public class UserContext { return null; } } + + + /** + * 写入邀请人信息 + */ + public static void settingInviter(String memberId, Cache cache) { + if (RequestContextHolder.getRequestAttributes() != null) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + //邀请人id + String inviterId = request.getHeader(SecurityEnum.INVITER.getValue()); + if (StringUtils.isNotEmpty(inviterId)) { + cache.put(CachePrefix.INVITER.getPrefix() + memberId, inviterId); + } + } + } + + } diff --git a/framework/src/main/java/cn/lili/common/security/context/UserContextInit.java b/framework/src/main/java/cn/lili/common/security/context/UserContextInit.java deleted file mode 100644 index eb9ff50e..00000000 --- a/framework/src/main/java/cn/lili/common/security/context/UserContextInit.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.lili.common.security.context; - -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -/** - * 给予用户上下文,初始化参数 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/11/14 20:30 - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class UserContextInit implements ApplicationRunner { - - /** - * 用户信息holder,认证信息的获取者 - */ - private final AuthenticationHandler authenticationHandler; - - /** - * 在项目加载时指定认证信息获取者 - * 默认是由spring 安全上下文中获取 - * - * @param args - * @throws Exception - */ - @Override - public void run(ApplicationArguments args) { - UserContext.setHolder(authenticationHandler); - } -} diff --git a/framework/src/main/java/cn/lili/common/token/PermissionEnum.java b/framework/src/main/java/cn/lili/common/security/enums/PermissionEnum.java similarity index 80% rename from framework/src/main/java/cn/lili/common/token/PermissionEnum.java rename to framework/src/main/java/cn/lili/common/security/enums/PermissionEnum.java index be6e1d28..a9007eb9 100644 --- a/framework/src/main/java/cn/lili/common/token/PermissionEnum.java +++ b/framework/src/main/java/cn/lili/common/security/enums/PermissionEnum.java @@ -1,11 +1,10 @@ -package cn.lili.common.token; +package cn.lili.common.security.enums; /** * 权限枚举值 * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/25 09:21 */ diff --git a/framework/src/main/java/cn/lili/common/security/enums/SecurityEnum.java b/framework/src/main/java/cn/lili/common/security/enums/SecurityEnum.java index 4d27d941..ad49e685 100644 --- a/framework/src/main/java/cn/lili/common/security/enums/SecurityEnum.java +++ b/framework/src/main/java/cn/lili/common/security/enums/SecurityEnum.java @@ -10,7 +10,7 @@ public enum SecurityEnum { /** * 存在与header中的token参数头 名 */ - HEADER_TOKEN("accessToken"), USER_CONTEXT("userContext"), JWT_SECRET("secret"); + HEADER_TOKEN("accessToken"), USER_CONTEXT("userContext"), JWT_SECRET("secret"), UUID("uuid"), INVITER("inviter"); String value; diff --git a/framework/src/main/java/cn/lili/common/security/enums/UserEnums.java b/framework/src/main/java/cn/lili/common/security/enums/UserEnums.java index cb30323c..919b6693 100644 --- a/framework/src/main/java/cn/lili/common/security/enums/UserEnums.java +++ b/framework/src/main/java/cn/lili/common/security/enums/UserEnums.java @@ -5,7 +5,6 @@ package cn.lili.common.security.enums; * * @author Chopper * @version v1.0 - * @Description: * @since 2020/8/18 15:23 */ public enum UserEnums { @@ -15,7 +14,8 @@ public enum UserEnums { MEMBER("会员"), STORE("商家"), MANAGER("管理员"), - SYSTEM("系统"); + SYSTEM("系统"), + SEAT("坐席"); private final String role; UserEnums(String role) { diff --git a/framework/src/main/java/cn/lili/common/security/filter/XssFilter.java b/framework/src/main/java/cn/lili/common/security/filter/XssFilter.java new file mode 100644 index 00000000..ead0a2b1 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/security/filter/XssFilter.java @@ -0,0 +1,39 @@ +package cn.lili.common.security.filter; + + +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * 防止XSS攻击过滤器 + * + * @author Chopper + * @version v1.0 + * 2021-06-04 10:37 + */ +@WebFilter +@Component +public class XssFilter implements Filter { + FilterConfig filterConfig = null; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + //对请求进行拦截,防xss处理 + chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response); + } + + @Override + public void destroy() { + this.filterConfig = null; + } +} diff --git a/framework/src/main/java/cn/lili/common/security/filter/XssHttpServletRequestWrapper.java b/framework/src/main/java/cn/lili/common/security/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 00000000..30e76d5e --- /dev/null +++ b/framework/src/main/java/cn/lili/common/security/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,281 @@ +package cn.lili.common.security.filter; + + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.http.HtmlUtil; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.owasp.html.HtmlPolicyBuilder; +import org.owasp.html.PolicyFactory; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 防止Xss + * + * @author Chopper + * @version v1.0 + * 2021-06-04 10:39 + */ +@Slf4j +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { + + //允许的标签 + private static final String[] allowedTags = {"h1", "h2", "h3", "h4", "h5", "h6", + "span", "strong", + "img", "video", "source", "iframe", "code", + "blockquote", "p", "div", + "ul", "ol", "li", + "table", "thead", "caption", "tbody", "tr", "th", "td", "br", + "a" + }; + + //需要转化的标签 + private static final String[] needTransformTags = {"article", "aside", "command", "datalist", "details", "figcaption", "figure", + "footer", "header", "hgroup", "section", "summary"}; + + //带有超链接的标签 + private static final String[] linkTags = {"img", "video", "source", "a", "iframe", "p"}; + + //带有超链接的标签 + private static final String[] allowAttributes = {"style", "src", "href", "target", "width", "height"}; + + public XssHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + } + + /** + * 对数组参数进行特殊字符过滤 + */ + @Override + public String[] getParameterValues(String name) { + String[] values = super.getParameterValues(name); + if (values == null) { + return new String[0]; + } + int count = values.length; + String[] encodedValues = new String[count]; + for (int i = 0; i < count; i++) { + encodedValues[i] = filterXss(name, values[i]); + } + return encodedValues; + } + + /** + * 对参数中特殊字符进行过滤 + */ + @Override + public String getParameter(String name) { + String value = super.getParameter(name); + if (value == null) { + return null; + } + return filterXss(name, value); + } + + /** + * 获取attribute,特殊字符过滤 + */ + @Override + public Object getAttribute(String name) { + Object value = super.getAttribute(name); + if (value instanceof String) { + value = filterXss(name, (String) value); + } + return value; + } + + /** + * 对请求头部进行特殊字符过滤 + */ + @Override + public String getHeader(String name) { + String value = super.getHeader(name); + if (value == null) { + return null; + } + return filterXss(name, value); + } + + @Override + public Map getParameterMap() { + Map parameterMap = super.getParameterMap(); + //因为super.getParameterMap()返回的是Map,所以我们需要定义Map的实现类对数据进行封装 + Map params = new LinkedHashMap<>(); + //如果参数不为空 + if (parameterMap != null) { + //对map进行遍历 + for (Map.Entry entry : parameterMap.entrySet()) { + //根据key获取value + String[] values = entry.getValue(); + //遍历数组 + for (int i = 0; i < values.length; i++) { + String value = values[i]; + value = filterXss(entry.getKey(), value); + //将转义后的数据放回数组中 + values[i] = value; + } + + //将转义后的数组put到linkMap当中 + params.put(entry.getKey(), values); + } + } + return params; + } + + /** + * 获取输入流 + * + * @return 过滤后的输入流 + * @throws IOException 异常信息 + */ + @Override + public ServletInputStream getInputStream() throws IOException { + + BufferedReader bufferedReader = null; + + InputStreamReader reader = null; + + //获取输入流 + ServletInputStream in = null; + try { + in = super.getInputStream(); + //用于存储输入流 + StringBuilder body = new StringBuilder(); + reader = new InputStreamReader(in, StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(reader); + //按行读取输入流 + String line = bufferedReader.readLine(); + while (line != null) { + //将获取到的第一行数据append到StringBuffer中 + body.append(line); + //继续读取下一行流,直到line为空 + line = bufferedReader.readLine(); + } + if (CharSequenceUtil.isNotEmpty(body) && Boolean.TRUE.equals(JSONUtil.isJsonObj(body.toString()))) { + //将body转换为map + Map map = JSONUtil.parseObj(body.toString()); + //创建空的map用于存储结果 + Map resultMap = new HashMap<>(map.size()); + //遍历数组 + for (Map.Entry entry : map.entrySet()) { + //如果map.get(key)获取到的是字符串就需要进行处理,如果不是直接存储resultMap + if (map.get(entry.getKey()) instanceof String) { + resultMap.put(entry.getKey(), filterXss(entry.getKey(), entry.getValue().toString())); + } else { + resultMap.put(entry.getKey(), entry.getValue()); + } + } + + //将resultMap转换为json字符串 + String resultStr = JSONUtil.toJsonStr(resultMap); + //将json字符串转换为字节 + final ByteArrayInputStream resultBIS = new ByteArrayInputStream(resultStr.getBytes(StandardCharsets.UTF_8)); + + //实现接口 + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + + @Override + public int read() { + return resultBIS.read(); + } + }; + } + + //将json字符串转换为字节 + final ByteArrayInputStream bis = new ByteArrayInputStream(body.toString().getBytes()); + //实现接口 + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + + @Override + public int read() { + return bis.read(); + } + }; + } catch (Exception e) { + + log.error("get request inputStream error", e); + return null; + } finally { + //关闭流 + if (bufferedReader != null) { + bufferedReader.close(); + } + if (reader != null) { + reader.close(); + } + if (in != null) { + in.close(); + } + } + + } + + private String cleanXSS(String value) { + if (value != null) { + // 自定义策略 + PolicyFactory policy = new HtmlPolicyBuilder() + .allowStandardUrlProtocols() + //所有允许的标签 + .allowElements(allowedTags) + //内容标签转化为div + .allowElements((elementName, attributes) -> "div", needTransformTags) + .allowAttributes(allowAttributes).onElements(linkTags) + .allowStyling() + .toFactory(); + // basic prepackaged policies for links, tables, integers, images, styles, blocks + value = policy.sanitize(value); + } + return HtmlUtil.unescape(value); + } + + /** + * 过滤xss + * + * @param name 参数名 + * @param value 参数值 + * @return 参数值 + */ + private String filterXss(String name, String value) { + return cleanXSS(value); + } + +} diff --git a/framework/src/main/java/cn/lili/common/security/sensitive/Sensitive.java b/framework/src/main/java/cn/lili/common/security/sensitive/Sensitive.java new file mode 100644 index 00000000..f8318d6b --- /dev/null +++ b/framework/src/main/java/cn/lili/common/security/sensitive/Sensitive.java @@ -0,0 +1,27 @@ +package cn.lili.common.security.sensitive; + +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * 敏感注解 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2021/9/10 16:45 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = SensitiveJsonSerializer.class) +public @interface Sensitive { + SensitiveStrategy strategy(); +} diff --git a/framework/src/main/java/cn/lili/common/security/sensitive/SensitiveJsonSerializer.java b/framework/src/main/java/cn/lili/common/security/sensitive/SensitiveJsonSerializer.java new file mode 100644 index 00000000..86ebd462 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/security/sensitive/SensitiveJsonSerializer.java @@ -0,0 +1,93 @@ +package cn.lili.common.security.sensitive; + +import cn.lili.common.properties.SystemSettingProperties; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import java.io.IOException; +import java.util.Objects; + +/** + * 敏感信息序列化时 过滤 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2021/9/10 16:46 + */ +public class SensitiveJsonSerializer extends JsonSerializer + implements ContextualSerializer, ApplicationContextAware { + private SensitiveStrategy strategy; + + //系统配置 + private SystemSettingProperties systemSettingProperties; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // 字段序列化处理 + gen.writeString(strategy.desensitizer().apply(value)); + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { + + // 判定是否 需要脱敏处理 + if (desensitization()) { + //获取敏感枚举 + Sensitive annotation = property.getAnnotation(Sensitive.class); + //如果有敏感注解,则加入脱敏规则 + if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { + this.strategy = annotation.strategy(); + return this; + } + } + return prov.findValueSerializer(property.getType(), property); + + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + systemSettingProperties = applicationContext.getBean(SystemSettingProperties.class); + } + + /** + * 是否需要脱敏处理 + * + * @return + */ + private boolean desensitization() { + + //当前用户 + AuthUser authUser = UserContext.getCurrentUser(); + //默认脱敏 + if (authUser == null) { + return false; + } + + //如果是店铺 + if (authUser.getRole().equals(UserEnums.STORE)) { + //店铺需要进行脱敏,则脱敏处理 + return systemSettingProperties.getSensitiveLevel() == 2; + } + + + //如果是店铺 + if (authUser.getRole().equals(UserEnums.MANAGER)) { + //店铺需要进行脱敏,则脱敏处理 + return systemSettingProperties.getSensitiveLevel() >= 1; + } + + return false; + } +} diff --git a/framework/src/main/java/cn/lili/common/security/sensitive/enums/SensitiveStrategy.java b/framework/src/main/java/cn/lili/common/security/sensitive/enums/SensitiveStrategy.java new file mode 100644 index 00000000..5bfe5035 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/security/sensitive/enums/SensitiveStrategy.java @@ -0,0 +1,50 @@ +package cn.lili.common.security.sensitive.enums; + +import java.util.function.Function; + +/** + * 敏感策略枚举 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2021/9/10 16:46 + */ + +public enum SensitiveStrategy { + /** + * Username sensitive strategy. + */ + USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")), + /** + * Id card sensitive type. + */ + ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")), + /** + * Phone sensitive type. + */ + PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")), + /** + * Email sensitive type. + */ + EMAIL(s -> s.replaceAll("(^\\w)[^@]*(@.*$)", "$1****$2")), + /** + * Name sensitive type. + */ + NAME(s -> s.replaceAll("^(.{3}).+(.{3})$", "$1*****$2")), + /** + * Address sensitive type. + */ + ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****")); + + + private final Function desensitizer; + + SensitiveStrategy(Function desensitizer) { + this.desensitizer = desensitizer; + } + + public Function desensitizer() { + return desensitizer; + } +} diff --git a/framework/src/main/java/cn/lili/common/token/SecretKeyUtil.java b/framework/src/main/java/cn/lili/common/security/token/SecretKeyUtil.java similarity index 70% rename from framework/src/main/java/cn/lili/common/token/SecretKeyUtil.java rename to framework/src/main/java/cn/lili/common/security/token/SecretKeyUtil.java index d5e4d9a8..e111526c 100644 --- a/framework/src/main/java/cn/lili/common/token/SecretKeyUtil.java +++ b/framework/src/main/java/cn/lili/common/security/token/SecretKeyUtil.java @@ -1,8 +1,8 @@ -package cn.lili.common.token; +package cn.lili.common.security.token; -import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; +import org.apache.commons.codec.binary.Base64; import javax.crypto.SecretKey; @@ -15,8 +15,9 @@ import javax.crypto.SecretKey; */ public class SecretKeyUtil { public static SecretKey generalKey() { - byte[] encodedKey = Base64.decodeBase64("cuAihCz53DZRjZwbsGcZJ2Ai6At+T142uphtJMsk7iQ=");//自定义 - javax.crypto.SecretKey key = Keys.hmacShaKeyFor(encodedKey); + //自定义 + byte[] encodedKey = Base64.decodeBase64("cuAihCz53DZRjZwbsGcZJ2Ai6At+T142uphtJMsk7iQ="); + SecretKey key = Keys.hmacShaKeyFor(encodedKey); return key; } diff --git a/framework/src/main/java/cn/lili/common/token/Token.java b/framework/src/main/java/cn/lili/common/security/token/Token.java similarity index 87% rename from framework/src/main/java/cn/lili/common/token/Token.java rename to framework/src/main/java/cn/lili/common/security/token/Token.java index 94be6fb3..81286345 100644 --- a/framework/src/main/java/cn/lili/common/token/Token.java +++ b/framework/src/main/java/cn/lili/common/security/token/Token.java @@ -1,4 +1,4 @@ -package cn.lili.common.token; +package cn.lili.common.security.token; import lombok.Data; diff --git a/framework/src/main/java/cn/lili/common/token/TokenUtil.java b/framework/src/main/java/cn/lili/common/security/token/TokenUtil.java similarity index 62% rename from framework/src/main/java/cn/lili/common/token/TokenUtil.java rename to framework/src/main/java/cn/lili/common/security/token/TokenUtil.java index a0a2830c..ce8a9182 100644 --- a/framework/src/main/java/cn/lili/common/token/TokenUtil.java +++ b/framework/src/main/java/cn/lili/common/security/token/TokenUtil.java @@ -1,17 +1,16 @@ -package cn.lili.common.token; +package cn.lili.common.security.token; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.JWTTokenProperties; import cn.lili.common.security.AuthUser; import cn.lili.common.security.enums.SecurityEnum; import cn.lili.common.security.enums.UserEnums; -import cn.lili.config.properties.JWTTokenProperties; import com.google.gson.Gson; import io.jsonwebtoken.*; import io.jsonwebtoken.security.SignatureException; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,33 +25,30 @@ import java.util.concurrent.TimeUnit; * 2020-11-12 18:44 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class TokenUtil { - - private final JWTTokenProperties tokenProperties; - - private final Cache cache; + @Autowired + private JWTTokenProperties tokenProperties; + @Autowired + private Cache cache; /** * 构建token * - * @param username 主体 - * @param claim 私有声明 - * @param longTerm 长时间特殊token 如:移动端,微信小程序等 - * @return + * @param authUser 私有声明 + * @return TOKEN */ - public Token createToken(String username, Object claim, boolean longTerm, UserEnums userEnums) { + public Token createToken(AuthUser authUser) { Token token = new Token(); //访问token - String accessToken = createToken(username, claim, tokenProperties.getTokenExpireTime()); + String accessToken = createToken(authUser, tokenProperties.getTokenExpireTime()); - cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + accessToken, 1, + cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole(), authUser.getId()) + accessToken, 1, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); //刷新token生成策略:如果是长时间有效的token(用于app),则默认15天有效期刷新token。如果是普通用户登录,则刷新token为普通token2倍数 - Long expireTime = longTerm ? 15 * 24 * 60L : tokenProperties.getTokenExpireTime() * 2; - String refreshToken = createToken(username, claim, expireTime); + Long expireTime = authUser.getLongTerm() ? 15 * 24 * 60L : tokenProperties.getTokenExpireTime() * 2; + String refreshToken = createToken(authUser, expireTime); - cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + refreshToken, 1, expireTime, TimeUnit.MINUTES); + cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(authUser.getRole(), authUser.getId()) + refreshToken, 1, expireTime, TimeUnit.MINUTES); token.setAccessToken(accessToken); token.setRefreshToken(refreshToken); @@ -65,14 +61,15 @@ public class TokenUtil { * @param oldRefreshToken 刷新token * @return token */ - public Token refreshToken(String oldRefreshToken, UserEnums userEnums) { + public Token refreshToken(String oldRefreshToken) { Claims claims; try { claims = Jwts.parser() .setSigningKey(SecretKeyUtil.generalKeyByDecoders()) .parseClaimsJws(oldRefreshToken).getBody(); - } catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) { + } catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | + IllegalArgumentException e) { //token 过期 认证失败等 throw new ServiceException(ResultCode.USER_AUTH_EXPIRED); } @@ -80,7 +77,7 @@ public class TokenUtil { //获取存储在claims中的用户信息 String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString(); AuthUser authUser = new Gson().fromJson(json, AuthUser.class); - + UserEnums userEnums = authUser.getRole(); String username = authUser.getUsername(); //获取是否长期有效的token @@ -88,25 +85,27 @@ public class TokenUtil { //如果缓存中有刷新token && - if (cache.hasKey(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + oldRefreshToken)) { + if (cache.hasKey(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) + oldRefreshToken)) { Token token = new Token(); //访问token - String accessToken = createToken(username, authUser, tokenProperties.getTokenExpireTime()); - cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + accessToken, 1, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); + String accessToken = createToken(authUser, tokenProperties.getTokenExpireTime()); + cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums, authUser.getId()) + accessToken, 1, tokenProperties.getTokenExpireTime(), + TimeUnit.MINUTES); //如果是信任登录设备,则刷新token长度继续延长 Long expirationTime = tokenProperties.getTokenExpireTime() * 2; if (longTerm) { expirationTime = 60 * 24 * 15L; + authUser.setLongTerm(true); } //刷新token生成策略:如果是长时间有效的token(用于app),则默认15天有效期刷新token。如果是普通用户登录,则刷新token为普通token2倍数 - String refreshToken = createToken(username, authUser, expirationTime); + String refreshToken = createToken(authUser, expirationTime); - cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + refreshToken, 1, expirationTime, TimeUnit.MINUTES); + cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) + refreshToken, 1, expirationTime, TimeUnit.MINUTES); token.setAccessToken(accessToken); token.setRefreshToken(refreshToken); - cache.remove(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + oldRefreshToken); + cache.remove(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) + oldRefreshToken); return token; } else { throw new ServiceException(ResultCode.USER_AUTH_EXPIRED); @@ -117,21 +116,20 @@ public class TokenUtil { /** * 生成token * - * @param username 主体 - * @param claim 私有神明内容 + * @param authUser jwt主体对象 * @param expirationTime 过期时间(分钟) - * @return + * @return token字符串 */ - private String createToken(String username, Object claim, Long expirationTime) { - // JWT 生成 + private String createToken(AuthUser authUser, Long expirationTime) { + //JWT 生成 return Jwts.builder() - // jwt 私有声明 - .claim(SecurityEnum.USER_CONTEXT.getValue(), new Gson().toJson(claim)) - // JWT的主体 - .setSubject(username) - // 失效时间 当前时间+过期分钟 + //jwt 私有声明 + .claim(SecurityEnum.USER_CONTEXT.getValue(), new Gson().toJson(authUser)) + //JWT的主体 + .setSubject(authUser.getUsername()) + //失效时间 当前时间+过期分钟 .setExpiration(new Date(System.currentTimeMillis() + expirationTime * 60 * 1000)) - // 签名算法和密钥 + //签名算法和密钥 .signWith(SecretKeyUtil.generalKey()) .compact(); } diff --git a/framework/src/main/java/cn/lili/common/token/base/AbstractTokenGenerate.java b/framework/src/main/java/cn/lili/common/security/token/base/AbstractTokenGenerate.java similarity index 66% rename from framework/src/main/java/cn/lili/common/token/base/AbstractTokenGenerate.java rename to framework/src/main/java/cn/lili/common/security/token/base/AbstractTokenGenerate.java index ff22fd0c..2002baa7 100644 --- a/framework/src/main/java/cn/lili/common/token/base/AbstractTokenGenerate.java +++ b/framework/src/main/java/cn/lili/common/security/token/base/AbstractTokenGenerate.java @@ -1,7 +1,7 @@ -package cn.lili.common.token.base; +package cn.lili.common.security.token.base; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.token.Token; +import cn.lili.common.security.token.Token; /** * AbstractToken @@ -11,16 +11,16 @@ import cn.lili.common.token.Token; * @version v1.0 * 2020-11-13 10:13 */ -public abstract class AbstractTokenGenerate { +public abstract class AbstractTokenGenerate { /** * 生成token * - * @param username 用户名 + * @param user 用户名 * @param longTerm 是否长时间有效 - * @return + * @return TOKEN对象 */ - public abstract Token createToken(String username, Boolean longTerm); + public abstract Token createToken(T user, Boolean longTerm); /** * 刷新token diff --git a/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsFilter.java b/framework/src/main/java/cn/lili/common/sensitive/SensitiveWordsFilter.java similarity index 65% rename from framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsFilter.java rename to framework/src/main/java/cn/lili/common/sensitive/SensitiveWordsFilter.java index 42e422fa..99acf87e 100644 --- a/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsFilter.java +++ b/framework/src/main/java/cn/lili/common/sensitive/SensitiveWordsFilter.java @@ -1,13 +1,6 @@ -package cn.lili.modules.system.utils; +package cn.lili.common.sensitive; -import cn.lili.modules.system.entity.dos.SensitiveWords; -import cn.lili.modules.system.service.SensitiveWordsService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; -import org.thymeleaf.util.ListUtils; +import lombok.extern.slf4j.Slf4j; import java.io.Serializable; import java.util.List; @@ -21,10 +14,13 @@ import java.util.NavigableSet; * @since v1.0 * 2020-02-25 14:10:16 */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SensitiveWordsFilter implements Serializable, ApplicationRunner { +@Slf4j +public class SensitiveWordsFilter implements Serializable { + /** + * 字符* + */ + public final static char WILDCARD_STAR = '*'; /** * 为2的n次方,考虑到敏感词大概在10k左右, @@ -38,113 +34,40 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner { * 类似HashMap的桶,比较稀疏。 * 使用2个字符的hash定位。 */ - protected static SensitiveWordsNode[] nodes; + protected static SensitiveWordsNode[] nodes = new SensitiveWordsNode[0]; - private final SensitiveWordsService sensitiveWordsService; + /** + * 更新中的nodes,用于防止动态更新时,原有nodes被清空,导致无法正常写入过滤词 + */ + protected static SensitiveWordsNode[] nodesUpdate; /** - * 增加一个敏感词,如果词的长度(trim后)小于2,则丢弃
- * 此方法(构建)并不是主要的性能优化点。 + * 过滤铭感次 * - * @param word + * @param sentence 过滤赐予 * @return */ - public static boolean put(String word) { - - // 长度小于2的不加入 - if (word == null || word.trim().length() < 2) { - return false; - } - // 两个字符的不考虑 - if (word.length() == 2 && word.matches("\\w\\w")) { - return false; - } - StringPointer sp = new StringPointer(word.trim()); - // 计算头两个字符的hash - int hash = sp.nextTwoCharHash(0); - // 计算头两个字符的mix表示(mix相同,两个字符相同) - int mix = sp.nextTwoCharMix(0); - // 转为在hash桶中的位置 - int index = hash & (nodes.length - 1); - - // 从桶里拿第一个节点 - SensitiveWordsNode node = nodes[index]; - if (node == null) { - // 如果没有节点,则放进去一个 - node = new SensitiveWordsNode(mix); - // 并添加词 - node.words.add(sp); - // 放入桶里 - nodes[index] = node; - } else { - // 如果已经有节点(1个或多个),找到正确的节点 - for (; node != null; node = node.next) { - // 匹配节点 - if (node.headTwoCharMix == mix) { - node.words.add(sp); - return true; - } - // 如果匹配到最后仍然不成功,则追加一个节点 - if (node.next == null) { - new SensitiveWordsNode(mix, node).words.add(sp); - return true; - } - } - } - return true; - } - - /** - * 移除敏感词 - * - * @param word - * @return - */ - public static boolean remove(String word) { - - StringPointer sp = new StringPointer(word.trim()); - // 计算头两个字符的hash - int hash = sp.nextTwoCharHash(0); - // 计算头两个字符的mix表示(mix相同,两个字符相同) - int mix = sp.nextTwoCharMix(0); - // 转为在hash桶中的位置 - int index = hash & (nodes.length - 1); - SensitiveWordsNode node = nodes[index]; - - for (; node != null; node = node.next) { - // 匹配节点 - if (node.headTwoCharMix == mix) { - node.words.remove(sp); - return true; - } - - } - return true; - + public static String filter(String sentence) { + return filter(sentence, WILDCARD_STAR); } /** * 对句子进行敏感词过滤
- * 如果无敏感词返回输入的sentence对象,即可以用下面的方式判断是否有敏感词:
- * String result = filter.filter(sentence, CharacterConstant.WILDCARD_STAR);
- * if(result != sentence){
- *   // 有敏感词
- * } - *
+ * 如果无敏感词返回输入的sentence对象,即可以用下面的方式判断是否有敏感词:
* * @param sentence 句子 * @param replace 敏感词的替换字符 * @return 过滤后的句子 */ public static String filter(String sentence, char replace) { - // 先转换为StringPointer + //先转换为StringPointer StringPointer sp = new StringPointer(sentence + " "); - // 标示是否替换 + //标示是否替换 boolean replaced = false; - // 匹配的起始位置 + //匹配的起始位置 int i = 0; while (i < sp.length - 2) { /* @@ -152,8 +75,13 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner { * 如果未匹配为1,如果匹配是匹配的词长度 */ int step = 1; - // 计算此位置开始2个字符的hash + //计算此位置开始2个字符的hash int hash = sp.nextTwoCharHash(i); + + //如果没有敏感词,则直接返回内容 + if (nodes.length == 0) { + return sentence; + } /* * 根据hash获取第一个节点, * 真正匹配的节点可能不是第一个, @@ -198,13 +126,13 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner { * 仍然能够取到word为"色情电影",但是不该匹配。 */ if (sp.nextStartsWith(i, word)) { - // 匹配成功,将匹配的部分,用replace制定的内容替代 + //匹配成功,将匹配的部分,用replace制定的内容替代 sp.fill(i, i + word.length, replace); - // 跳过已经替代的部分 + //跳过已经替代的部分 step = word.length; - // 标示有替换 + //标示有替换 replaced = true; - // 跳出循环(然后是while循环的下一个位置) + //跳出循环(然后是while循环的下一个位置) break outer; } } @@ -214,11 +142,11 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner { } } - // 移动到下一个匹配位置 + //移动到下一个匹配位置 i += step; } - // 如果没有替换,直接返回入参(节约String的构造copy) + //如果没有替换,直接返回入参(节约String的构造copy) if (replaced) { String res = sp.toString(); return res.substring(0, res.length() - 2); @@ -227,27 +155,96 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner { } } + /** * 初始化敏感词 - * - * @param args - * @throws Exception */ - @Override - public void run(ApplicationArguments args) { - try { - nodes = new SensitiveWordsNode[DEFAULT_INITIAL_CAPACITY]; - //加入平台添加的敏感词 - List list = sensitiveWordsService.list(); - if (ListUtils.isEmpty(list)) { - for (SensitiveWords sensitiveWords : list) { - put(sensitiveWords.getSensitiveWord()); + public static void init(List words) { + log.info("开始初始化敏感词"); + nodesUpdate = new SensitiveWordsNode[DEFAULT_INITIAL_CAPACITY]; + for (String word : words) { + put(word); + } + nodes = nodesUpdate; + } + + /** + * 增加一个敏感词,如果词的长度(trim后)小于2,则丢弃
+ * 此方法(构建)并不是主要的性能优化点。 + * + * @param word 敏感词 + * @return 操作结果 + */ + public static boolean put(String word) { + + //长度小于2的不加入 + if (word == null || word.trim().length() < 2) { + return false; + } + //两个字符的不考虑 + if (word.length() == 2 && word.matches("\\w\\w")) { + return false; + } + StringPointer sp = new StringPointer(word.trim()); + //计算头两个字符的hash + int hash = sp.nextTwoCharHash(0); + //计算头两个字符的mix表示(mix相同,两个字符相同) + int mix = sp.nextTwoCharMix(0); + //转为在hash桶中的位置 + int index = hash & (nodesUpdate.length - 1); + + //从桶里拿第一个节点 + SensitiveWordsNode node = nodesUpdate[index]; + if (node == null) { + //如果没有节点,则放进去一个 + node = new SensitiveWordsNode(mix); + //并添加词 + node.words.add(sp); + //放入桶里 + nodesUpdate[index] = node; + } else { + //如果已经有节点(1个或多个),找到正确的节点 + for (; node != null; node = node.next) { + //匹配节点 + if (node.headTwoCharMix == mix) { + node.words.add(sp); + return true; + } + //如果匹配到最后仍然不成功,则追加一个节点 + if (node.next == null) { + new SensitiveWordsNode(mix, node).words.add(sp); + return true; } } - } catch (Exception e) { - e.printStackTrace(); } - - + return true; } + + /** + * 移除敏感词 + * + * @param word + * @return + */ + public static void remove(String word) { + + StringPointer sp = new StringPointer(word.trim()); + //计算头两个字符的hash + int hash = sp.nextTwoCharHash(0); + //计算头两个字符的mix表示(mix相同,两个字符相同) + int mix = sp.nextTwoCharMix(0); + //转为在hash桶中的位置 + int index = hash & (nodes.length - 1); + SensitiveWordsNode node = nodes[index]; + + for (; node != null; node = node.next) { + //匹配节点 + if (node.headTwoCharMix == mix) { + node.words.remove(sp); + } + + } + } + + } diff --git a/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsNode.java b/framework/src/main/java/cn/lili/common/sensitive/SensitiveWordsNode.java similarity index 95% rename from framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsNode.java rename to framework/src/main/java/cn/lili/common/sensitive/SensitiveWordsNode.java index 7932b773..aa3131f9 100644 --- a/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsNode.java +++ b/framework/src/main/java/cn/lili/common/sensitive/SensitiveWordsNode.java @@ -1,4 +1,4 @@ -package cn.lili.modules.system.utils; +package cn.lili.common.sensitive; import java.io.Serializable; import java.util.TreeSet; diff --git a/framework/src/main/java/cn/lili/modules/system/utils/StringPointer.java b/framework/src/main/java/cn/lili/common/sensitive/StringPointer.java similarity index 68% rename from framework/src/main/java/cn/lili/modules/system/utils/StringPointer.java rename to framework/src/main/java/cn/lili/common/sensitive/StringPointer.java index b797da0b..7e9e98f5 100644 --- a/framework/src/main/java/cn/lili/modules/system/utils/StringPointer.java +++ b/framework/src/main/java/cn/lili/common/sensitive/StringPointer.java @@ -1,13 +1,14 @@ -package cn.lili.modules.system.utils; +package cn.lili.common.sensitive; import java.io.Serializable; /** + * 字符指针 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ -public class StringPointer implements Serializable, CharSequence, Comparable{ +public class StringPointer implements Serializable, CharSequence, Comparable { private static final long serialVersionUID = 1L; @@ -19,13 +20,13 @@ public class StringPointer implements Serializable, CharSequence, Comparable length - i){ + public boolean nextStartsWith(int i, StringPointer word) { + //是否长度超出 + if (word.length > length - i) { return false; } - // 从尾开始判断 - for(int c = word.length - 1; c >= 0; c --){ - if(value[offset + i + c] != word.value[word.offset + c]){ + //从尾开始判断 + for (int c = word.length - 1; c >= 0; c--) { + if (value[offset + i + c] != word.value[word.offset + c]) { return false; } } @@ -76,31 +78,31 @@ public class StringPointer implements Serializable, CharSequence, Comparable> cache; + + /** + * 程序启动时,获取最新的需要过滤的敏感词 + *

+ * 这里即便缓存中为空也没关系,定时任务会定时重新加载敏感词 + * + * @param args 启动参数 + */ + @Override + public void run(ApplicationArguments args) { + List sensitives = cache.get(CachePrefix.SENSITIVE.getPrefix()); + log.info("系统初始化敏感词"); + if (sensitives == null || sensitives.isEmpty()) { + return; + } + SensitiveWordsFilter.init(sensitives); + } + +} diff --git a/framework/src/main/java/cn/lili/common/sensitive/quartz/QuartzConfig.java b/framework/src/main/java/cn/lili/common/sensitive/quartz/QuartzConfig.java new file mode 100644 index 00000000..85e1d75a --- /dev/null +++ b/framework/src/main/java/cn/lili/common/sensitive/quartz/QuartzConfig.java @@ -0,0 +1,32 @@ +package cn.lili.common.sensitive.quartz; + +import org.quartz.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 定时执行配置 + * + * @author Chopper + * @version v1.0 + * 2021-11-23 16:30 + */ +@Configuration +public class QuartzConfig { + + @Bean + public JobDetail sensitiveQuartzDetail() { + return JobBuilder.newJob(SensitiveQuartz.class).withIdentity("sensitiveQuartz").storeDurably().build(); + } + + @Bean + public Trigger sensitiveQuartzTrigger() { + SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() + .withIntervalInSeconds(3600) + .repeatForever(); + return TriggerBuilder.newTrigger().forJob(sensitiveQuartzDetail()) + .withIdentity("sensitiveQuartz") + .withSchedule(scheduleBuilder) + .build(); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/sensitive/quartz/SensitiveQuartz.java b/framework/src/main/java/cn/lili/common/sensitive/quartz/SensitiveQuartz.java new file mode 100644 index 00000000..4421aeaf --- /dev/null +++ b/framework/src/main/java/cn/lili/common/sensitive/quartz/SensitiveQuartz.java @@ -0,0 +1,40 @@ +package cn.lili.common.sensitive.quartz; + +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.sensitive.SensitiveWordsFilter; +import lombok.extern.slf4j.Slf4j; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.util.List; + +/** + * 间隔更新敏感词 + * + * @author Chopper + * @version v1.0 + * 2021-11-23 16:31 + */ +@Slf4j +public class SensitiveQuartz extends QuartzJobBean { + + @Autowired + private Cache> cache; + + /** + * 定时更新敏感词信息 + * + * @param jobExecutionContext + */ + @Override + protected void executeInternal(JobExecutionContext jobExecutionContext) { + log.info("敏感词定时更新"); + List sensitives = cache.get(CachePrefix.SENSITIVE.getPrefix()); + if (sensitives == null || sensitives.isEmpty()) { + return; + } + SensitiveWordsFilter.init(sensitives); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/sms/AliSmsUtil.java b/framework/src/main/java/cn/lili/common/sms/AliSmsUtil.java deleted file mode 100644 index d2a290f7..00000000 --- a/framework/src/main/java/cn/lili/common/sms/AliSmsUtil.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.lili.common.sms; - -import cn.lili.modules.message.entity.dos.SmsSign; -import cn.lili.modules.message.entity.dos.SmsTemplate; - -import java.util.Map; - -/** - * @author Chopper - * @version v4.1 - * @Description: - * @since 2021/2/1 6:05 下午 - */ -public interface AliSmsUtil { - /** - * 申请短信签名 - * - * @param smsSign 短信签名 - */ - void addSmsSign(SmsSign smsSign) throws Exception; - - - /** - * 删除短信签名 - * - * @param signName 签名名称 - */ - void deleteSmsSign(String signName) throws Exception; - - /** - * 查询短信签名申请状态 - * - * @param signName 签名名称 - */ - Map querySmsSign(String signName) throws Exception; - - /** - * 修改未审核通过的短信签名,并重新提交审核。 - * - * @param smsSign 短信签名 - */ - void modifySmsSign(SmsSign smsSign) throws Exception; - - /** - * 修改未审核通过的短信模板,并重新提交审核。 - * - * @param smsTemplate 短信模板 - * @throws Exception - */ - void modifySmsTemplate(SmsTemplate smsTemplate) throws Exception; - - /** - * 查看短信模板 - * - * @param templateCode 短信模板CODE - * @throws Exception - */ - Map querySmsTemplate(String templateCode) throws Exception; - - /** - * 申请短信模板 - * - * @param smsTemplate 短信模板 - * @return - * @throws Exception - */ - String addSmsTemplate(SmsTemplate smsTemplate) throws Exception; - - /** - * 删除短信模板 - * - * @param templateCode 短信模板CODE - * @throws Exception - */ - void deleteSmsTemplate(String templateCode) throws Exception; -} diff --git a/framework/src/main/java/cn/lili/config/swagger/Swagger2Config.java b/framework/src/main/java/cn/lili/common/swagger/Swagger2Config.java similarity index 79% rename from framework/src/main/java/cn/lili/config/swagger/Swagger2Config.java rename to framework/src/main/java/cn/lili/common/swagger/Swagger2Config.java index dc1b1117..3b795d22 100644 --- a/framework/src/main/java/cn/lili/config/swagger/Swagger2Config.java +++ b/framework/src/main/java/cn/lili/common/swagger/Swagger2Config.java @@ -1,4 +1,4 @@ -package cn.lili.config.swagger; +package cn.lili.common.swagger; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -73,21 +73,47 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("商品") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 -// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + //扫描所有有注解的api,用这种方式更灵活 +// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.goods")) .paths(PathSelectors.any()) .build() .securitySchemes(securitySchemes()) .securityContexts(securityContexts()); } + @Bean + public Docket orderRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("订单") + .apiInfo(apiInfo()).select() + //扫描所有有注解的api,用这种方式更灵活 +// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.order")) + .paths(PathSelectors.any()) + .build() + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()); + } + + @Bean + public Docket imRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("im") + .apiInfo(apiInfo()).select() + //扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.im")) + .paths(PathSelectors.any()) + .build() + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()); + } @Bean public Docket memberRestApi() { return new Docket(DocumentationType.SWAGGER_2) .groupName("会员") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.member")) .paths(PathSelectors.any()) .build() @@ -100,7 +126,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("促销") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.promotion")) .paths(PathSelectors.any()) .build() @@ -113,7 +139,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("店铺") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.store")) .paths(PathSelectors.any()) .build() @@ -126,7 +152,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("交易") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.trade")) .paths(PathSelectors.any()) .build() @@ -140,7 +166,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("设置") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.setting")) .paths(PathSelectors.any()) .build() @@ -153,7 +179,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("权限") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.permission")) .paths(PathSelectors.any()) .build() @@ -166,7 +192,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("其他") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.other")) .paths(PathSelectors.any()) .build() @@ -179,7 +205,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("通用") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.common")) .paths(PathSelectors.any()) .build() @@ -191,7 +217,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("分销") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.distribution")) .paths(PathSelectors.any()) .build() @@ -204,7 +230,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("统计") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.statistics")) .paths(PathSelectors.any()) .build() @@ -217,7 +243,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("支付") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.payment")) .paths(PathSelectors.any()) .build() @@ -230,7 +256,7 @@ public class Swagger2Config { return new Docket(DocumentationType.SWAGGER_2) .groupName("登录") .apiInfo(apiInfo()).select() - // 扫描所有有注解的api,用这种方式更灵活 + //扫描所有有注解的api,用这种方式更灵活 .apis(RequestHandlerSelectors.basePackage("cn.lili.controller.passport")) .paths(PathSelectors.any()) .build() diff --git a/framework/src/main/java/cn/lili/common/test/BaseTest.java b/framework/src/main/java/cn/lili/common/test/BaseTest.java deleted file mode 100644 index a9ed9b69..00000000 --- a/framework/src/main/java/cn/lili/common/test/BaseTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.lili.common.test; - -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestContext; -import org.springframework.test.context.TestExecutionListener; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -/** - * BaseTest - * - * @author Chopper - * @version v1.0 - * @since - * 2020-06-13 12:17 - */ -@RunWith(SpringRunner.class) -@SpringBootTest -@Transactional(rollbackFor = Exception.class) -@Rollback() -@ContextConfiguration -@Configuration -@ComponentScan("cn.lili") -public class BaseTest implements TestExecutionListener { - @Override - public void beforeTestClass(TestContext testContext) throws Exception { - //设置环境变量 解决es冲突 - System.setProperty("es.set.netty.runtime.available.processors", "false"); - } - -} diff --git a/framework/src/main/java/cn/lili/config/thread/ThreadConfig.java b/framework/src/main/java/cn/lili/common/thread/ThreadConfig.java similarity index 77% rename from framework/src/main/java/cn/lili/config/thread/ThreadConfig.java rename to framework/src/main/java/cn/lili/common/thread/ThreadConfig.java index a265444a..f6aa1d88 100644 --- a/framework/src/main/java/cn/lili/config/thread/ThreadConfig.java +++ b/framework/src/main/java/cn/lili/common/thread/ThreadConfig.java @@ -1,6 +1,6 @@ -package cn.lili.config.thread; +package cn.lili.common.thread; -import cn.lili.config.properties.ThreadProperties; +import cn.lili.common.properties.ThreadProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; @@ -27,15 +27,15 @@ public class ThreadConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); -// 核心线程数,默认为5 +// 核心线程数,默认为5 executor.setCorePoolSize(threadProperties.getCorePoolSize()); -// 最大线程数,默认为10 +// 最大线程数,默认为10 executor.setMaxPoolSize(threadProperties.getMaxPoolSize()); -// 队列最大长度,一般需要设置值为足够大 +// 队列最大长度,一般需要设置值为足够大 executor.setQueueCapacity(threadProperties.getQueueCapacity()); -// 线程池维护线程所允许的空闲时间,默认为60s +// 线程池维护线程所允许的空闲时间,默认为60s executor.setKeepAliveSeconds(threadProperties.getKeepAliveSeconds()); -// 允许超时关闭 +// 允许超时关闭 executor.setAllowCoreThreadTimeOut(threadProperties.getAllowCoreThreadTimeOut()); executor.initialize(); return executor; diff --git a/framework/src/main/java/cn/lili/common/token/base/generate/ManagerTokenGenerate.java b/framework/src/main/java/cn/lili/common/token/base/generate/ManagerTokenGenerate.java deleted file mode 100644 index 509cc135..00000000 --- a/framework/src/main/java/cn/lili/common/token/base/generate/ManagerTokenGenerate.java +++ /dev/null @@ -1,132 +0,0 @@ -package cn.lili.common.token.base.generate; - -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; -import cn.lili.common.security.AuthUser; -import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.token.PermissionEnum; -import cn.lili.common.token.Token; -import cn.lili.common.token.TokenUtil; -import cn.lili.common.token.base.AbstractTokenGenerate; -import cn.lili.modules.permission.entity.dos.AdminUser; -import cn.lili.modules.permission.entity.vo.UserMenuVO; -import cn.lili.modules.permission.service.AdminUserService; -import cn.lili.modules.permission.service.RoleMenuService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 管理员token生成 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/11/16 10:51 - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ManagerTokenGenerate extends AbstractTokenGenerate { - - private AdminUserService adminUserService; - - private final TokenUtil tokenUtil; - - private final RoleMenuService roleMenuService; - - private final Cache cache; - - @Autowired - public void setAdminUserService(AdminUserService adminUserService) { - this.adminUserService = adminUserService; - } - - @Override - public Token createToken(String username, Boolean longTerm) { - // 生成token - AdminUser adminUser = adminUserService.findByUsername(username); - AuthUser user = new AuthUser(adminUser.getUsername(), adminUser.getId(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper()); - - - List userMenuVOList = roleMenuService.findAllMenu(user.getId()); - //缓存权限列表 - cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + user.getId(), this.permissionList(userMenuVOList)); - - return tokenUtil.createToken(username, user, longTerm, UserEnums.MANAGER); - } - - @Override - public Token refreshToken(String refreshToken) { - return tokenUtil.refreshToken(refreshToken, UserEnums.MANAGER); - } - - /** - * 获取用户权限 - * - * @param userMenuVOList - * @return - */ - private Map> permissionList(List userMenuVOList) { - Map> permission = new HashMap<>(); - if (userMenuVOList == null || userMenuVOList.size() == 0) { - return permission; - } - List superPermissions = new ArrayList<>(); - List queryPermissions = new ArrayList<>(); - initPermission(superPermissions, queryPermissions); - - //循环权限菜单 - userMenuVOList.forEach(menu -> { - //循环菜单,赋予用户权限 - if (menu.getPath() != null) { - //获取路径集合 - String[] paths = menu.getPath().split("\\|"); - //for循环路径集合 - for (String path : paths) { - //如果是超级权限 则计入超级权限 - if (menu.getIsSupper()) { - //如果已有超级权限,则这里就不做权限的累加 - if (!superPermissions.contains(path)) { - superPermissions.add(path); - } - } - //否则计入浏览权限 - else { - //如果已有超级权限,或者已有普通查看权限,则这里就不做权限的累加 - if (!superPermissions.contains(path) && !queryPermissions.contains(path)) { - queryPermissions.add(path); - } - } - } - } - - //去除无效的权限 - superPermissions.forEach(queryPermissions::remove); - }); - permission.put(PermissionEnum.SUPER.name(), superPermissions); - permission.put(PermissionEnum.QUERY.name(), queryPermissions); - return permission; - } - - /** - * 初始赋予的权限,查看权限包含首页流量统计权限, - * 超级权限包含个人信息维护,密码修改权限 - * - * @param superPermissions 超级权限 - * @param queryPermissions 查询权限 - */ - void initPermission(List superPermissions, List queryPermissions) { - //用户信息维护 - superPermissions.add("/manager/user/info"); - superPermissions.add("/manager/user/edit"); - superPermissions.add("/manager/user/editPassword*"); - //统计查看 - queryPermissions.add("/manager/statistics*"); - } - -} diff --git a/framework/src/main/java/cn/lili/common/token/base/generate/MemberTokenGenerate.java b/framework/src/main/java/cn/lili/common/token/base/generate/MemberTokenGenerate.java deleted file mode 100644 index 91bf6e50..00000000 --- a/framework/src/main/java/cn/lili/common/token/base/generate/MemberTokenGenerate.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.lili.common.token.base.generate; - -import cn.lili.common.security.AuthUser; -import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.token.Token; -import cn.lili.common.token.TokenUtil; -import cn.lili.common.token.base.AbstractTokenGenerate; -import cn.lili.config.context.ThreadContextHolder; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.service.MemberService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.Date; - -/** - * 会员token生成 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/11/16 10:50 - */ - -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MemberTokenGenerate extends AbstractTokenGenerate { - - - private MemberService memberService; - - private final TokenUtil tokenUtil; - - @Override - public Token createToken(String username, Boolean longTerm) { - - Member member = memberService.findByUsername(username); - - //获取客户端类型 - String clientType = ThreadContextHolder.getHttpRequest().getHeader("clientType"); - ClientTypeEnum clientTypeEnum; - try { - //如果客户端为空,则缺省值为PC,pc第三方登录时不会传递此参数 - if (clientType == null) { - clientTypeEnum = ClientTypeEnum.PC; - } else { - clientTypeEnum = ClientTypeEnum.valueOf(clientType); - } - } catch (IllegalArgumentException e) { - clientTypeEnum = ClientTypeEnum.UNKNOWN; - } - //记录最后登录时间,客户端类型 - member.setLastLoginDate(new Date()); - member.setClientEnum(clientTypeEnum.name()); - memberService.updateById(member); - - AuthUser authUser = new AuthUser(member.getUsername(), member.getId(),member.getNickName(), UserEnums.MEMBER); - // 登陆成功生成token - return tokenUtil.createToken(username, authUser, longTerm, UserEnums.MEMBER); - } - - @Override - public Token refreshToken(String refreshToken) { - return tokenUtil.refreshToken(refreshToken, UserEnums.MEMBER); - } - - - @Autowired - public void setMemberService(MemberService memberService) { - this.memberService = memberService; - } -} diff --git a/framework/src/main/java/cn/lili/common/token/base/generate/StoreTokenGenerate.java b/framework/src/main/java/cn/lili/common/token/base/generate/StoreTokenGenerate.java deleted file mode 100644 index b31b0871..00000000 --- a/framework/src/main/java/cn/lili/common/token/base/generate/StoreTokenGenerate.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.lili.common.token.base.generate; - -import cn.lili.common.exception.ServiceException; -import cn.lili.common.security.AuthUser; -import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.token.Token; -import cn.lili.common.token.TokenUtil; -import cn.lili.common.token.base.AbstractTokenGenerate; -import cn.lili.common.enums.SwitchEnum; -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.store.entity.dos.Store; -import cn.lili.modules.store.service.StoreService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 商家token生成 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/11/16 10:51 - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class StoreTokenGenerate extends AbstractTokenGenerate { - - private MemberService memberService; - - private StoreService storeService; - - private final TokenUtil tokenUtil; - - @Autowired - public void setMemberService(MemberService memberService) { - this.memberService = memberService; - } - - @Autowired - public void setStoreService(StoreService storeService) { - this.storeService = storeService; - } - - @Override - public Token createToken(String username, Boolean longTerm) { - // 生成token - Member member = memberService.findByUsername(username); - if (member.getHaveStore().equals(SwitchEnum.CLOSE.name())) { - throw new ServiceException("该会员未开通店铺"); - } - AuthUser user = new AuthUser(member.getUsername(), member.getId(),member.getNickName(), UserEnums.STORE); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Store::getMemberId, member.getId()); - Store store = storeService.getOne(queryWrapper); - user.setStoreId(store.getId()); - user.setStoreName(store.getStoreName()); - return tokenUtil.createToken(username, user, longTerm, UserEnums.STORE); - } - - @Override - public Token refreshToken(String refreshToken) { - return tokenUtil.refreshToken(refreshToken, UserEnums.STORE); - } - -} diff --git a/framework/src/main/java/cn/lili/common/trigger/RocketmqTimerTrigger.java b/framework/src/main/java/cn/lili/common/trigger/RocketmqTimerTrigger.java deleted file mode 100644 index ed35e667..00000000 --- a/framework/src/main/java/cn/lili/common/trigger/RocketmqTimerTrigger.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.lili.common.trigger; - -import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.trigger.delay.PromotionDelayQueue; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import cn.lili.common.trigger.util.TimeTriggerUtil; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.StringUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.messaging.Message; -import org.springframework.messaging.support.MessageBuilder; -import org.springframework.stereotype.Component; - -/** - * @author paulG - * @since 2020/11/5 - **/ -@Component -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class RocketmqTimerTrigger implements TimeTrigger { - - private final RocketMQTemplate rocketMQTemplate; - - private final Cache cache; - - private PromotionDelayQueue promotionDelayQueue; - - @Autowired - public void setPromotionDelayQueue(PromotionDelayQueue promotionDelayQueue) { - this.promotionDelayQueue = promotionDelayQueue; - } - - @Override - public void add(String executorName, Object param, Long triggerTime, String uniqueKey, String topic) { - - - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic); - Message message = MessageBuilder.withPayload(timeTriggerMsg).build(); - - this.rocketMQTemplate.asyncSend(topic, message, RocketmqSendCallbackBuilder.commonCallback()); - } - - @Override - public void add(TimeTriggerMsg timeTriggerMsg) { - this.add(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getParam(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey(), timeTriggerMsg.getTopic()); - } - - @Override - public void addDelay(TimeTriggerMsg timeTriggerMsg, int delayTime) { - String uniqueKey = timeTriggerMsg.getUniqueKey(); - if (StringUtils.isEmpty(uniqueKey)) { - uniqueKey = StringUtils.getRandStr(10); - } - String generateKey = TimeTriggerUtil.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), uniqueKey); - this.cache.put(generateKey, 1); - if (Boolean.TRUE.equals(promotionDelayQueue.addJobId(JSONUtil.toJsonStr(timeTriggerMsg), delayTime))) { - log.info("add Redis key {} --------------------------", generateKey); - log.info("定时执行在【" + DateUtil.toString(timeTriggerMsg.getTriggerTime(), "yyyy-MM-dd HH:mm:ss") + "】,消费【" + timeTriggerMsg.getParam().toString() + "】"); - } else { - log.info("延时任务添加失败!"); - } - } - - @Override - public void edit(String executorName, Object param, Long oldTriggerTime, Long triggerTime, String uniqueKey, int delayTime, String topic) { - this.delete(executorName, oldTriggerTime, uniqueKey, topic); - this.addDelay(new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic), delayTime); - } - - @Override - public void delete(String executorName, Long triggerTime, String uniqueKey, String topic) { - String generateKey = TimeTriggerUtil.generateKey(executorName, triggerTime, uniqueKey); - log.info("delete redis key {} -----------------------", generateKey); - this.cache.remove(generateKey); - } -} diff --git a/framework/src/main/java/cn/lili/common/trigger/delay/PromotionDelayQueue.java b/framework/src/main/java/cn/lili/common/trigger/delay/PromotionDelayQueue.java deleted file mode 100644 index 724af151..00000000 --- a/framework/src/main/java/cn/lili/common/trigger/delay/PromotionDelayQueue.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.lili.common.trigger.delay; - -import cn.hutool.json.JSONUtil; -import cn.lili.common.delayqueue.AbstractDelayQueueMachineFactory; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 促销延迟队列 - * - * @author paulG - * @version v4.1 - * @date 2020/11/17 7:19 下午 - * @description - * @since 1 - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class PromotionDelayQueue extends AbstractDelayQueueMachineFactory { - - private final TimeTrigger timeTrigger; - - @Override - public void invoke(String jobId) { - timeTrigger.add(JSONUtil.toBean(jobId, TimeTriggerMsg.class)); - } - - @Override - public String setDelayQueueName() { - return "promotion_delay"; - } -} diff --git a/framework/src/main/java/cn/lili/common/trigger/model/TimeExecuteConstant.java b/framework/src/main/java/cn/lili/common/trigger/model/TimeExecuteConstant.java deleted file mode 100644 index 6438de52..00000000 --- a/framework/src/main/java/cn/lili/common/trigger/model/TimeExecuteConstant.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.lili.common.trigger.model; - -/** - * @author paulG - * @since 2020/8/20 - **/ -public abstract class TimeExecuteConstant { - - /** - * 促销延迟加载执行器 - */ - public static final String PROMOTION_EXECUTOR = "promotionTimeTriggerExecutor"; - - /** - * 拼团延迟加载执行器 - */ - public static final String PINTUAN_EXECUTOR = "pintuanTimeTriggerExecutor"; - - /** - * 拼团延迟加载执行器 - */ - public static final String FULL_DISCOUNT_EXECUTOR = "fullDiscountTimeTriggerExecutor"; - -} diff --git a/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java b/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java index 62c7fde0..b5059104 100644 --- a/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java +++ b/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java @@ -1,17 +1,18 @@ package cn.lili.common.utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; +import java.io.*; import java.util.Base64; import java.util.Base64.Decoder; -import java.io.*; - /** * base64转为multipartFile工具类 * * @author Chopper */ +@Slf4j public class Base64DecodeMultipartFile implements MultipartFile { private final byte[] imgContent; @@ -53,13 +54,22 @@ public class Base64DecodeMultipartFile implements MultipartFile { } @Override - public InputStream getInputStream() throws IOException { + public InputStream getInputStream() { return new ByteArrayInputStream(imgContent); } @Override public void transferTo(File dest) throws IOException, IllegalStateException { - new FileOutputStream(dest).write(imgContent); + OutputStream stream = null; + try { + stream = new FileOutputStream(dest); + stream.write(imgContent); + } catch (IOException e) { + log.error("transferTo错误", e); + } finally { + assert stream != null; + stream.close(); + } } @@ -84,14 +94,14 @@ public class Base64DecodeMultipartFile implements MultipartFile { byte[] bytes = Base64.getDecoder().decode(base64); stream = new ByteArrayInputStream(bytes); } catch (Exception e) { - e.printStackTrace(); + log.error("base64ToInputStream错误", e); } return stream; } public static String inputStreamToStream(InputStream in) { byte[] data = null; - // 读取图片字节数组 + //读取图片字节数组 try { ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; @@ -101,13 +111,13 @@ public class Base64DecodeMultipartFile implements MultipartFile { } data = swapStream.toByteArray(); } catch (IOException e) { - e.printStackTrace(); + log.error("转码错误", e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { - e.printStackTrace(); + log.error("inputStreamToStream错误", e); } } } diff --git a/framework/src/main/java/cn/lili/modules/connect/util/Base64Utils.java b/framework/src/main/java/cn/lili/common/utils/Base64Utils.java similarity index 73% rename from framework/src/main/java/cn/lili/modules/connect/util/Base64Utils.java rename to framework/src/main/java/cn/lili/common/utils/Base64Utils.java index 8d0c2fe0..38dcf13c 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/Base64Utils.java +++ b/framework/src/main/java/cn/lili/common/utils/Base64Utils.java @@ -1,9 +1,5 @@ -package cn.lili.modules.connect.util; +package cn.lili.common.utils; -import sun.misc.BASE64Decoder; -import sun.misc.BASE64Encoder; - -import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -19,31 +15,31 @@ public class Base64Utils { /** * 标准编码表 */ - private static final byte[] STANDARD_ENCODE_TABLE = { // - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // - 'w', 'x', 'y', 'z', '0', '1', '2', '3', // - '4', '5', '6', '7', '8', '9', '+', '/' // + private static final byte[] STANDARD_ENCODE_TABLE = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' }; /** * URL安全的编码表,将 + 和 / 替换为 - 和 _ */ - private static final byte[] URL_SAFE_ENCODE_TABLE = { // - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // - 'w', 'x', 'y', 'z', '0', '1', '2', '3', // - '4', '5', '6', '7', '8', '9', '-', '_' // + private static final byte[] URL_SAFE_ENCODE_TABLE = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '-', '_' }; - // -------------------------------------------------------------------- encode + //-------------------------------------------------------------------- encode /** * 编码为Base64,非URL安全的 @@ -174,7 +170,8 @@ public class Base64Utils { } } - int left = len - evenlen;// 剩余位数 + //剩余位数 + int left = len - evenlen; if (left > 0) { int i = ((arr[evenlen] & 0xff) << 10) | (left == 2 ? ((arr[len - 1] & 0xff) << 2) : 0); @@ -182,7 +179,7 @@ public class Base64Utils { dest[destlen - 3] = encodeTable[(i >>> 6) & 0x3f]; if (isUrlSafe) { - // 在URL Safe模式下,=为URL中的关键字符,不需要补充。空余的byte位要去掉。 + //在URL Safe模式下,=为URL中的关键字符,不需要补充。空余的byte位要去掉。 int urlSafeLen = destlen - 2; if (2 == left) { dest[destlen - 2] = encodeTable[i & 0x3f]; @@ -235,29 +232,4 @@ public class Base64Utils { return new String(data, charset); } - - /** - * 二进制流转Base64字符串 - * - * @param data 二进制流 - * @return data - * @throws IOException 异常 - */ - public static String getImageString(byte[] data) throws IOException { - BASE64Encoder encoder = new BASE64Encoder(); - return data != null ? encoder.encode(data) : ""; - } - - - /** - * Base64字符串转 二进制流 - * - * @param base64String Base64 - * @return base64String - * @throws IOException 异常 - */ - public static byte[] getStringImage(String base64String) throws IOException { - BASE64Decoder decoder = new sun.misc.BASE64Decoder(); - return base64String != null ? decoder.decodeBuffer(base64String) : null; - } } diff --git a/framework/src/main/java/cn/lili/common/utils/BeanUtil.java b/framework/src/main/java/cn/lili/common/utils/BeanUtil.java index b525fa64..a5e66e54 100644 --- a/framework/src/main/java/cn/lili/common/utils/BeanUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/BeanUtil.java @@ -7,22 +7,27 @@ import java.lang.reflect.Method; /** * 对象属性复制 + * * @author Chopper */ public class BeanUtil { /** * 复制属性 - * @param objectFrom - * @param objectTo + * + * @param objectFrom 源自对象 + * @param objectTo 复制给对象 */ - public static void copyProperties(Object objectFrom,Object objectTo){ + public static void copyProperties(Object objectFrom, Object objectTo) { BeanUtils.copyProperties(objectFrom, objectTo); } /** * 获取属性名数组 + * + * @param o 获取字段的对象 + * @return 返回各个字段 */ public static String[] getFiledName(Object o) { Field[] fields = o.getClass().getDeclaredFields(); @@ -34,7 +39,7 @@ public class BeanUtil { index++; } for (int i = 0; i < superFields.length; i++) { - if (superFields[i].getName().equals("id")) { + if ("id".equals(superFields[i].getName())) { continue; } fieldNames[index] = superFields[i].getName(); @@ -43,8 +48,13 @@ public class BeanUtil { return fieldNames; } - /* 根据属性名获取属性值 - * */ + /** + * 根据属性名获取属性值 + * + * @param fieldName 属性名 + * @param o 对象 + * @return 属性值 + */ public static Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); @@ -56,4 +66,72 @@ public class BeanUtil { return null; } } + + + /** + * 将对象转换为key value + * A=a&B=b&C=c 格式 + * + * @param object 对象 + * @return 格式化结果 + */ + public static String formatKeyValuePair(Object object) { + //准备接受的字符串 + StringBuilder stringBuffer = new StringBuilder(); + //获取对象字段 + String[] fieldNames = BeanUtil.getFiledName(object); + //遍历所有属性 + for (int j = 0; j < fieldNames.length; j++) { + //不是第一个并且不是最后一个,拼接& + if (j != 0) { + stringBuffer.append("&"); + } + //获取属性的名字 + String key = fieldNames[j]; + //获取值 + Object value = BeanUtil.getFieldValueByName(key, object); + assert value != null; + stringBuffer.append(key).append("=").append(value.toString()); + } + return stringBuffer.toString(); + } + + /** + * key value键值对 转换为 对象 + * A=a&B=b&C=c 格式 转换为对象 + * + * @param str 对象字符串 + * @param t 范型 + * @param 范型 + * @return 格式化结果 + */ + public static T formatKeyValuePair(String str, T t) { + //填写对参数键值对 + String[] params = str.split("&"); + + //获取对象字段 + String[] fieldNames = BeanUtil.getFiledName(t); + + try { + //循环每个参数 + for (String param : params) { + String[] keyValues = param.split("="); + for (int i = 0; i < fieldNames.length; i++) { + if (fieldNames[i].equals(keyValues[0])) { + Field f = t.getClass().getDeclaredField(fieldNames[i]); + f.setAccessible(true); + //长度为2 才转换,否则不转 + if (keyValues.length == 2) { + f.set(t, keyValues[1]); + } + } + } + + } + } catch (Exception e) { + e.printStackTrace(); + } + return t; + } + } diff --git a/framework/src/main/java/cn/lili/common/utils/CheckMobileUtil.java b/framework/src/main/java/cn/lili/common/utils/CheckMobileUtil.java deleted file mode 100644 index 7bec68a4..00000000 --- a/framework/src/main/java/cn/lili/common/utils/CheckMobileUtil.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.lili.common.utils; - -import javax.servlet.http.HttpServletRequest; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * CheckMobileUtil - * - * @author Chopper - * @version v1.0 - * 2021-02-04 14:56 - */ -public class CheckMobileUtil { - - - // \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔), - // 字符串在编译时会被转码一次,所以是 "\\b" - // \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔) - static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i" - + "|windows (phone|ce)|blackberry" - + "|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp" - + "|laystation portable)|nokia|fennec|htc[-_]" - + "|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; - static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser" - + "|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; - - //移动设备正则匹配:手机端、平板 - static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE); - static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE); - - /** - * 检测是否是移动设备访问 - * - * @param request 浏览器标识 获取方式: - * @return true:移动设备接入,false:pc端接入 - * @Title: check - */ - public static boolean check(HttpServletRequest request) { - String userAgent = request.getHeader("USER-AGENT").toLowerCase(); - if (null == userAgent) { - userAgent = ""; - } - // 匹配 - Matcher matcherPhone = phonePat.matcher(userAgent); - Matcher matcherTable = tablePat.matcher(userAgent); - if (matcherPhone.find() || matcherTable.find()) { - return true; - } else { - return false; - } - } -} diff --git a/framework/src/main/java/cn/lili/common/utils/CommonUtil.java b/framework/src/main/java/cn/lili/common/utils/CommonUtil.java index e6c8e0e8..61e7ebe9 100644 --- a/framework/src/main/java/cn/lili/common/utils/CommonUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/CommonUtil.java @@ -1,7 +1,7 @@ package cn.lili.common.utils; -import java.util.Random; import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; /** * 通用工具 @@ -9,10 +9,12 @@ import java.util.UUID; */ public class CommonUtil { + public static final String BASE_NUMBER = "0123456789"; + /** * 以UUID重命名 - * @param fileName - * @return + * @param fileName 文件名称 + * @return 格式化名称 */ public static String rename(String fileName) { String extName = fileName.substring(fileName.lastIndexOf(".")); @@ -24,28 +26,12 @@ public class CommonUtil { * 随机6位数生成 */ public static String getRandomNum() { - - Random random = new Random(); - int num = random.nextInt(999999); - //不足六位前面补0 - String str = String.format("%06d", num); - return str; - } - - /** - * 批量递归删除时 判断target是否在ids中 避免重复删除 - * @param target - * @param ids - * @return - */ - public static Boolean judgeIds(String target, String[] ids){ - Boolean flag = false; - for(String id : ids){ - if(id.equals(target)){ - flag = true; - break; - } + StringBuilder sb = new StringBuilder(6); + for (int i = 0; i < 6; i++) { + int num = ThreadLocalRandom.current().nextInt(BASE_NUMBER.length()); + sb.append(BASE_NUMBER.charAt(num)); } - return flag; + return sb.toString(); } + } diff --git a/framework/src/main/java/cn/lili/common/utils/CookieUtil.java b/framework/src/main/java/cn/lili/common/utils/CookieUtil.java index a430ebfb..db9d479e 100644 --- a/framework/src/main/java/cn/lili/common/utils/CookieUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/CookieUtil.java @@ -1,5 +1,7 @@ package cn.lili.common.utils; +import lombok.extern.slf4j.Slf4j; + import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -11,24 +13,9 @@ import javax.servlet.http.HttpServletResponse; * @version v1.0 * 2020-12-14 09:32 */ +@Slf4j public class CookieUtil { - /** - * 新增cookie - * - * @param key key值 - * @param value 对应值 - * @param response 响应 - */ - public static void addCookie(String key, String value, HttpServletResponse response) { - try { - Cookie c = new Cookie(key, value); - c.setPath("/"); - response.addCookie(c); - } catch (Exception e) { - e.printStackTrace(); - } - } /** * 新增cookie @@ -45,7 +32,7 @@ public class CookieUtil { c.setPath("/"); response.addCookie(c); } catch (Exception e) { - e.printStackTrace(); + log.error("新增cookie错误",e); } } @@ -61,7 +48,7 @@ public class CookieUtil { c.setMaxAge(0); response.addCookie(c); } catch (Exception e) { - e.printStackTrace(); + log.error("删除cookie错误",e); } } @@ -83,7 +70,7 @@ public class CookieUtil { } } } catch (Exception e) { - e.printStackTrace(); + log.error("获取cookie错误",e); } return null; } diff --git a/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java b/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java index d2e21cb5..aa030d6e 100644 --- a/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java @@ -1,9 +1,14 @@ package cn.lili.common.utils; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Arrays; /** * 金额计算工具 + * + * @author Bulbasaur + * @since 2021/7/9 1:40 上午 */ public final class CurrencyUtil { /** @@ -20,27 +25,29 @@ public final class CurrencyUtil { /** * 提供精确的加法运算。 * - * @param v1 被加数 - * @param v2 加数 - * @return 两个参数的和 + * @return 累加之和 */ - public static Double add(double v1, double v2) { - BigDecimal b1 = new BigDecimal(Double.toString(v1)); - BigDecimal b2 = new BigDecimal(Double.toString(v2)); - return b1.add(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + public static Double add(double... params) { + BigDecimal result = new BigDecimal("0"); + for (double param : params) { + BigDecimal bigParam = BigDecimal.valueOf(param); + result = result.add(bigParam).setScale(2, RoundingMode.HALF_UP); + } + return result.doubleValue(); } - /** * 提供精确的减法运算。 * - * @param v1 被减数 - * @param v2 减数 - * @return 两个参数的差 + * @return 第一个参数为被减数,其余数字为减数 */ - public static double sub(double v1, double v2) { - BigDecimal b1 = new BigDecimal(Double.toString(v1)); - BigDecimal b2 = new BigDecimal(Double.toString(v2)); - return b1.subtract(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + public static Double sub(double... params) { + BigDecimal result = BigDecimal.valueOf(params[0]); + params = Arrays.stream(params).skip(1).toArray(); + for (double param : params) { + BigDecimal bigParam = BigDecimal.valueOf(param); + result = result.subtract(bigParam).setScale(2, RoundingMode.HALF_UP); + } + return result.doubleValue(); } /** @@ -51,9 +58,27 @@ public final class CurrencyUtil { * @return 两个参数的积 */ public static Double mul(double v1, double v2) { - BigDecimal b1 = new BigDecimal(Double.toString(v1)); - BigDecimal b2 = new BigDecimal(Double.toString(v2)); - return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b1 = BigDecimal.valueOf(v1); + BigDecimal b2 = BigDecimal.valueOf(v2); + return b1.multiply(b2).setScale(2, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * + * @param v1 被乘数 + * @param v2 乘数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的积 + */ + public static Double mul(double v1, double v2, int scale) { + if (scale < 0) { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = BigDecimal.valueOf(v1); + BigDecimal b2 = BigDecimal.valueOf(v2); + return b1.multiply(b2).setScale(scale, RoundingMode.HALF_UP).doubleValue(); } /** @@ -84,33 +109,16 @@ public final class CurrencyUtil { if (v2 == 0) { return 0; } - BigDecimal b1 = new BigDecimal(Double.toString(v1)); - BigDecimal b2 = new BigDecimal(Double.toString(v2)); - return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); - } - - /** - * 提供精确的小数位四舍五入处理。 - * - * @param v 需要四舍五入的数字 - * @param scale 小数点后保留几位 - * @return 四舍五入后的结果 - */ - public static double round(double v, int scale) { - if (scale < 0) { - throw new IllegalArgumentException( - "The scale must be a positive integer or zero"); - } - BigDecimal b = new BigDecimal(Double.toString(v)); - BigDecimal one = new BigDecimal("1"); - return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b1 = BigDecimal.valueOf(v1); + BigDecimal b2 = BigDecimal.valueOf(v2); + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); } /** * 金额转分 * - * @param money - * @return + * @param money 金额 + * @return 转换单位为分 */ public static Integer fen(Double money) { double price = mul(money, 100); @@ -120,15 +128,10 @@ public final class CurrencyUtil { /** * 金额转分 * - * @param money - * @return + * @param money 金额 + * @return double类型分 */ public static double reversalFen(Double money) { - double price = div(money, 100); - return price; - } - - public static void main(String[] args) { - System.out.println(fen(23.4324)); + return div(money, 100); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/utils/DateUtil.java b/framework/src/main/java/cn/lili/common/utils/DateUtil.java index c6ed8b0b..1e0a10e7 100644 --- a/framework/src/main/java/cn/lili/common/utils/DateUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/DateUtil.java @@ -23,7 +23,25 @@ public class DateUtil { /** * 当天的开始时间 * - * @return + * @return 今天开始时间 + */ + public static Long getDayOfStart() { + return DateUtil.getDateline() / (60 * 24 * 60); + } + + /** + * 指定日的开始时间 + * + * @return 指定日时间 + */ + public static Long getDayOfStart(Date date) { + return date.getTime() / (60 * 24 * 60); + } + + /** + * 当天的开始时间 + * + * @return 今天开始时间 */ public static Date startOfTodDayTime() { Calendar calendar = Calendar.getInstance(); @@ -37,7 +55,8 @@ public class DateUtil { /** * 当天的开始时间 * - * @return + * @param date 时间 + * @return 根据传入的时间获取开始时间 */ public static Date startOfTodDayTime(Date date) { Calendar calendar = Calendar.getInstance(); @@ -51,7 +70,7 @@ public class DateUtil { /** * 当天的开始时间 * - * @return + * @return 今天开始时间 */ public static long startOfTodDay() { Calendar calendar = Calendar.getInstance(); @@ -63,14 +82,10 @@ public class DateUtil { return date.getTime() / 1000; } - public static void main(String[] args) { - - } - /** * 当天的结束时间 * - * @return + * @return 今天结束时间 */ public static Date endOfDate() { Calendar calendar = Calendar.getInstance(); @@ -84,9 +99,13 @@ public class DateUtil { /** * 当天的结束时间 * - * @return + * @param date 传入日期 + * @return 获得传入日期当天结束时间 */ public static Date endOfDate(Date date) { + if (date == null) { + date = new Date(); + } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, 23); @@ -122,7 +141,7 @@ public class DateUtil { * * @param date 字符串日期 * @param pattern 日期格式 - * @return + * @return date */ public static Date toDate(String date, String pattern) { if ("".equals("" + date)) { @@ -145,21 +164,21 @@ public class DateUtil { /** * 获取上个月的开始结束时间 * - * @return + * @return 上个月的开始结束时间 */ public static Long[] getLastMonth() { - // 取得系统当前时间 + //取得系统当前时间 Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; - // 取得系统当前时间所在月第一天时间对象 + //取得系统当前时间所在月第一天时间对象 cal.set(Calendar.DAY_OF_MONTH, 1); - // 日期减一,取得上月最后一天时间对象 + //日期减一,取得上月最后一天时间对象 cal.add(Calendar.DAY_OF_MONTH, -1); - // 输出上月最后一天日期 + //输出上月最后一天日期 int day = cal.get(Calendar.DAY_OF_MONTH); String months = ""; @@ -171,12 +190,12 @@ public class DateUtil { year--; month = 12; } - if (!(String.valueOf(month).length() > 1)) { + if (String.valueOf(month).length() <= 1) { months = "0" + month; } else { months = String.valueOf(month); } - if (!(String.valueOf(day).length() > 1)) { + if (String.valueOf(day).length() <= 1) { days = "0" + day; } else { days = String.valueOf(day); @@ -194,18 +213,29 @@ public class DateUtil { /** * 把日期转换成字符串型 * - * @param date 日期 - * @return + * @param date 日期 + * @return 字符串时间 */ public static String toString(Date date) { - return toString(date,STANDARD_FORMAT); + return toString(date, STANDARD_FORMAT); } + + /** + * 把日期转换成字符串型 + * + * @param date 日期 + * @return 字符串时间 + */ + public static String toString(Long date) { + return toString(date, STANDARD_FORMAT); + } + /** * 把日期转换成字符串型 * * @param date 日期 * @param pattern 类型 - * @return + * @return 字符串时间 */ public static String toString(Date date, String pattern) { if (date == null) { @@ -229,7 +259,7 @@ public class DateUtil { * * @param time 时间戳 * @param pattern 格式 - * @return + * @return 字符串时间 */ public static String toString(Long time, String pattern) { if (time > 0) { @@ -237,8 +267,7 @@ public class DateUtil { time = time * 1000; } Date date = new Date(time); - String str = DateUtil.toString(date, pattern); - return str; + return DateUtil.toString(date, pattern); } return ""; } @@ -262,7 +291,7 @@ public class DateUtil { * @return 时间戳 */ public static long getDateline(String date) { - return toDate(date, STANDARD_DATE_FORMAT).getTime() / 1000; + return Objects.requireNonNull(toDate(date, STANDARD_DATE_FORMAT)).getTime() / 1000; } /** @@ -300,14 +329,14 @@ public class DateUtil { * @return 时间戳 */ public static long getDateline(String date, String pattern) { - return toDate(date, pattern).getTime() / 1000; + return Objects.requireNonNull(toDate(date, pattern)).getTime() / 1000; } /** * 获取几个月之前的日期时间戳 * * @param beforeMonth 几个月之前 - * @return + * @return 时间戳 */ public static long getBeforeMonthDateline(int beforeMonth) { SimpleDateFormat format = new SimpleDateFormat(STANDARD_FORMAT); @@ -321,6 +350,22 @@ public class DateUtil { return getDateline(mon, STANDARD_FORMAT); } + /** + * 获取当前天的结束时间 + * + * @return 当前天的开始时间 + */ + public static Date getCurrentDayStartTime() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.SECOND, cal.get(Calendar.SECOND) - 1); + return cal.getTime(); + } + /** * 获取当前天的结束时间 * @@ -338,6 +383,21 @@ public class DateUtil { return cal.getTime(); } + /** + * 获取干净的时间 + * + * @return 时间对象 + */ + public static Calendar getCleanCalendar() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal; + } + /** * 获取延时时间(秒) * @@ -346,7 +406,7 @@ public class DateUtil { */ public static Integer getDelayTime(Long startTime) { int time = Math.toIntExact((startTime - System.currentTimeMillis()) / 1000); - // 如果时间为负数则改为一秒后执行 + //如果时间为负数则改为一秒后执行 if (time <= 0) { time = 1; } diff --git a/framework/src/main/java/cn/lili/common/utils/HibernateProxyTypeAdapter.java b/framework/src/main/java/cn/lili/common/utils/HibernateProxyTypeAdapter.java deleted file mode 100644 index 8d3976ba..00000000 --- a/framework/src/main/java/cn/lili/common/utils/HibernateProxyTypeAdapter.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.lili.common.utils; - -import com.google.gson.Gson; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; -import org.hibernate.Hibernate; -import org.hibernate.proxy.HibernateProxy; - -import java.io.IOException; - -/** - * 代理对象实例化 - * @author Chopper - */ -public class HibernateProxyTypeAdapter extends TypeAdapter { - - public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { - - @Override - @SuppressWarnings("unchecked") - public TypeAdapter create(Gson gson, TypeToken type) { - return (HibernateProxy.class.isAssignableFrom(type.getRawType()) ? (TypeAdapter) new HibernateProxyTypeAdapter(gson) : null); - } - }; - private final Gson context; - - private HibernateProxyTypeAdapter(Gson context) { - this.context = context; - } - - @Override - public HibernateProxy read(JsonReader in) throws IOException { - throw new UnsupportedOperationException("Not supported"); - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - @Override - public void write(JsonWriter out, HibernateProxy value) throws IOException { - if (value == null) { - out.nullValue(); - return; - } - // Retrieve the original (not proxy) class - Class baseType = Hibernate.getClass(value); - // Get the TypeAdapter of the original class, to delegate the serialization - TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType)); - // Get a filled instance of the original class - Object unproxiedValue = ((HibernateProxy) value).getHibernateLazyInitializer() - .getImplementation(); - // Serialize the value - delegate.write(out, unproxiedValue); - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java b/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java index 0042eb45..073b7b8b 100644 --- a/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java +++ b/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java @@ -1,12 +1,14 @@ package cn.lili.common.utils; -import org.apache.http.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntityEnclosingRequest; +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.NoHttpResponseException; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.client.utils.URIBuilder; import org.apache.http.config.Registry; @@ -16,12 +18,9 @@ import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.LayeredConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import javax.net.ssl.SSLException; @@ -30,40 +29,66 @@ import java.io.IOException; import java.io.InterruptedIOException; import java.net.URI; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; import java.util.Map; +/** + * HttpClientUtils + * + * @author Bulbasaur + * @since 2021/7/9 1:40 上午 + */ +@Slf4j public class HttpClientUtils { - // org.apache.http.impl.client.CloseableHttpClient + /** + * org.apache.http.impl.client.CloseableHttpClient + */ private static CloseableHttpClient httpClient = null; - // 这里就直接默认固定了,因为以下三个参数在新建的method中仍然可以重新配置并被覆盖. - static final int connectionRequestTimeout = 30000;// ms毫秒,从池中获取链接超时时间 - static final int connectTimeout = 60000;// ms毫秒,建立链接超时时间 - static final int socketTimeout = 60000;// ms毫秒,读取超时时间 + //这里就直接默认固定了,因为以下三个参数在新建的method中仍然可以重新配置并被覆盖. + /** + * ms毫秒,从池中获取链接超时时间 + */ + static final int CONNECTION_REQUEST_TIMEOUT = 30000; + /** + * ms毫秒,建立链接超时时间 + */ + static final int CONNECT_TIMEOUT = 60000; + /** + * ms毫秒,读取超时时间 + */ + static final int SOCKET_TIMEOUT = 60000; - // 总配置,主要涉及是以下两个参数,如果要作调整没有用到properties会比较后麻烦,但鉴于一经粘贴,随处可用的特点,就不再做依赖性配置化处理了. - // 而且这个参数同一家公司基本不会变动. - static final int maxTotal = 500;// 最大总并发,很重要的参数 - static final int maxPerRoute = 100;// 每路并发,很重要的参数 + /** + * 总配置,主要涉及是以下两个参数,如果要作调整没有用到properties会比较后麻烦,但鉴于一经粘贴,随处可用的特点,就不再做依赖性配置化处理了. + * 而且这个参数同一家公司基本不会变动. + * 最大总并发,很重要的参数 + */ + static final int MAX_TOTAL = 500; + /** + * 每路并发,很重要的参数 + */ + static final int MAX_PER_ROUTE = 100; - // 正常情况这里应该配成MAP或LIST - // 细化配置参数,用来对每路参数做精细化处理,可以管控各ip的流量,比如默认配置请求baidu:80端口最大100个并发链接, - static final String detailHostName = "http://www.baidu.com";// 每个细化配置之ip(不重要,在特殊场景很有用) - // 每个细化配置之port(不重要,在特殊场景很有用) - static final int detailPort = 80; - // 每个细化配置之最大并发数(不重要,在特殊场景很有用) - static final int detailMaxPerRoute = 100; + /** + * 正常情况这里应该配成MAP或LIST + * 细化配置参数,用来对每路参数做精细化处理,可以管控各ip的流量,比如默认配置请求baidu:80端口最大100个并发链接, + * 每个细化配置之ip(不重要,在特殊场景很有用) + */ + static final String DETAIL_HOST_NAME = "http://www.baidu.com"; - private static CloseableHttpClient getHttpClient() { + /** + * 每个细化配置之port(不重要,在特殊场景很有用) + */ + static final int DETAIL_PORT = 80; + /** + * 每个细化配置之最大并发数(不重要,在特殊场景很有用) + */ + static final int DETAIL_MAX_PER_ROUTE = 100; + + private synchronized static CloseableHttpClient getHttpClient() { if (null == httpClient) { - synchronized (HttpClientUtils.class) { - if (null == httpClient) { - httpClient = init(); - } - } + httpClient = init(); } return httpClient; } @@ -75,65 +100,65 @@ public class HttpClientUtils { private static CloseableHttpClient init() { CloseableHttpClient newHotpoint; - // 设置连接池 + //设置连接池 ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory(); LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory(); Registry registry = RegistryBuilder.create().register("http", plainsf).register("https", sslsf).build(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry); - // 将最大连接数增加 - cm.setMaxTotal(maxTotal); - // 将每个路由基础的连接增加 - cm.setDefaultMaxPerRoute(maxPerRoute); + //将最大连接数增加 + cm.setMaxTotal(MAX_TOTAL); + //将每个路由基础的连接增加 + cm.setDefaultMaxPerRoute(MAX_PER_ROUTE); - // 细化配置开始,其实这里用Map或List的for循环来配置每个链接,在特殊场景很有用. - // 将每个路由基础的连接做特殊化配置,一般用不着 - HttpHost httpHost = new HttpHost(detailHostName, detailPort); - // 将目标主机的最大连接数增加 - cm.setMaxPerRoute(new HttpRoute(httpHost), detailMaxPerRoute); - // 细化配置结束 + //细化配置开始,其实这里用Map或List的for循环来配置每个链接,在特殊场景很有用. + //将每个路由基础的连接做特殊化配置,一般用不着 + HttpHost httpHost = new HttpHost(DETAIL_HOST_NAME, DETAIL_PORT); + //将目标主机的最大连接数增加 + cm.setMaxPerRoute(new HttpRoute(httpHost), DETAIL_MAX_PER_ROUTE); + //细化配置结束 - // 请求重试处理 + //请求重试处理 HttpRequestRetryHandler httpRequestRetryHandler = (exception, executionCount, context) -> { - if (executionCount >= 2) {// 如果已经重试了2次,就放弃 + if (executionCount >= 2) {//如果已经重试了2次,就放弃 return false; } - if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接,那么就重试 + if (exception instanceof NoHttpResponseException) {//如果服务器丢掉了连接,那么就重试 return true; } - if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常 + if (exception instanceof SSLHandshakeException) {//不要重试SSL握手异常 return false; } - if (exception instanceof InterruptedIOException) {// 超时 + if (exception instanceof InterruptedIOException) {//超时 return false; } - if (exception instanceof UnknownHostException) {// 目标服务器不可达 + if (exception instanceof UnknownHostException) {//目标服务器不可达 return false; } - if (exception instanceof SSLException) {// SSL握手异常 + if (exception instanceof SSLException) {//SSL握手异常 return false; } HttpClientContext clientContext = HttpClientContext.adapt(context); HttpRequest request = clientContext.getRequest(); - // 如果请求是幂等的,就再次尝试 + //如果请求是幂等的,就再次尝试 return !(request instanceof HttpEntityEnclosingRequest); }; - // 配置请求的超时设置 - RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connectionRequestTimeout).setConnectTimeout(connectTimeout).setSocketTimeout(socketTimeout).build(); + //配置请求的超时设置 + RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT).setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build(); newHotpoint = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(requestConfig).setRetryHandler(httpRequestRetryHandler).build(); return newHotpoint; } public static String doGet(String url, Map param) { - // httpClient + //httpClient CloseableHttpClient httpClient = getHttpClient(); String resultString = ""; CloseableHttpResponse response = null; try { - // 创建uri + //创建uri URIBuilder builder = new URIBuilder(url); if (param != null) { for (String key : param.keySet()) { @@ -142,91 +167,26 @@ public class HttpClientUtils { } URI uri = builder.build(); - // 创建http GET请求 + //创建http GET请求 HttpGet httpGet = new HttpGet(uri); - // 执行请求 + //执行请求 response = httpClient.execute(httpGet); - // 判断返回状态是否为200 + //判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } else { - System.out.println(response.getStatusLine().getStatusCode()); } } catch (Exception e) { - e.printStackTrace(); + log.error("get请求错误", e); } finally { try { if (response != null) { response.close(); } - httpClient.close(); } catch (IOException e) { - e.printStackTrace(); + log.error("Get错误", e); } } return resultString; } - - public static String doPost(String url, Map param) { - // 创建HttpClient对象 - CloseableHttpClient httpClient = getHttpClient(); - CloseableHttpResponse response = null; - String resultString = ""; - try { - // 创建Http Post请求 - HttpPost httpPost = new HttpPost(url); - // 创建参数列表 - if (param != null) { - List paramList = new ArrayList<>(); - for (String key : param.keySet()) { - paramList.add(new BasicNameValuePair(key, param.get(key))); - } - // 模拟表单 - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); - httpPost.setEntity(entity); - } - // 执行http请求 - response = httpClient.execute(httpPost); - resultString = EntityUtils.toString(response.getEntity(), "utf-8"); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - response.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return resultString; - } - - - public static String doPostJson(String url, String json) { - // 创建HttpClient对象 - CloseableHttpClient httpClient = getHttpClient(); - CloseableHttpResponse response = null; - String resultString = ""; - try { - // 创建Http Post请求 - HttpPost httpPost = new HttpPost(url); - // 创建请求内容 - StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); - httpPost.setEntity(entity); - // 执行http请求 - response = httpClient.execute(httpPost); - resultString = EntityUtils.toString(response.getEntity(), "utf-8"); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - response.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return resultString; - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/utils/HttpUtils.java b/framework/src/main/java/cn/lili/common/utils/HttpUtils.java new file mode 100644 index 00000000..706e805c --- /dev/null +++ b/framework/src/main/java/cn/lili/common/utils/HttpUtils.java @@ -0,0 +1,368 @@ +package cn.lili.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.xkcoding.http.HttpUtil; +import com.xkcoding.http.config.HttpConfig; +import com.xkcoding.http.support.HttpHeader; +import com.xkcoding.http.support.httpclient.HttpClientImpl; +import lombok.extern.slf4j.Slf4j; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Iterator; +import java.util.Map; + +/** + * HTTP 工具类 + * @author liushuai + */ +@Slf4j +public class HttpUtils { + + public HttpUtils(HttpConfig config) { + HttpUtil.setConfig(config); + HttpUtil.setHttp(new HttpClientImpl()); + } + + public HttpUtils() { + } + + + /** + * GET 请求 + * + * @param url URL + * @return 结果 + */ + public String get(String url) { + return HttpUtil.get(url); + } + + /** + * GET 请求 + * + * @param url URL + * @param params 参数 + * @param header 请求头 + * @param encode 是否需要 url encode + * @return 结果 + */ + public String get(String url, Map params, HttpHeader header, boolean encode) { + return HttpUtil.get(url, params, header, encode); + } + + /** + * POST 请求 + * + * @param url URL + * @return 结果 + */ + public String post(String url) { + return HttpUtil.post(url); + } + + /** + * POST 请求 + * + * @param url URL + * @param data JSON 参数 + * @return 结果 + */ + public String post(String url, String data) { + return HttpUtil.post(url, data); + } + + /** + * POST 请求 + * + * @param url URL + * @param data JSON 参数 + * @param header 请求头 + * @return 结果 + */ + public String post(String url, String data, HttpHeader header) { + return HttpUtil.post(url, data, header); + } + + /** + * POST 请求 + * + * @param url URL + * @param params form 参数 + * @param encode 是否需要 url encode + * @return 结果 + */ + public String post(String url, Map params, boolean encode) { + return HttpUtil.post(url, params, encode); + } + + /** + * POST 请求 + * + * @param url URL + * @param params form 参数 + * @param header 请求头 + * @param encode 是否需要 url encode + * @return 结果 + */ + public String post(String url, Map params, HttpHeader header, boolean encode) { + return HttpUtil.post(url, params, header, encode); + } + + + /** + * 静态方法运行参数 + */ + public static final int HTTP_CONN_TIMEOUT = 100000; + public static final int HTTP_SOCKET_TIMEOUT = 100000; + + /** + * POST 静态方法请求 + * + * @param reqUrl + * @param parameters + * @param encoding + * @param connectTimeout + * @param readTimeout + * @return + */ + public static String doPost(String reqUrl, Map parameters, String encoding, int connectTimeout, + int readTimeout) { + HttpURLConnection urlConn = null; + try { + urlConn = sendPost(reqUrl, parameters, encoding, connectTimeout, readTimeout); + String responseContent = getContent(urlConn, encoding); + return responseContent.trim(); + } finally { + if (urlConn != null) { + urlConn.disconnect(); + + } + } + } + + /** + * post携带json请求 静态方法 + * + * @param reqUrl 请求地址 + * @param jsonParameters 参数 + * @return + */ + public static String doPostWithJson(String reqUrl, Map jsonParameters) { + + BufferedReader reader = null; + try { + //创建连接 + URL url = new URL(reqUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + //设置请求方式 + connection.setRequestMethod("POST"); + //设置发送数据的格式 + connection.setRequestProperty("Content-Type", "application/json"); + connection.connect(); + //一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的 + //utf-8编码 + OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8); + out.append(JSONObject.toJSONString(jsonParameters)); + out.flush(); + out.close(); + //读取响应 + reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); + String line; + String res = ""; + while ((line = reader.readLine()) != null) { + res += line; + } + reader.close(); + + return res; + } catch (IOException e) { + log.error("post请求错误", e); + } + //自定义错误信息 + return "error"; + + } + + /** + * post携带json请求 静态方法 + * + * @param reqUrl 请求地址 + * @param object 对象 + * @return + */ + public static String doPostWithJson(String reqUrl, Object object) { + + BufferedReader reader = null; + try { + //创建连接 + URL url = new URL(reqUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + //设置请求方式 + connection.setRequestMethod("POST"); + //设置发送数据的格式 + connection.setRequestProperty("Content-Type", "application/json"); + connection.connect(); + //一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的 + //utf-8编码 + OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8); + out.append(JSONObject.toJSONString(object)); + out.flush(); + out.close(); + //读取响应 + reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); + String line; + String res = ""; + while ((line = reader.readLine()) != null) { + res += line; + } + reader.close(); + + return res; + } catch (IOException e) { + log.error("post错误", e); + } + //自定义错误信息 + return "error"; + + } + + /** + * 发送post请求 + * + * @param reqUrl + * @param parameters + * @param encoding + * @param connectTimeout + * @param readTimeout + * @return + */ + private static HttpURLConnection sendPost(String reqUrl, + Map parameters, String encoding, int connectTimeout, int readTimeout) { + HttpURLConnection urlConn = null; + try { + String params = generatorParamString(parameters, encoding); + URL url = new URL(reqUrl); + urlConn = (HttpURLConnection) url.openConnection(); + urlConn.setRequestMethod("POST"); + //(单位:毫秒)jdk + urlConn.setConnectTimeout(connectTimeout); + //(单位:毫秒)jdk 1.5换成这个,读操作超时 + urlConn.setReadTimeout(readTimeout); + urlConn.setDoOutput(true); + //String按照字节处理是一个好方法 + byte[] b = params.getBytes(encoding); + urlConn.getOutputStream().write(b, 0, b.length); + urlConn.getOutputStream().flush(); + urlConn.getOutputStream().close(); + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + return urlConn; + } + + /** + * get 请求 静态方法 + * + * @param urlConn + * @param encoding + * @return + */ + private static String getContent(HttpURLConnection urlConn, String encoding) { + try { + String responseContent = null; + InputStream in = urlConn.getInputStream(); + BufferedReader rd = new BufferedReader(new InputStreamReader(in, encoding)); + String tempLine = rd.readLine(); + StringBuffer tempStr = new StringBuffer(); + String crlf = System.getProperty("line.separator"); + while (tempLine != null) { + tempStr.append(tempLine); + tempStr.append(crlf); + tempLine = rd.readLine(); + } + responseContent = tempStr.toString(); + rd.close(); + in.close(); + return responseContent; + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + /** + * get 请求 静态方法 + * + * @param link + * @param encoding + * @return + */ + public static String doGet(String link, String encoding, int connectTimeout, int readTimeout) { + HttpURLConnection conn = null; + try { + URL url = new URL(link); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(connectTimeout); + conn.setReadTimeout(readTimeout); + BufferedInputStream in = new BufferedInputStream( + conn.getInputStream()); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + for (int i = 0; (i = in.read(buf)) > 0; ) { + out.write(buf, 0, i); + } + out.flush(); + String s = out.toString(encoding); + return s; + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } finally { + if (conn != null) { + conn.disconnect(); + conn = null; + } + } + } + + /** + * 将parameters中数据转换成用"&"链接的http请求参数形式 + * + * @param parameters + * @return + */ + private static String generatorParamString(Map parameters, String encoding) { + StringBuffer params = new StringBuffer(); + if (parameters != null) { + for (Iterator iter = parameters.keySet().iterator(); iter + .hasNext(); ) { + String name = iter.next(); + String value = parameters.get(name); + params.append(name + "="); + try { + params.append(URLEncoder.encode(value, encoding)); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e.getMessage(), e); + } catch (Exception e) { + String message = String.format("'%s'='%s'", name, value); + throw new RuntimeException(message, e); + } + if (iter.hasNext()) { + params.append("&"); + } + } + } + return params.toString(); + } +} diff --git a/framework/src/main/java/cn/lili/common/utils/IpHelper.java b/framework/src/main/java/cn/lili/common/utils/IpHelper.java index 793fc28a..23fd6d95 100644 --- a/framework/src/main/java/cn/lili/common/utils/IpHelper.java +++ b/framework/src/main/java/cn/lili/common/utils/IpHelper.java @@ -4,7 +4,6 @@ package cn.lili.common.utils; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.http.HttpUtil; -import cn.lili.modules.connect.util.IpUtils; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; @@ -23,27 +22,31 @@ import javax.servlet.http.HttpServletRequest; @Component public class IpHelper { - //qq lbs 地区查询key + /** + * qq lbs 地区查询key + */ @Value("${lili.lbs.key}") private String key; - //qq lbs 地区查询key + /** + * qq lbs 地区查询key + */ @Value("${lili.lbs.sk}") private String sk; - private static final String api = "https://apis.map.qq.com"; + private static final String API = "https://apis.map.qq.com"; /** * 获取IP返回地理信息 * - * @param - * @return + * @param request 请求参数 + * @return 城市信息 */ public String getIpCity(HttpServletRequest request) { String url = "/ws/location/v1/ip?key=" + key + "&ip=" + IpUtils.getIpAddress(request); String sign = SecureUtil.md5(url + sk); - url = api + url + "&sign=" + sign; + url = API + url + "&sign=" + sign; String result = "未知"; try { String json = HttpUtil.get(url, 3000); diff --git a/framework/src/main/java/cn/lili/modules/connect/util/IpUtils.java b/framework/src/main/java/cn/lili/common/utils/IpUtils.java similarity index 85% rename from framework/src/main/java/cn/lili/modules/connect/util/IpUtils.java rename to framework/src/main/java/cn/lili/common/utils/IpUtils.java index 35a9e3b6..5672e934 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/IpUtils.java +++ b/framework/src/main/java/cn/lili/common/utils/IpUtils.java @@ -1,4 +1,6 @@ -package cn.lili.modules.connect.util; +package cn.lili.common.utils; + +import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; @@ -11,6 +13,7 @@ import java.net.UnknownHostException; * @version v1.0 * 2020-12-08 15:32 */ +@Slf4j public class IpUtils { /** @@ -22,7 +25,7 @@ public class IpUtils { try { return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { - e.printStackTrace(); + log.error("获取本机IP错误",e); return null; } } @@ -45,14 +48,14 @@ public class IpUtils { if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } - // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 + //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if (ip != null && ip.length() > 15) { if (ip.indexOf(",") > 0) { ip = ip.substring(0, ip.indexOf(",")); } } if ("0:0:0:0:0:0:0:1".equals(ip)) { - ip = "127.0.0.1"; + ip = "106.124.130.167"; } return ip; } diff --git a/framework/src/main/java/cn/lili/common/utils/JasyptUtil.java b/framework/src/main/java/cn/lili/common/utils/JasyptUtil.java index d1b7ced3..b756fcef 100644 --- a/framework/src/main/java/cn/lili/common/utils/JasyptUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/JasyptUtil.java @@ -14,29 +14,32 @@ public class JasyptUtil { * Jasypt生成加密结果 * @param password 配置文件中设定的加密密码 jasypt.encryptor.password * @param value 待加密值 - * @return + * @return 加密字符串 */ - public static String encyptPwd(String password,String value){ + public static String encryptPwd(String password, String value){ PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); - encryptor.setConfig(cryptor(password)); - String result = encryptor.encrypt(value); - return result; + encryptor.setConfig(encryptor(password)); + return encryptor.encrypt(value); } /** * 解密 * @param password 配置文件中设定的加密密码 jasypt.encryptor.password * @param value 待解密密文 - * @return + * @return 揭秘字符串 */ - public static String decyptPwd(String password,String value){ + public static String decryptPwd(String password, String value){ PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); - encryptor.setConfig(cryptor(password)); + encryptor.setConfig(encryptor(password)); encryptor.decrypt(value); - String result = encryptor.decrypt(value); - return result; + return encryptor.decrypt(value); } - public static SimpleStringPBEConfig cryptor(String password){ + /** + * 加密处理 + * @param password 密码 + * @return 加密字符串 + */ + public static SimpleStringPBEConfig encryptor(String password){ SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(password); config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); @@ -52,8 +55,8 @@ public class JasyptUtil { public static void main(String[] args){ //加密 若修改了第一个参数加密password记得在配置文件同步修改 - System.out.println(encyptPwd("jasypt.encryptor.password","123456")); + System.out.println(encryptPwd("jasypt.encryptor.password","123456")); //解密 - System.out.println(decyptPwd("jasypt.encryptor.password","PYVnAYh+j5C3jkMV1d+myj6JzDaUk7pcfTWUaYsvQdEVkuvIVf7Y0mOU9XkffxT8")); + System.out.println(decryptPwd("jasypt.encryptor.password","PYVnAYh+j5C3jkMV1d+myj6JzDaUk7pcfTWUaYsvQdEVkuvIVf7Y0mOU9XkffxT8")); } } diff --git a/framework/src/main/java/cn/lili/common/utils/PasswordUtil.java b/framework/src/main/java/cn/lili/common/utils/PasswordUtil.java deleted file mode 100644 index ac534b72..00000000 --- a/framework/src/main/java/cn/lili/common/utils/PasswordUtil.java +++ /dev/null @@ -1,157 +0,0 @@ -package cn.lili.common.utils; - -import java.security.Key; -import java.security.SecureRandom; - -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEKeySpec; -import javax.crypto.spec.PBEParameterSpec; - -public class PasswordUtil { - - /** - * JAVA6支持以下任意一种算法 - * PBEWITHMD5ANDDES - * PBEWITHMD5ANDTRIPLEDES - * PBEWITHSHAANDDESEDE - * PBEWITHSHA1ANDRC2_40 - * PBKDF2WITHHMACSHA1 - * */ - - /** - * 定义使用的算法为:PBEWITHMD5andDES算法 - */ - public static final String ALGORITHM = "PBEWithMD5AndDES"; - - /** - * 定义迭代次数为1000次 - */ - private static final int ITERATIONCOUNT = 1000; - - /** - * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. - * 盐长度必须为8字节 - * - * @return byte[] 盐值 - */ - public static byte[] getSalt() throws Exception { - //实例化安全随机数 - SecureRandom random = new SecureRandom(); - //产出盐 - return random.generateSeed(8); - } - - /** - * 根据PBE密码生成一把密钥 - * - * @param password 生成密钥时所使用的密码 - * @return Key PBE算法密钥 - */ - private static Key getPBEKey(String password) throws Exception { - // 实例化使用的算法 - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); - // 设置PBE密钥参数 - PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); - // 生成密钥 - SecretKey secretKey = keyFactory.generateSecret(keySpec); - - return secretKey; - } - - /** - * 加密明文字符串 - * - * @param plaintext 待加密的明文字符串 - * @param password 生成密钥时所使用的密码 - * @param salt 盐值 - * @return 加密后的密文字符串 - * @throws Exception - */ - public static String encrypt(String plaintext, String password, byte[] salt) throws Exception { - - Key key = getPBEKey(password); - - PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT); - - Cipher cipher = Cipher.getInstance(ALGORITHM); - - cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec); - - byte encipheredData[] = cipher.doFinal(plaintext.getBytes()); - - return bytesToHexString(encipheredData); - } - - /** - * 解密密文字符串 - * - * @param ciphertext 待解密的密文字符串 - * @param password 生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致) - * @param salt 盐值(如需解密,该参数需要与加密时使用的一致) - * @return 解密后的明文字符串 - * @throws Exception - */ - public static String decrypt(String ciphertext, String password, byte[] salt) throws Exception { - - Key key = getPBEKey(password); - - PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT); - - Cipher cipher = Cipher.getInstance(ALGORITHM); - - cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec); - - byte[] passDec = cipher.doFinal(hexStringToBytes(ciphertext)); - - return new String(passDec); - } - - /** - * 将字节数组转换为十六进制字符串 - * - * @param src 字节数组 - * @return - */ - public static String bytesToHexString(byte[] src) { - StringBuilder stringBuilder = new StringBuilder(""); - if (src == null || src.length <= 0) { - return null; - } - for (int i = 0; i < src.length; i++) { - int v = src[i] & 0xFF; - String hv = Integer.toHexString(v); - if (hv.length() < 2) { - stringBuilder.append(0); - } - stringBuilder.append(hv); - } - return stringBuilder.toString(); - } - - /** - * 将十六进制字符串转换为字节数组 - * - * @param hexString 十六进制字符串 - * @return - */ - public static byte[] hexStringToBytes(String hexString) { - if (hexString == null || hexString.equals("")) { - return null; - } - hexString = hexString.toUpperCase(); - int length = hexString.length() / 2; - char[] hexChars = hexString.toCharArray(); - byte[] d = new byte[length]; - for (int i = 0; i < length; i++) { - int pos = i * 2; - d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); - } - return d; - } - - private static byte charToByte(char c) { - return (byte) "0123456789ABCDEF".indexOf(c); - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/utils/RedisUtil.java b/framework/src/main/java/cn/lili/common/utils/RedisUtil.java deleted file mode 100644 index 26266c28..00000000 --- a/framework/src/main/java/cn/lili/common/utils/RedisUtil.java +++ /dev/null @@ -1,646 +0,0 @@ -package cn.lili.common.utils; - -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.DefaultTypedTuple; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -/** - * Redis封装工具类 - * - * @author paulG - * @since 2020/11/7 - **/ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class RedisUtil { - - private final RedisTemplate redisTemplate; - - //=============================common============================ - - /** - * 指定缓存失效时间 - * - * @param key 键 - * @param time 时间(秒) - * @return - */ - public boolean expire(String key, long time) { - try { - if (time > 0) { - redisTemplate.expire(key, time, TimeUnit.SECONDS); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 根据key 获取过期时间 - * - * @param key 键 不能为null - * @return 时间(秒) 返回0代表为永久有效 - */ - public long getExpire(String key) { - return redisTemplate.getExpire(key, TimeUnit.SECONDS); - } - - /** - * 判断key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public boolean hasKey(String key) { - try { - return redisTemplate.hasKey(key); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除缓存 - * - * @param key 可以传一个值 或多个 - */ - @SuppressWarnings("unchecked") - public void del(String... key) { - if (key != null && key.length > 0) { - if (key.length == 1) { - redisTemplate.delete(key[0]); - } else { - redisTemplate.delete(CollectionUtils.arrayToList(key)); - } - } - } - - //============================String============================= - - /** - * 普通缓存获取 - * - * @param key 键 - * @return 值 - */ - public Object get(String key) { - return key == null ? null : redisTemplate.opsForValue().get(key); - } - - - /** - * 普通缓存获取 - * - * @param key 键 - * @return 值 - */ - public T get(String key, Class clazz) { - Object o = key == null ? null : redisTemplate.opsForValue().get(key); - return (T) o; - } - - /** - * 普通缓存放入 - * - * @param key 键 - * @param value 值 - * @return true成功 false失败 - */ - public boolean set(String key, Object value) { - try { - redisTemplate.opsForValue().set(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - - } - - /** - * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 - * @return true成功 false 失败 - */ - public boolean set(String key, Object value, long time) { - try { - if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } else { - set(key, value); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 递增 - * - * @param key 键 - * @return - */ - public long incr(String key, long delta) { - if (delta < 0) { - throw new RuntimeException("递增因子必须大于0"); - } - return redisTemplate.opsForValue().increment(key, delta); - } - - /** - * 递减 - * - * @param key 键 - * @return - */ - public long decr(String key, long delta) { - if (delta < 0) { - throw new RuntimeException("递减因子必须大于0"); - } - return redisTemplate.opsForValue().increment(key, -delta); - } - - //================================Map================================= - - /** - * HashGet - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return 值 - */ - public Object hget(String key, String item) { - return redisTemplate.opsForHash().get(key, item); - } - - /** - * 获取hashKey对应的所有键值 - * - * @param key 键 - * @return 对应的多个键值 - */ - public Map hmget(String key) { - return redisTemplate.opsForHash().entries(key); - } - - /** - * HashSet - * - * @param key 键 - * @param map 对应多个键值 - * @return true 成功 false 失败 - */ - public boolean hmset(String key, Map map) { - try { - redisTemplate.opsForHash().putAll(key, map); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * HashSet 并设置时间 - * - * @param key 键 - * @param map 对应多个键值 - * @param time 时间(秒) - * @return true成功 false失败 - */ - public boolean hmset(String key, Map map, long time) { - try { - redisTemplate.opsForHash().putAll(key, map); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value) { - try { - redisTemplate.opsForHash().put(key, item, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value, long time) { - try { - redisTemplate.opsForHash().put(key, item, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除hash表中的值 - * - * @param key 键 不能为null - * @param item 项 可以使多个 不能为null - */ - public void hdel(String key, Object... item) { - redisTemplate.opsForHash().delete(key, item); - } - - /** - * 判断hash表中是否有该项的值 - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return true 存在 false不存在 - */ - public boolean hHasKey(String key, String item) { - return redisTemplate.opsForHash().hasKey(key, item); - } - - /** - * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * - * @param key 键 - * @param item 项 - * @param by 要增加几(大于0) - * @return - */ - public double hincr(String key, String item, double by) { - return redisTemplate.opsForHash().increment(key, item, by); - } - - /** - * hash递减 - * - * @param key 键 - * @param item 项 - * @param by 要减少记(小于0) - * @return - */ - public double hdecr(String key, String item, double by) { - return redisTemplate.opsForHash().increment(key, item, -by); - } - - //============================set============================= - - /** - * 根据key获取Set中的所有值 - * - * @param key 键 - * @return - */ - public Set sGet(String key) { - try { - return redisTemplate.opsForSet().members(key); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 根据value从一个set中查询,是否存在 - * - * @param key 键 - * @param value 值 - * @return true 存在 false不存在 - */ - public boolean sHasKey(String key, Object value) { - try { - return redisTemplate.opsForSet().isMember(key, value); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将数据放入set缓存 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSet(String key, Object... values) { - try { - return redisTemplate.opsForSet().add(key, values); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 将set数据放入缓存 - * - * @param key 键 - * @param time 时间(秒) - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSetAndTime(String key, long time, Object... values) { - try { - Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 获取set缓存的长度 - * - * @param key 键 - * @return - */ - public long sGetSetSize(String key) { - try { - return redisTemplate.opsForSet().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 移除值为value的 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 移除的个数 - */ - public long setRemove(String key, Object... values) { - try { - Long count = redisTemplate.opsForSet().remove(key, values); - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - //===============================listByParentId================================= - - /** - * 获取list缓存的内容 - * - * @param key 键 - * @param start 开始 - * @param end 结束 0 到 -1代表所有值 - * @return - */ - public List lGet(String key, long start, long end) { - try { - return redisTemplate.opsForList().range(key, start, end); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 获取list缓存的长度 - * - * @param key 键 - * @return - */ - public long lGetListSize(String key) { - try { - return redisTemplate.opsForList().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 通过索引 获取list中的值 - * - * @param key 键 - * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 - * @return - */ - public Object lGetIndex(String key, long index) { - try { - return redisTemplate.opsForList().index(key, index); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, Object value) { - try { - redisTemplate.opsForList().rightPush(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, Object value, long time) { - try { - redisTemplate.opsForList().rightPush(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, List value) { - try { - redisTemplate.opsForList().rightPushAll(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lPush(String key, List value) { - try { - redisTemplate.opsForList().leftPushAll(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) - * @return - */ - public boolean lSet(String key, List value, long time) { - try { - redisTemplate.opsForList().rightPushAll(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 根据索引修改list中的某条数据 - * - * @param key 键 - * @param index 索引 - * @param value 值 - * @return - */ - public boolean lUpdateIndex(String key, long index, Object value) { - try { - redisTemplate.opsForList().set(key, index, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 移除N个值为value - * - * @param key 键 - * @param count 移除多少个 - * @param value 值 - * @return 移除的个数 - */ - public long lRemove(String key, long count, Object value) { - try { - Long remove = redisTemplate.opsForList().remove(key, count, value); - return remove; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - //===============================ZSet================================= - - /** - * 向Zset里添加成员 - * - * @param key - * @param score - * @param value - * @return - */ - public boolean zadd(String key, long score, String value) { - Boolean result = redisTemplate.opsForZSet().add(key, value, score); - return result; - - } - - - /** - * 获取 某key 下 某一分值区间的队列 - * - * @param key - * @param from - * @param to - * @return - */ - public Set zrangeByScoreWithScores(String key, int from, long to) { - Set set = redisTemplate.opsForZSet().rangeByScoreWithScores(key, from, to); - return set; - } - - /** - * 移除 Zset队列值 - * - * @param key - * @param value - * @return - */ - public Long zremove(String key, String... value) { - return redisTemplate.opsForZSet().remove(key, value); - - } - -} diff --git a/framework/src/main/java/cn/lili/common/utils/RegularUtil.java b/framework/src/main/java/cn/lili/common/utils/RegularUtil.java index 1915c4db..3bbf9dba 100644 --- a/framework/src/main/java/cn/lili/common/utils/RegularUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/RegularUtil.java @@ -1,12 +1,11 @@ package cn.lili.common.utils; -import lombok.extern.slf4j.Slf4j; - import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 用户名验证工具类 + * * @author Chopper */ public class RegularUtil { @@ -15,28 +14,95 @@ public class RegularUtil { /** * 手机号 */ - private static final Pattern mobile = Pattern.compile("^1[3|4|5|8][0-9]\\d{8}$"); + private static final Pattern MOBILE = Pattern.compile("^1[3|4|5|8][0-9]\\d{8}$"); /** * 邮箱 */ - private static final Pattern email = Pattern.compile("^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$"); + private static final Pattern EMAIL = Pattern.compile("^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$"); - public static boolean Mobile(String v){ + //sql正则 - Matcher m = mobile.matcher(v); - if(m.matches()){ + static Pattern sqlPattern = Pattern.compile("(select|update|and|delete|insert|trancate|char|substr|ascii|declare|exec|count|master|into|drop|execute" + +// 可能涉及英文查询参数问题 +// "|in|not in exists|not exists" + +// "|between|not between" + +// "|like|not like" + +// "|is null|is not null" + + ")", Pattern.CASE_INSENSITIVE); + + //符号正则 + static Pattern symbolPattern = Pattern.compile("[\\s~·`!!@#¥$%^……&*(())\\-——\\-_=+【\\[\\]】{{}}\\|、\\\\;;::‘'“”\",,《<。.》>、/??]"); + + + /** + * 校验手机号 + * + * @param v + * @return + */ + public static boolean mobile(String v) { + + Matcher m = MOBILE.matcher(v); + if (m.matches()) { return true; } return false; } - public static boolean Email(String v){ + //校验邮箱 + public static boolean email(String v) { - Matcher m = email.matcher(v); - if(m.matches()){ + Matcher m = EMAIL.matcher(v); + if (m.matches()) { return true; } return false; } + + + /** + * 搜索参数过滤 + * + * @param str 字符串 + * @return 过滤后的字符串 + */ + public static String replace(String str) { + + return symbolReplace(sqlReplace(str)); + } + + /** + * 过滤sql关键字 + * + * @param str 字符串 + * @return 过滤后的字符串 + */ + public static String sqlReplace(String str) { + if (StringUtils.isEmpty(str)) { + return ""; + } + Matcher sqlMatcher = sqlPattern.matcher(str); + return sqlMatcher.replaceAll(""); + } + + /** + * 符号过滤 + * + * @param str 字符串 + * @return 过滤后的字符串 + */ + public static String symbolReplace(String str) { + if (StringUtils.isEmpty(str)) { + return ""; + } + Matcher symbolMatcher = symbolPattern.matcher(str); + return symbolMatcher.replaceAll(""); + } + + public static void main(String[] args) { + System.out.println(replace("selectSELECTINORNOTIN123阿松大asdfa!@#$%^&&*()_+{}[]!?>?").trim()); + } + + } diff --git a/framework/src/main/java/cn/lili/common/utils/SnowFlake.java b/framework/src/main/java/cn/lili/common/utils/SnowFlake.java index d7a788cc..e3cb3d70 100644 --- a/framework/src/main/java/cn/lili/common/utils/SnowFlake.java +++ b/framework/src/main/java/cn/lili/common/utils/SnowFlake.java @@ -2,6 +2,7 @@ package cn.lili.common.utils; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; +import lombok.extern.slf4j.Slf4j; import java.util.Date; @@ -10,18 +11,29 @@ import java.util.Date; * * @author Chopper */ +@Slf4j public class SnowFlake { - /** - * 机器id - */ - private static long workerId = 0L; - /** - * 机房id - */ - private static long datacenterId = 0L; +// /** +// * 机器id +// */ +// private static long workerId = 0L; +// /** +// * 机房id +// */ +// public static long datacenterId = 0L; - private static Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId); + private static Snowflake snowflake; + + /** + * 初始化配置 + * + * @param workerId + * @param datacenterId + */ + public static void initialize(long workerId, long datacenterId) { + snowflake = IdUtil.getSnowflake(workerId, datacenterId); + } public static long getId() { return snowflake.nextId(); @@ -29,12 +41,14 @@ public class SnowFlake { /** * 生成字符,带有前缀 + * * @param prefix * @return */ public static String createStr(String prefix) { return prefix + DateUtil.toString(new Date(), "yyyyMMdd") + SnowFlake.getId(); } + public static String getIdStr() { return snowflake.nextId() + ""; } diff --git a/framework/src/main/java/cn/lili/common/utils/SnowflakeInitiator.java b/framework/src/main/java/cn/lili/common/utils/SnowflakeInitiator.java new file mode 100644 index 00000000..8ffbba1f --- /dev/null +++ b/framework/src/main/java/cn/lili/common/utils/SnowflakeInitiator.java @@ -0,0 +1,54 @@ +package cn.lili.common.utils; + +import cn.lili.cache.Cache; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * SnowflakeInitiator + * + * @author Chopper + * @version v1.0 + * 2022-01-14 14:04 + */ +@Component +@Slf4j +public class SnowflakeInitiator { + + /** + * 缓存前缀 + */ + private static final String KEY = "{Snowflake}"; + + @Autowired + private Cache cache; + + /** + * 尝试初始化 + * + * @return + */ + @PostConstruct + public void init() { + Long num = cache.incr(KEY); + long dataCenter = num / 32; + long workedId = num % 32; + //如果数据中心大于32,则抹除缓存,从头开始 + if (dataCenter >= 32) { + cache.remove(KEY); + num = cache.incr(KEY); + dataCenter = num / 32; + workedId = num % 32; + } + SnowFlake.initialize(workedId, dataCenter); + } + + public static void main(String[] args) { + SnowFlake.initialize(0, 8); + + System.out.println(SnowFlake.getId()); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/utils/SpelUtil.java b/framework/src/main/java/cn/lili/common/utils/SpelUtil.java index ee76c848..02cff602 100644 --- a/framework/src/main/java/cn/lili/common/utils/SpelUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/SpelUtil.java @@ -17,10 +17,13 @@ import org.springframework.expression.spel.support.StandardEvaluationContext; public class SpelUtil { - // spel表达式解析器 + /** + * spel表达式解析器 + */ private static SpelExpressionParser spelExpressionParser = new SpelExpressionParser(); - - // 参数名发现器 + /** + * 参数名发现器 + */ private static DefaultParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); /** @@ -30,8 +33,8 @@ public class SpelUtil { * @param spel * @return */ - public static String compileParams(JoinPoint joinPoint, String spel) { // Spel表达式解析日志信息 - // 获得方法参数名数组 + public static String compileParams(JoinPoint joinPoint, String spel) { //Spel表达式解析日志信息 + //获得方法参数名数组 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String[] parameterNames = parameterNameDiscoverer.getParameterNames(signature.getMethod()); @@ -41,7 +44,8 @@ public class SpelUtil { //获取方法参数值 Object[] args = joinPoint.getArgs(); for (int i = 0; i < args.length; i++) { - context.setVariable(parameterNames[i], args[i]); // 替换spel里的变量值为实际值, 比如 #user --> user对象 + //替换spel里的变量值为实际值, 比如 #user --> user对象 + context.setVariable(parameterNames[i], args[i]); } return spelExpressionParser.parseExpression(spel).getValue(context).toString(); } @@ -55,8 +59,8 @@ public class SpelUtil { * @param spel * @return */ - public static String compileParams(JoinPoint joinPoint, Object rvt, String spel) { // Spel表达式解析日志信息 - // 获得方法参数名数组 + public static String compileParams(JoinPoint joinPoint, Object rvt, String spel) { //Spel表达式解析日志信息 + //获得方法参数名数组 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String[] parameterNames = parameterNameDiscoverer.getParameterNames(signature.getMethod()); @@ -66,7 +70,8 @@ public class SpelUtil { //获取方法参数值 Object[] args = joinPoint.getArgs(); for (int i = 0; i < args.length; i++) { - context.setVariable(parameterNames[i], args[i]); // 替换spel里的变量值为实际值, 比如 #user --> user对象 + //替换spel里的变量值为实际值, 比如 #user --> user对象 + context.setVariable(parameterNames[i], args[i]); } context.setVariable("rvt", rvt); return spelExpressionParser.parseExpression(spel).getValue(context).toString(); diff --git a/framework/src/main/java/cn/lili/common/utils/StringUtils.java b/framework/src/main/java/cn/lili/common/utils/StringUtils.java index cbb4547f..bf9df5b6 100644 --- a/framework/src/main/java/cn/lili/common/utils/StringUtils.java +++ b/framework/src/main/java/cn/lili/common/utils/StringUtils.java @@ -9,9 +9,10 @@ import java.lang.reflect.Method; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 字串工具类 @@ -46,99 +47,6 @@ public class StringUtils extends StrUtil { return result.toString(); } - /** - * 将object转为数字 - * - * @param obj 需要转object的对象 - * @param checked 如果为true格式不正确抛出异常 - * @return - */ - public static int toInt(Object obj, boolean checked) { - int value = 0; - if (obj == null) { - return 0; - } - try { - value = Integer.parseInt(obj.toString()); - } catch (Exception ex) { - if (checked) { - throw new RuntimeException("整型数字格式不正确"); - } else { - return 0; - } - } - return value; - } - - /** - * 将一个字串转为long,如果无空,则返回默认值 - * - * @param str 要转换的数字字串 - * @param defaultValue 默认值 - * @return - */ - public static Long toLong(String str, Long defaultValue) { - Long value = defaultValue; - if (str == null || "".equals(str)) { - return defaultValue; - } - try { - value = Long.parseLong(str); - } catch (Exception ex) { - return defaultValue; - } - return value; - } - - /** - * 将一个object转为double 如果object 为 null 则返回0; - * - * @param obj 需要转成Double的对象 - * @param checked 如果为true格式不正确抛出异常 - * @return - */ - public static Double toDouble(Object obj, boolean checked) { - Double value = 0d; - if (obj == null) { - if (checked) { - throw new RuntimeException("数字格式不正确"); - } else { - return 0D; - } - } - try { - value = Double.valueOf(obj.toString()); - } catch (Exception ex) { - if (checked) { - throw new RuntimeException("数字格式不正确"); - } else { - return 0D; - } - } - return value; - } - - /** - * 将一个字串转为Double,如果无空,则返回默认值 - * - * @param str 要转换的数字字串 - * @param defaultValue 默认值 - * @return - */ - public static Double toDouble(String str, Double defaultValue) { - Double value = defaultValue; - if (str == null || "".equals(str)) { - return 0d; - } - try { - value = Double.valueOf(str); - } catch (Exception ex) { - ex.printStackTrace(); - value = defaultValue; - } - return value; - } - /** * 获取随机数 * @@ -155,18 +63,6 @@ public class StringUtils extends StrUtil { return sRand; } - - /** - * 判断一个数组是否为空,并且长度大于0 - * - * @param list - * @return true 不空/false 空 - */ - public static boolean isNotEmpty(List list) { - - return list != null && list.size() > 0; - } - /** * 切个字符串,如果超出长度则切割 * @@ -192,7 +88,7 @@ public class StringUtils extends StrUtil { if (obj == null) { return null; } - Map map = new HashMap(); + Map map = new HashMap(16); BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); @@ -250,6 +146,50 @@ public class StringUtils extends StrUtil { } return str.concat(appendStr); } + + /** + * 切割字符串 + * + * @param str 字符串 + * @param length 长度 + * @return 处理后的字符串 + */ + public static String sub(String str, Integer length) { + if (str.length() < length) { + return str; + } + return str.substring(0, length); + } + + /** + * 过滤特殊字符串 + * + * @param str + * @return + */ + public static String filterSpecialChart(String str) { + String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(str); + return m.replaceAll("").trim(); + } + + /** + * double 转价格字符串 + * + * @return + */ + public static String toFen(Double doubleValue) { + String str = doubleValue.toString(); + + if (!str.contains(".")) { + str = str + ".00"; + } else if (str.substring(str.indexOf(".")).length() == 2) { + str = str + "0"; + } + return str; + } + } diff --git a/framework/src/main/java/cn/lili/common/utils/ThreadPoolUtil.java b/framework/src/main/java/cn/lili/common/utils/ThreadPoolUtil.java index 6867dea8..5a62281a 100644 --- a/framework/src/main/java/cn/lili/common/utils/ThreadPoolUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/ThreadPoolUtil.java @@ -22,12 +22,15 @@ public class ThreadPoolUtil { /** * 线程缓冲队列 */ - private static final BlockingQueue bqueue = new ArrayBlockingQueue(100); - private static final ThreadPoolExecutor pool = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL, ALIVE_TIME, TimeUnit.MILLISECONDS, bqueue, new ThreadPoolExecutor.CallerRunsPolicy()); - public static ThreadPoolExecutor threadPool; + private static final BlockingQueue BQUEUE = new ArrayBlockingQueue(100); + private static final ThreadPoolExecutor POOL = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL, ALIVE_TIME, TimeUnit.MILLISECONDS, BQUEUE, new ThreadPoolExecutor.CallerRunsPolicy()); + /** + * volatile禁止指令重排 + */ + public static volatile ThreadPoolExecutor threadPool; static { - pool.prestartAllCoreThreads(); + POOL.prestartAllCoreThreads(); } /** @@ -49,29 +52,27 @@ public class ThreadPoolUtil { } /** - * dcs获取线程池 + * DCL获取线程池 * * @return 线程池对象 */ public static ThreadPoolExecutor getThreadPool() { if (threadPool != null) { return threadPool; - } else { - synchronized (ThreadPoolUtil.class) { - if (threadPool == null) { - threadPool = (ThreadPoolExecutor) Executors.newCachedThreadPool(); - return threadPool; - } - return threadPool; + } + synchronized (ThreadPoolUtil.class) { + if (threadPool == null) { + threadPool = (ThreadPoolExecutor) Executors.newCachedThreadPool(); } } + return threadPool; } public static ThreadPoolExecutor getPool() { - return pool; + return POOL; } public static void main(String[] args) { - System.out.println(pool.getPoolSize()); + System.out.println(POOL.getPoolSize()); } } diff --git a/framework/src/main/java/cn/lili/modules/connect/util/UuidUtils.java b/framework/src/main/java/cn/lili/common/utils/UuidUtils.java similarity index 98% rename from framework/src/main/java/cn/lili/modules/connect/util/UuidUtils.java rename to framework/src/main/java/cn/lili/common/utils/UuidUtils.java index af9b2cdd..b9f17bcb 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/UuidUtils.java +++ b/framework/src/main/java/cn/lili/common/utils/UuidUtils.java @@ -1,4 +1,4 @@ -package cn.lili.modules.connect.util; +package cn.lili.common.utils; import java.nio.charset.StandardCharsets; import java.util.concurrent.ThreadLocalRandom; diff --git a/framework/src/main/java/cn/lili/common/validation/EnumValue.java b/framework/src/main/java/cn/lili/common/validation/EnumValue.java new file mode 100644 index 00000000..b22332c6 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/validation/EnumValue.java @@ -0,0 +1,44 @@ +package cn.lili.common.validation; + +import cn.lili.common.validation.impl.EnumValuesValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 枚举值校验注解 + * + * @author Bulbasaur + */ +@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = {EnumValuesValidator.class}) +public @interface EnumValue { + + String message() default "必须为指定值"; + + String[] strValues() default {}; + + int[] intValues() default {}; + + //分组 + Class[] groups() default {}; + + //负载 + Class[] payload() default {}; + + + @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE}) + @Retention(RUNTIME) + @Documented + @interface List { + EnumValue[] value(); + } +} diff --git a/framework/src/main/java/cn/lili/common/validation/Mobile.java b/framework/src/main/java/cn/lili/common/validation/Mobile.java index 374b37f0..578888bc 100644 --- a/framework/src/main/java/cn/lili/common/validation/Mobile.java +++ b/framework/src/main/java/cn/lili/common/validation/Mobile.java @@ -1,6 +1,7 @@ package cn.lili.common.validation; import cn.lili.common.validation.impl.MobileValidator; +import cn.lili.common.validation.impl.PhoneValidator; import javax.validation.Constraint; import javax.validation.Payload; @@ -12,7 +13,7 @@ import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** - * 手机号码校验注解 + * 电话号码校验注解 * * @author Bulbasaur */ @@ -22,9 +23,9 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; @Constraint(validatedBy = {MobileValidator.class}) public @interface Mobile { - String regexp() default "1[3|4|5|7|8]\\d{9}"; + String regexp() default ""; - String message() default "手机号码格式不正确"; + String message() default "电话号码格式不正确"; Class[] groups() default {}; diff --git a/framework/src/main/java/cn/lili/common/validation/Phone.java b/framework/src/main/java/cn/lili/common/validation/Phone.java new file mode 100644 index 00000000..9acdd3b9 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/validation/Phone.java @@ -0,0 +1,32 @@ +package cn.lili.common.validation; + +import cn.lili.common.validation.impl.PhoneValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 手机号码校验注解 + * + * @author Bulbasaur + */ +@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = {PhoneValidator.class}) +public @interface Phone { + + String regexp() default "1[3|4|5|7|8]\\d{9}"; + + String message() default "手机号码格式不正确"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/framework/src/main/java/cn/lili/common/validation/impl/EnumValuesValidator.java b/framework/src/main/java/cn/lili/common/validation/impl/EnumValuesValidator.java new file mode 100644 index 00000000..97ee0ea2 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/validation/impl/EnumValuesValidator.java @@ -0,0 +1,42 @@ +package cn.lili.common.validation.impl; + +import cn.lili.common.validation.EnumValue; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 枚举之校验 + * + * @author Bulbasaur + * @since 2021/7/9 1:41 上午 + */ +public class EnumValuesValidator implements ConstraintValidator { + + private String[] strValues; + private int[] intValues; + + @Override + public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) { + if (o instanceof String) { + for (String s : strValues) { + if (s.equals(o)) { + return true; + } + } + } else if (o instanceof Integer) { + for (int s : intValues) { + if (s == ((Integer) o).intValue()) { + return true; + } + } + } + return false; + } + + @Override + public void initialize(EnumValue constraintAnnotation) { + strValues = constraintAnnotation.strValues(); + intValues = constraintAnnotation.intValues(); + } +} diff --git a/framework/src/main/java/cn/lili/common/validation/impl/MobileValidator.java b/framework/src/main/java/cn/lili/common/validation/impl/MobileValidator.java index add99847..c0b4e7e9 100644 --- a/framework/src/main/java/cn/lili/common/validation/impl/MobileValidator.java +++ b/framework/src/main/java/cn/lili/common/validation/impl/MobileValidator.java @@ -7,17 +7,36 @@ import javax.validation.ConstraintValidatorContext; import java.util.regex.Matcher; import java.util.regex.Pattern; - +/** + * 电话校验 + * 支持手机号+电话同时校验 + * + * @author Bulbasaur + * @since 2021/7/9 1:41 上午 + */ public class MobileValidator implements ConstraintValidator { - private static Pattern pattern = Pattern.compile("^0?(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])[0-9]{8}$"); + private static final Pattern PHONE = Pattern.compile("^0?(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])[0-9]{8}$"); + private static final Pattern AREA_MOBILE = Pattern.compile("0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}|13[0-9]\\d{8}|15[1089]\\d{8}"); + private static final Pattern MOBILE = Pattern.compile("^[1-9]{1}[0-9]{5,8}$"); @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { - Matcher m = pattern.matcher(value); + Matcher m = null; + // 验证手机号 + if (value.length() == 11) { + m = PHONE.matcher(value); + // 验证带区号的电话 + } else if (value.length() > 9) { + m = AREA_MOBILE.matcher(value); + //验证没有区号的电话 + } else { + m = MOBILE.matcher(value); + } return m.matches(); } + @Override public void initialize(Mobile constraintAnnotation) { diff --git a/framework/src/main/java/cn/lili/common/validation/impl/PhoneValidator.java b/framework/src/main/java/cn/lili/common/validation/impl/PhoneValidator.java new file mode 100644 index 00000000..4172c4c2 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/validation/impl/PhoneValidator.java @@ -0,0 +1,30 @@ +package cn.lili.common.validation.impl; + +import cn.lili.common.validation.Phone; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 手机号校验 + * + * @author Bulbasaur + * @since 2021/7/9 1:42 上午 + */ +public class PhoneValidator implements ConstraintValidator { + + private static final Pattern pattern = Pattern.compile("^0?(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])[0-9]{8}$"); + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + Matcher m = pattern.matcher(value); + return m.matches(); + } + + @Override + public void initialize(Phone constraintAnnotation) { + + } +} diff --git a/framework/src/main/java/cn/lili/common/vo/PageVO.java b/framework/src/main/java/cn/lili/common/vo/PageVO.java index cc379fae..c782a6aa 100644 --- a/framework/src/main/java/cn/lili/common/vo/PageVO.java +++ b/framework/src/main/java/cn/lili/common/vo/PageVO.java @@ -1,5 +1,6 @@ package cn.lili.common.vo; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.utils.StringUtils; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,7 +11,6 @@ import java.io.Serializable; * 查询参数 * * @author Chopper - * @date 2020/11/26 14:43 */ @Data public class PageVO implements Serializable { @@ -32,17 +32,8 @@ public class PageVO implements Serializable { @ApiModelProperty(value = "需要驼峰转换蛇形", notes = "一般不做处理,如果数据库中就是蛇形,则这块需要处理。") private Boolean notConvert; - public Integer getMongoPageNumber() { - int i = pageNumber - 1; - if (i < 0) { - return pageNumber; - } else { - return i; - } - } - public String getSort() { - if (!StringUtils.isEmpty(sort)) { + if (CharSequenceUtil.isNotEmpty(sort)) { if (notConvert == null || Boolean.FALSE.equals(notConvert)) { return StringUtils.camel2Underline(sort); } else { diff --git a/framework/src/main/java/cn/lili/common/vo/ResultMessage.java b/framework/src/main/java/cn/lili/common/vo/ResultMessage.java index 6990ab9f..2268ef23 100644 --- a/framework/src/main/java/cn/lili/common/vo/ResultMessage.java +++ b/framework/src/main/java/cn/lili/common/vo/ResultMessage.java @@ -9,7 +9,6 @@ import java.io.Serializable; * 前后端交互VO * * @author Chopper - * @date 2020/11/26 14:40 */ @Data public class ResultMessage implements Serializable { diff --git a/framework/src/main/java/cn/lili/common/vo/SearchVO.java b/framework/src/main/java/cn/lili/common/vo/SearchVO.java index 9664098c..3f752e79 100644 --- a/framework/src/main/java/cn/lili/common/vo/SearchVO.java +++ b/framework/src/main/java/cn/lili/common/vo/SearchVO.java @@ -15,7 +15,6 @@ import java.util.Date; * 日期搜索参数 * * @author Chopper - * @date 2020/11/26 14:43 */ @Data @AllArgsConstructor @@ -32,8 +31,7 @@ public class SearchVO implements Serializable { if (StringUtils.isEmpty(startDate)) { return null; } - Date date = DateUtil.toDate(startDate, DateUtil.STANDARD_DATE_FORMAT); - return date; + return DateUtil.toDate(startDate, DateUtil.STANDARD_DATE_FORMAT); } public Date getConvertEndDate() { diff --git a/framework/src/main/java/cn/lili/common/vo/SerializableStream.java b/framework/src/main/java/cn/lili/common/vo/SerializableStream.java index ddeb0cc9..20f10cf1 100644 --- a/framework/src/main/java/cn/lili/common/vo/SerializableStream.java +++ b/framework/src/main/java/cn/lili/common/vo/SerializableStream.java @@ -10,7 +10,6 @@ import java.io.InputStream; * 序列化的input stream * * @author Chopper - * @date 2021-03-25 16:32 */ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/config/context/ContextConfiguration.java b/framework/src/main/java/cn/lili/config/context/ContextConfiguration.java deleted file mode 100644 index ed5d42ee..00000000 --- a/framework/src/main/java/cn/lili/config/context/ContextConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.lili.config.context; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * 过滤路径 - * @author Chopper - */ -@Configuration -public class ContextConfiguration implements WebMvcConfigurer { - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(new ThreadContextHolderInterceptorAdapter()).addPathPatterns("/**"); - } - -} diff --git a/framework/src/main/java/cn/lili/config/context/ThreadContextHolder.java b/framework/src/main/java/cn/lili/config/context/ThreadContextHolder.java deleted file mode 100644 index 60bcc797..00000000 --- a/framework/src/main/java/cn/lili/config/context/ThreadContextHolder.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.lili.config.context; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * 用户上下文 - * @author paulG - * @since 2020/10/16 - **/ -public class ThreadContextHolder { - - private static final ThreadLocal REQUEST_THREAD_LOCAL_HOLDER = new ThreadLocal<>(); - private static final ThreadLocal RESPONSE_THREAD_LOCAL_HOLDER = new ThreadLocal<>(); - - public static void remove() { - REQUEST_THREAD_LOCAL_HOLDER.remove(); - RESPONSE_THREAD_LOCAL_HOLDER.remove(); - } - - public static HttpServletResponse getHttpResponse() { - - return RESPONSE_THREAD_LOCAL_HOLDER.get(); - } - - public static void setHttpResponse(HttpServletResponse response) { - RESPONSE_THREAD_LOCAL_HOLDER.set(response); - } - - public static HttpServletRequest getHttpRequest() { - return REQUEST_THREAD_LOCAL_HOLDER.get(); - } - - public static void setHttpRequest(HttpServletRequest request) { - - REQUEST_THREAD_LOCAL_HOLDER.set(request); - } - - -} diff --git a/framework/src/main/java/cn/lili/config/context/ThreadContextHolderInterceptorAdapter.java b/framework/src/main/java/cn/lili/config/context/ThreadContextHolderInterceptorAdapter.java deleted file mode 100644 index a8cb28e1..00000000 --- a/framework/src/main/java/cn/lili/config/context/ThreadContextHolderInterceptorAdapter.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.lili.config.context; - -import org.springframework.lang.Nullable; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - - -/** - * request response 填充 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/12/9 10:44 - */ -public class ThreadContextHolderInterceptorAdapter extends HandlerInterceptorAdapter { - - - /** - * 拦截request和response并放到上下文中 - * - * @param request - * @param response - * @param handler - * @return - * @throws Exception - */ - @Override - public boolean preHandle(HttpServletRequest request, - HttpServletResponse response, Object handler) throws Exception { - - ThreadContextHolder.setHttpResponse(response); - ThreadContextHolder.setHttpRequest(request); - - return super.preHandle(request, response, handler); - } - - - /** - * 从上下文中移除 request 和response - * - * @param request - * @param response - * @param handler - * @param ex - * @throws Exception - */ - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { - ThreadContextHolder.remove(); - - super.afterCompletion(request, response, handler, ex); - } -} diff --git a/framework/src/main/java/cn/lili/config/interceptor/RequestInterceptorAdapter.java b/framework/src/main/java/cn/lili/config/interceptor/RequestInterceptorAdapter.java deleted file mode 100644 index 17e7f37a..00000000 --- a/framework/src/main/java/cn/lili/config/interceptor/RequestInterceptorAdapter.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.lili.config.interceptor; - -import cn.lili.config.context.ThreadContextHolder; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * 写入request/response - * - * @author Chopper - * @version v1.0 - * @since 2020-06-13 13:38 - */ -@Slf4j -@Component -public class RequestInterceptorAdapter extends HandlerInterceptorAdapter { - - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, - Object handler) { - return true; - } - - @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, - Object handler, ModelAndView modelAndView) throws Exception { - - ThreadContextHolder.setHttpResponse(response); - ThreadContextHolder.setHttpRequest(request); - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, - Object handler, Exception ex) throws Exception { - ThreadContextHolder.remove(); - - super.afterCompletion(request, response, handler, ex); - } -} diff --git a/framework/src/main/java/cn/lili/config/interceptor/UrlConfiguration.java b/framework/src/main/java/cn/lili/config/interceptor/UrlConfiguration.java deleted file mode 100644 index 5de9cb8e..00000000 --- a/framework/src/main/java/cn/lili/config/interceptor/UrlConfiguration.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.lili.config.interceptor; - -import cn.lili.config.properties.IgnoredUrlsProperties; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * 过滤路径 - * - * @author Chopper - */ -@Configuration -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class UrlConfiguration implements WebMvcConfigurer { - - private final IgnoredUrlsProperties ignoredUrlsProperties; - - private final RequestInterceptorAdapter requestInterceptorAdapter; - - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 注册拦截器 - InterceptorRegistration ir = registry.addInterceptor(requestInterceptorAdapter); - // 配置拦截的路径 - ir.addPathPatterns("/**"); - // 配置不拦截的路径 - ir.excludePathPatterns(ignoredUrlsProperties.getUrls()); - } - - //开放资源 这里配置swagger可以在前端访问 - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/statics/**").addResourceLocations("classpath:/statics/"); - registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); - // 解决 SWAGGER 404报错 - registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); - } - -} diff --git a/framework/src/main/java/cn/lili/config/mongo/MongoConfig.java b/framework/src/main/java/cn/lili/config/mongo/MongoConfig.java deleted file mode 100644 index d2fffd74..00000000 --- a/framework/src/main/java/cn/lili/config/mongo/MongoConfig.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.lili.config.mongo; - -import com.mongodb.MongoClientSettings; -import com.mongodb.MongoCredential; -import com.mongodb.ServerAddress; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; -import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; - -import java.util.Collections; - -/** - * @author paulG - * @since 2020/10/22 - **/ -@Configuration -@EnableMongoRepositories -public class MongoConfig extends AbstractMongoClientConfiguration { - - @Value("${spring.data.mongodb.database}") - private String databaseName; - - @Value("${spring.data.mongodb.host}") - private String host; - - @Value("${spring.data.mongodb.port}") - private Integer port; - - @Value("${spring.data.mongodb.username}") - private String username; - - @Value("${spring.data.mongodb.password}") - private String password; - - @Value("${spring.data.mongodb.authentication-database}") - private String authenticationDatabase; - - @Override - protected String getDatabaseName() { - return databaseName; - } - - @Override - protected void configureClientSettings(MongoClientSettings.Builder builder) { - builder.credential(MongoCredential.createCredential(username, authenticationDatabase, password.toCharArray())) - .applyToClusterSettings(settings -> settings.hosts(Collections.singletonList(new ServerAddress(host, port)))); - } - -} diff --git a/framework/src/main/java/cn/lili/config/properties/SystemSetting.java b/framework/src/main/java/cn/lili/config/properties/SystemSetting.java deleted file mode 100644 index 0e658f47..00000000 --- a/framework/src/main/java/cn/lili/config/properties/SystemSetting.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.lili.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -/** - * 系统设置 - * @author Chopper - */ -@Data -@Configuration -@ConfigurationProperties(prefix = "lili.system") -public class SystemSetting { - - - /** - * 是否是演示站点 - */ - private Boolean isDemoSite = false; -} diff --git a/framework/src/main/java/cn/lili/config/websocket/WebSocketStompConfig.java b/framework/src/main/java/cn/lili/config/websocket/WebSocketStompConfig.java deleted file mode 100644 index f849c5dd..00000000 --- a/framework/src/main/java/cn/lili/config/websocket/WebSocketStompConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.lili.config.websocket; - -import org.springframework.context.annotation.Configuration; -import org.springframework.messaging.simp.config.MessageBrokerRegistry; -import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; -import org.springframework.web.socket.config.annotation.StompEndpointRegistry; -import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; - -/** - * @author Chopper - */ -@Configuration -@EnableWebSocketMessageBroker -public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer { - - /** - * 注册stomp端点 - * @param registry - */ - @Override - public void registerStompEndpoints(StompEndpointRegistry registry) { - - // 允许使用socketJs方式访问 即可通过http://IP:PORT/manager/ws来和服务端websocket连接 - registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS(); - } - - /** - * 配置信息代理 - * @param registry - */ - @Override - public void configureMessageBroker(MessageBrokerRegistry registry) { - - // 订阅Broker名称 user点对点 topic广播即群发 - registry.enableSimpleBroker("/user","/topic"); - // 全局(客户端)使用的消息前缀 - registry.setApplicationDestinationPrefixes("/app"); - // 点对点使用的前缀 无需配置 默认/user - registry.setUserDestinationPrefix("/user"); - } -} diff --git a/framework/src/main/java/cn/lili/elasticsearch/BaseElasticsearchService.java b/framework/src/main/java/cn/lili/elasticsearch/BaseElasticsearchService.java new file mode 100644 index 00000000..7f08ddf7 --- /dev/null +++ b/framework/src/main/java/cn/lili/elasticsearch/BaseElasticsearchService.java @@ -0,0 +1,454 @@ +package cn.lili.elasticsearch; + +import cn.hutool.core.bean.BeanUtil; +import cn.lili.elasticsearch.config.ElasticsearchProperties; +import lombok.extern.slf4j.Slf4j; +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.client.HttpAsyncResponseConsumerFactory; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.CreateIndexRequest; +import org.elasticsearch.client.indices.CreateIndexResponse; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.client.indices.PutMappingRequest; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * @author paulG + * @since 2020/10/14 + **/ +@Slf4j +public abstract class BaseElasticsearchService { + + protected static final RequestOptions COMMON_OPTIONS; + + static { + RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); + + //默认缓冲限制为100MB,此处修改为30MB。 + builder.setHttpAsyncResponseConsumerFactory(new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024)); + COMMON_OPTIONS = builder.build(); + } + + @Autowired + @Qualifier("elasticsearchClient") + protected RestHighLevelClient client; + + @Autowired + private ElasticsearchProperties elasticsearchProperties; + + /** + * build DeleteIndexRequest + * + * @param index elasticsearch index name + * @author fxbin + */ + private static DeleteIndexRequest buildDeleteIndexRequest(String index) { + return new DeleteIndexRequest(index); + } + + /** + * build IndexRequest + * + * @param index elasticsearch index name + * @param id request object id + * @param object request object + * @return {@link IndexRequest} + * @author fxbin + */ + protected static IndexRequest buildIndexRequest(String index, String id, Object object) { + return new IndexRequest(index).id(id).source(BeanUtil.beanToMap(object), XContentType.JSON); + } + + /** + * create elasticsearch index (asyc) + * + * @param index elasticsearch index + * @author fxbin + */ + protected void createIndexRequest(String index) { + try { + CreateIndexRequest request = new CreateIndexRequest(index); + //Settings for this index + request.settings(Settings.builder() + .put("index.number_of_shards", elasticsearchProperties.getIndex().getNumberOfShards()) + .put("index.number_of_replicas", elasticsearchProperties.getIndex().getNumberOfReplicas()) + .put("index.max_result_window", 100000) //最大查询结果数 + .put("index.mapping.total_fields.limit", 2000)); + + //创建索引 + CreateIndexResponse createIndexResponse = client.indices().create(request, COMMON_OPTIONS); + createMapping(index); + log.info(" whether all of the nodes have acknowledged the request : {}", createIndexResponse.isAcknowledged()); + log.info(" Indicates whether the requisite number of shard copies were started for each shard in the index before timing out :{}", createIndexResponse.isShardsAcknowledged()); + } catch (Exception e) { + log.error("创建索引错误", e); + throw new ElasticsearchException("创建索引 {" + index + "} 失败:" + e.getMessage()); + } + } + + public void createMapping(String index) throws Exception { + String source = + " {\n" + + " \"properties\": {\n" + + " \"_class\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"attrList\": {\n" + + " \"type\": \"nested\",\n" + + " \"properties\": {\n" + + " \"name\": {\n" + + " \"type\": \"keyword\"\n" + + " },\n" + + " \"type\": {\n" + + " \"type\": \"integer\"\n" + + " },\n" + + " \"value\": {\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"brandId\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"brandName\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"brandUrl\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"buyCount\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"releaseTime\": {\n" + + " \"type\": \"date\",\n" + + " \"format\": \"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"\n" + + " },\n" + + " \"categoryPath\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"categoryNamePath\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"commentNum\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"skuSource\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"goodsId\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"goodsName\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true, \n" + + " \"analyzer\": \"ik_max_word\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"grade\": {\n" + + " \"type\": \"float\"\n" + + " },\n" + + " \"highPraiseNum\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"id\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"intro\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"authFlag\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"marketEnable\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true, \n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"mobileIntro\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"point\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"price\": {\n" + + " \"type\": \"float\"\n" + + " },\n" + + " \"salesModel\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"recommend\": {\n" + + " \"type\": \"boolean\"\n" + + " },\n" + + " \"selfOperated\": {\n" + + " \"type\": \"boolean\"\n" + + " },\n" + + " \"sellerId\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"sellerName\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true, \n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"shopCategoryPath\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true, \n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"sn\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"promotionMapJson\": {\n" + + " \"type\": \"keyword\"\n" + + " },\n" + + " \"thumbnail\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n"; + + PutMappingRequest request = new PutMappingRequest(index).source(source, XContentType.JSON); + CountDownLatch latch = new CountDownLatch(1); + client.indices().putMappingAsync( + request, + RequestOptions.DEFAULT, + new ActionListener() { + @Override + public void onResponse(AcknowledgedResponse r) { + latch.countDown(); + log.info("创建索引mapping成功:{}", r); + } + + @Override + public void onFailure(Exception e) { + latch.countDown(); + log.error("创建索引mapping失败", e); + } + }); + latch.await(10, TimeUnit.SECONDS); + } + + /** + * Description: 判断某个index是否存在 + * + * @param index index名 + * @return boolean + * @author fanxb + * @since 2019/7/24 14:57 + */ + public boolean indexExist(String index) { + try { + GetIndexRequest request = new GetIndexRequest(index); + request.local(false); + request.humanReadable(true); + request.includeDefaults(false); + return client.indices().exists(request, RequestOptions.DEFAULT); + } catch (Exception e) { + throw new ElasticsearchException("获取索引 {" + index + "} 是否存在失败:" + e.getMessage()); + } + } + + /** + * delete elasticsearch index + * + * @param index elasticsearch index name + * @author fxbin + */ + protected void deleteIndexRequest(String index) { + DeleteIndexRequest deleteIndexRequest = buildDeleteIndexRequest(index); + try { + client.indices().delete(deleteIndexRequest, COMMON_OPTIONS); + } catch (IOException e) { + throw new ElasticsearchException("删除索引 {" + index + "} 失败:" + e.getMessage()); + } + } + + /** + * exec updateRequest + * + * @param index elasticsearch index name + * @param id Document id + * @param object request object + * @author fxbin + */ + protected void updateRequest(String index, String id, Object object) { + try { + UpdateRequest updateRequest = new UpdateRequest(index, id).doc(BeanUtil.beanToMap(object), XContentType.JSON); + client.update(updateRequest, COMMON_OPTIONS); + } catch (IOException e) { + throw new ElasticsearchException("更新索引 {" + index + "} 数据 {" + object + "} 失败: " + e.getMessage()); + } + } + + /** + * exec deleteRequest + * + * @param index elasticsearch index name + * @param id Document id + * @author fxbin + */ + protected void deleteRequest(String index, String id) { + try { + DeleteRequest deleteRequest = new DeleteRequest(index, id); + client.delete(deleteRequest, COMMON_OPTIONS); + } catch (IOException e) { + throw new ElasticsearchException("删除索引 {" + index + "} 数据id {" + id + "} 失败: " + e.getMessage()); + } + } + + /** + * search all + * + * @param index elasticsearch index name + * @return {@link SearchResponse} + * @author fxbin + */ + protected SearchResponse search(String index) { + SearchRequest searchRequest = new SearchRequest(index); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder.query(QueryBuilders.matchAllQuery()); + searchRequest.source(searchSourceBuilder); + SearchResponse searchResponse = null; + try { + searchResponse = client.search(searchRequest, COMMON_OPTIONS); + } catch (IOException e) { + log.error("es 搜索错误", e); + } + return searchResponse; + } + + +} diff --git a/framework/src/main/java/cn/lili/common/elasticsearch/EsSuffix.java b/framework/src/main/java/cn/lili/elasticsearch/EsSuffix.java similarity index 61% rename from framework/src/main/java/cn/lili/common/elasticsearch/EsSuffix.java rename to framework/src/main/java/cn/lili/elasticsearch/EsSuffix.java index e7fe6f8e..9b6e4a9b 100644 --- a/framework/src/main/java/cn/lili/common/elasticsearch/EsSuffix.java +++ b/framework/src/main/java/cn/lili/elasticsearch/EsSuffix.java @@ -1,4 +1,4 @@ -package cn.lili.common.elasticsearch; +package cn.lili.elasticsearch; /** * elasticsearch 索引后缀 @@ -13,4 +13,9 @@ public class EsSuffix { */ public static final String GOODS_INDEX_NAME = "goods"; + /** + * 日志索引后缀 + */ + public static final String LOGS_INDEX_NAME = "logs"; + } diff --git a/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchConfig.java b/framework/src/main/java/cn/lili/elasticsearch/config/ElasticsearchConfig.java similarity index 80% rename from framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchConfig.java rename to framework/src/main/java/cn/lili/elasticsearch/config/ElasticsearchConfig.java index 86212804..b80da178 100644 --- a/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchConfig.java +++ b/framework/src/main/java/cn/lili/elasticsearch/config/ElasticsearchConfig.java @@ -1,6 +1,7 @@ -package cn.lili.config.elasticsearch; +package cn.lili.elasticsearch.config; -import lombok.RequiredArgsConstructor; +import cn.hutool.core.convert.Convert; +import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; @@ -16,7 +17,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; -import javax.annotation.Nonnull; import javax.annotation.PreDestroy; import java.io.IOException; import java.util.List; @@ -27,17 +27,17 @@ import java.util.List; * @author paulG * @since 2020/10/13 **/ +@Slf4j @Configuration -@RequiredArgsConstructor(onConstructor_ = @Autowired) public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { - private final ElasticsearchProperties elasticsearchProperties; + @Autowired + private ElasticsearchProperties elasticsearchProperties; private RestHighLevelClient client; @Override @Bean - @Nonnull public RestHighLevelClient elasticsearchClient() { RestClientBuilder restBuilder = RestClient .builder(this.getHttpHosts()); @@ -56,13 +56,13 @@ public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { .setDefaultCredentialsProvider(credential) .setKeepAliveStrategy(getConnectionKeepAliveStrategy()) .setMaxConnPerRoute(10) - .setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(1).build())); + .setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(Runtime.getRuntime().availableProcessors()).build())); } restBuilder.setRequestConfigCallback(requestConfigBuilder -> - requestConfigBuilder.setConnectTimeout(1000) // time until a connection with the server is established. - .setSocketTimeout(12 * 1000) // time of inactivity to wait for packets[data] to receive. - .setConnectionRequestTimeout(2 * 1000)); // time to fetch a connection from the connection pool 0 for infinite. + requestConfigBuilder.setConnectTimeout(1000) //time until a connection with the server is established. + .setSocketTimeout(12 * 1000) //time of inactivity to wait for packets[data] to receive. + .setConnectionRequestTimeout(-1)); //time to fetch a connection from the connection pool 0 for infinite. client = new RestHighLevelClient(restBuilder); return client; @@ -73,7 +73,7 @@ public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { HttpHost[] httpHosts = new HttpHost[clusterNodes.size()]; for (int i = 0; i < clusterNodes.size(); i++) { String[] node = clusterNodes.get(i).split(":"); - httpHosts[i] = new HttpHost(node[0], Integer.parseInt(node[1]), elasticsearchProperties.getSchema()); + httpHosts[i] = new HttpHost(node[0], Convert.toInt(node[1]), elasticsearchProperties.getSchema()); } return httpHosts; } @@ -82,11 +82,9 @@ public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { return (response, context) -> 2 * 60 * 1000; } - /* + /** * it gets called when bean instance is getting removed from the context if * scope is not a prototype - */ - /* * If there is a method named shutdown or close then spring container will try * to automatically configure them as callback methods when bean is being * destroyed @@ -96,7 +94,7 @@ public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { try { this.client.close(); } catch (IOException e) { - e.printStackTrace(); + log.error("es clientClose错误", e); } } diff --git a/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchProperties.java b/framework/src/main/java/cn/lili/elasticsearch/config/ElasticsearchProperties.java similarity index 96% rename from framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchProperties.java rename to framework/src/main/java/cn/lili/elasticsearch/config/ElasticsearchProperties.java index b6e66fbf..e6fdbda2 100644 --- a/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchProperties.java +++ b/framework/src/main/java/cn/lili/elasticsearch/config/ElasticsearchProperties.java @@ -1,4 +1,4 @@ -package cn.lili.config.elasticsearch; +package cn.lili.elasticsearch.config; import lombok.AllArgsConstructor; import lombok.Builder; @@ -17,7 +17,7 @@ import java.util.List; **/ @Data @Builder -@Component +@Component("elasticsearchProperties") @NoArgsConstructor @AllArgsConstructor @ConfigurationProperties(prefix = "lili.data.elasticsearch") diff --git a/framework/src/main/java/cn/lili/generator/CodeGenerator.java b/framework/src/main/java/cn/lili/generator/CodeGenerator.java deleted file mode 100644 index be7e6666..00000000 --- a/framework/src/main/java/cn/lili/generator/CodeGenerator.java +++ /dev/null @@ -1,345 +0,0 @@ -package cn.lili.generator; - -import cn.hutool.core.util.StrUtil; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.StringUtils; -import cn.lili.generator.bean.Entity; -import org.beetl.core.Configuration; -import org.beetl.core.GroupTemplate; -import org.beetl.core.Template; -import org.beetl.core.resource.ClasspathResourceLoader; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - - -/** - * 代码生成器 Mybatis-Plus - * - * @author Chopper - */ -public class CodeGenerator { - - /** - * 代码生成在哪个项目 - */ - private static final String project = "framework"; - - /** - * 代码生成在哪个包下边 - */ - private static final String packages = "cn.lili.modules."; - - /** - * modules - */ - private static final String modules = "message"; - - - /** - * 实体类名 - * 建议仅需修改 - */ - private static final String className = "ShortLink"; - - /** - * 类说明描述 - * 建议仅需修改 - */ - private static final String description = "短链接"; - - /** - * 作者名 - * 建议仅需修改 - */ - private static final String author = "Chopper"; - - /** - * 数据库表名前缀 - * 下方请根据需要修改 - */ - private static final String tablePre = "li_"; - - /** - * 主键类型 - */ - private static final String primaryKeyType = "String"; - - - /** - * endity - */ - private static final String entityPackage = packages + modules + ".entity"; - - /** - * dao - */ - private static final String daoPackage = packages + modules + ".mapper"; - - /** - * service - */ - private static final String servicePackage = packages + modules + ".service"; - - /** - * serviceImpl - */ - private static final String serviceImplPackage = packages + modules + ".serviceimpl"; - - /** - * controller - */ - private static final String controllerPackage = packages + modules + ".controller"; - - /** - * 运行该主函数即可生成代码 - * - * @param args - * @throws IOException - */ - public static void main(String[] args) throws IOException { - // 模板路径 - ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("/templates/java/"); - Configuration cfg = Configuration.defaultConfiguration(); - GroupTemplate gt = new GroupTemplate(resourceLoader, cfg); - // 生成代码 - generateCode(gt); - //根据类名删除生成的代码 -// deleteCode(className); - } - - /** - * 生成代码 - * - * @param gt - * @throws IOException - */ - private static void generateCode(GroupTemplate gt) throws IOException { - - Template entityTemplate = gt.getTemplate("entity.btl"); - Template daoTemplate = gt.getTemplate("mapper.btl"); - Template serviceTemplate = gt.getTemplate("service.btl"); - Template serviceImplTemplate = gt.getTemplate("serviceImpl.btl"); - Template controllerTemplate = gt.getTemplate("controller.btl"); - Template mapperXmlTemplate = gt.getTemplate("mapperXml.btl"); - - Entity entity = new Entity(); - entity.setEntityPackage(entityPackage); - entity.setDaoPackage(daoPackage); - entity.setServicePackage(servicePackage); - entity.setServiceImplPackage(serviceImplPackage); - entity.setControllerPackage(controllerPackage); - entity.setAuthor(author); - entity.setClassName(className); - entity.setTableName(tablePre + StringUtils.camel2Underline(className)); - entity.setClassNameLowerCase(name(className, false)); - entity.setDescription(description); - entity.setPrimaryKeyType(primaryKeyType); - - OutputStream out = null; - - //生成实体类代码 - entityTemplate.binding("entity", entity); - String entityResult = entityTemplate.render(); - System.out.println(entityResult); - //创建文件 - String entityFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(entityPackage) + "/" + className + ".java"; - File entityFile = new File(entityFileUrl); - File entityDir = entityFile.getParentFile(); - if (!entityDir.exists()) { - entityDir.mkdirs(); - } - if (!entityFile.exists()) { - // 若文件存在则不重新生成 - entityFile.createNewFile(); - out = new FileOutputStream(entityFile); - entityTemplate.renderTo(out); - } - - //生成dao代码 - daoTemplate.binding("entity", entity); - String daoResult = daoTemplate.render(); - System.out.println(daoResult); - //创建文件 - String daoFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(daoPackage) + "/" + className + "Mapper.java"; - File daoFile = new File(daoFileUrl); - File daoDir = daoFile.getParentFile(); - if (!daoDir.exists()) { - daoDir.mkdirs(); - } - if (!daoFile.exists()) { - // 若文件存在则不重新生成 - daoFile.createNewFile(); - out = new FileOutputStream(daoFile); - daoTemplate.renderTo(out); - } - - //生成service代码 - serviceTemplate.binding("entity", entity); - String serviceResult = serviceTemplate.render(); - System.out.println(serviceResult); - //创建文件 - String serviceFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(servicePackage) + "/" + className + "Service.java"; - File serviceFile = new File(serviceFileUrl); - File serviceDir = serviceFile.getParentFile(); - if (!serviceDir.exists()) { - serviceDir.mkdirs(); - } - if (!serviceFile.exists()) { - // 若文件存在则不重新生成 - serviceFile.createNewFile(); - out = new FileOutputStream(serviceFile); - serviceTemplate.renderTo(out); - } - - //生成serviceImpl代码 - serviceImplTemplate.binding("entity", entity); - String serviceImplResult = serviceImplTemplate.render(); - System.out.println(serviceImplResult); - //创建文件 - System.out.println(System.getProperty("user.dir")); - String serviceImplFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(serviceImplPackage) + "/" + className + "ServiceImpl.java"; - File serviceImplFile = new File(serviceImplFileUrl); - File serviceImplDir = serviceImplFile.getParentFile(); - if (!serviceImplDir.exists()) { - serviceImplDir.mkdirs(); - } - if (!serviceImplFile.exists()) { - // 若文件存在则不重新生成 - serviceImplFile.createNewFile(); - out = new FileOutputStream(serviceImplFile); - serviceImplTemplate.renderTo(out); - } - - //生成controller代码 - controllerTemplate.binding("entity", entity); - String controllerResult = controllerTemplate.render(); - System.out.println(controllerResult); - //创建文件 - String controllerFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(controllerPackage) + "/" + className + "Controller.java"; - File controllerFile = new File(controllerFileUrl); - File controllerDir = controllerFile.getParentFile(); - if (!controllerDir.exists()) { - controllerDir.mkdirs(); - } - if (!controllerFile.exists()) { - // 若文件存在则不重新生成 - controllerFile.createNewFile(); - out = new FileOutputStream(controllerFile); - controllerTemplate.renderTo(out); - } - - //生成mapperXml代码 - mapperXmlTemplate.binding("entity", entity); - String mapperXmlResult = mapperXmlTemplate.render(); - System.out.println(mapperXmlResult); - //创建文件 - String mapperXmlFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/resources/mapper/" + className + "Mapper.xml"; - File mapperXmlFile = new File(mapperXmlFileUrl); - File mapperXmlDir = mapperXmlFile.getParentFile(); - if (!mapperXmlDir.exists()) { - mapperXmlDir.mkdirs(); - } - if (!mapperXmlFile.exists()) { - // 若文件存在则不重新生成 - mapperXmlFile.createNewFile(); - out = new FileOutputStream(mapperXmlFile); - mapperXmlTemplate.renderTo(out); - } - - if (out != null) { - out.close(); - } - System.out.println("生成代码成功!"); - } - - /** - * 删除指定类代码 - * - * @param className - * @throws IOException - */ - private static void deleteCode(String className) throws IOException { - - String entityFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(entityPackage) + "/" + className + ".java"; - File entityFile = new File(entityFileUrl); - if (entityFile.exists()) { - entityFile.delete(); - } - String daoFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(daoPackage) + "/" + className + "Mapper.java"; - File daoFile = new File(daoFileUrl); - if (daoFile.exists()) { - daoFile.delete(); - } - - String serviceFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(servicePackage) + "/" + className + "Service.java"; - File serviceFile = new File(serviceFileUrl); - if (serviceFile.exists()) { - serviceFile.delete(); - } - - String serviceImplFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(serviceImplPackage) + "/" + className + "ServiceImpl.java"; - File serviceImplFile = new File(serviceImplFileUrl); - if (serviceImplFile.exists()) { - serviceImplFile.delete(); - } - - String controllerFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/java/" + dotToLine(controllerPackage) + "/" + className + "Controller.java"; - File controllerFile = new File(controllerFileUrl); - if (controllerFile.exists()) { - controllerFile.delete(); - } - - String mapperXmlFileUrl = System.getProperty("user.dir") + "/" + project + "/src/main/resources/mapper/" + className + "Mapper.xml"; - File mapperXmlFile = new File(mapperXmlFileUrl); - if (mapperXmlFile.exists()) { - mapperXmlFile.delete(); - } - - System.out.println("删除代码完毕!"); - } - - /** - * 点转斜线 - * - * @param str - * @return - */ - public static String dotToLine(String str) { - return str.replace(".", "/"); - } - - - /** - * 首字母是否大小写 - * - * @param name - * @param isFirstUpper - * @return - */ - public static String name(String name, boolean isFirstUpper) { - - if (StrUtil.isBlank(name)) { - throw new ServiceException("name不能为空"); - } - - if (name.length() == 1) { - if (isFirstUpper) { - return name.toUpperCase(); - } else { - return name.toLowerCase(); - } - } - - StringBuffer sb = new StringBuffer(); - if (isFirstUpper) { - sb.append(Character.toUpperCase(name.charAt(0))); - } else { - sb.append(Character.toLowerCase(name.charAt(0))); - } - sb.append(name.substring(1)); - return sb.toString(); - } -} diff --git a/framework/src/main/java/cn/lili/generator/VueCodeGenerator.java b/framework/src/main/java/cn/lili/generator/VueCodeGenerator.java deleted file mode 100644 index b715e244..00000000 --- a/framework/src/main/java/cn/lili/generator/VueCodeGenerator.java +++ /dev/null @@ -1,244 +0,0 @@ -package cn.lili.generator; - -import cn.lili.common.enums.ResultCode; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.common.vo.ResultMessage; -import cn.lili.generator.bean.Field; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.beetl.core.Configuration; -import org.beetl.core.GroupTemplate; -import org.beetl.core.Template; -import org.beetl.core.resource.ClasspathResourceLoader; -import org.elasticsearch.common.util.ArrayUtils; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * @author lili - */ -@Slf4j -@RestController -@Api(tags = "Vue代码生成") -@RequestMapping(value = "/manager/generate") -public class VueCodeGenerator { - - @RequestMapping(value = "/table/{vueName}/{rowNum}", method = RequestMethod.POST) - @ApiOperation(value = "增删改表格生成") - public ResultMessage generateTable(@PathVariable String vueName, - @PathVariable Integer rowNum, - @RequestBody List fields) throws IOException { - String result = generate("table.btl", vueName, rowNum, fields); - return ResultUtil.data(result); - } - - @RequestMapping(value = "/tree/{vueName}/{rowNum}", method = RequestMethod.POST) - @ApiOperation(value = "树形结构生成") - public ResultMessage generateTree(@PathVariable String vueName, - @PathVariable Integer rowNum, - @RequestBody List fields) throws IOException { - - - String result = generate("tree.btl", vueName, rowNum, fields); - return ResultUtil.data(result); - } - - @RequestMapping(value = "/getEntityData/{path}", method = RequestMethod.GET) - @ApiOperation(value = "通过实体类生成Vue代码Json数据") - public ResultMessage getEntityData(@PathVariable String path) { - - String result = ""; - try { - result = generateClassData(path); - } catch (Exception e) { - return ResultUtil.error(ResultCode.ERROR); - } - return ResultUtil.data(result); - } - - /** - * 生成代码 - * - * @param template 模版名称 - * @param vueName 表单名称 - * @param rowNum 树形表格所需参数,一行几列 - * @param fields - * @return - * @throws IOException - */ - public String generate(String template, String vueName, Integer rowNum, List fields) throws IOException { - - // 模板路径 - ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader("/templates/vue/"); - Configuration cfg = Configuration.defaultConfiguration(); - GroupTemplate gt = new GroupTemplate(resourceLoader, cfg); - - Template tableTemplate = gt.getTemplate(template); - // 排序 - Collections.sort(fields, Comparator.comparing(Field::getSortOrder)); - // 绑定变量 - tableTemplate.binding("vueName", vueName); - tableTemplate.binding("fields", fields); - // 判断有无upload和日期范围搜索 - Boolean upload = false; - for (Field f : fields) { - if ("upload".equals(f.getType())) { - upload = true; - } - } - tableTemplate.binding("upload", upload); - if ("table.btl".equals(template)) { - // 判断有无upload和日期范围搜索 - Boolean daterangeSearch = false; - for (Field f : fields) { - if (f.getSearchable() && "daterange".equals(f.getSearchType())) { - daterangeSearch = true; - } - } - tableTemplate.binding("daterangeSearch", daterangeSearch); - // 统计搜索栏个数 判断是否隐藏搜索栏 - Boolean hideSearch = false; - List firstTwo = new ArrayList<>(); - List rest = new ArrayList<>(); - Integer count = 0; - for (Field f : fields) { - if (f.getSearchable()) { - count++; - if (count <= 2) { - firstTwo.add(f); - } else { - rest.add(f); - } - } - } - if (count >= 4) { - hideSearch = true; - tableTemplate.binding("firstTwo", firstTwo); - tableTemplate.binding("rest", rest); - } - tableTemplate.binding("searchSize", count); - tableTemplate.binding("hideSearch", hideSearch); - // 获取默认排序字段 - String defaultSort = "", defaultSortType = ""; - for (Field f : fields) { - if (f.getDefaultSort()) { - defaultSort = f.getField(); - defaultSortType = f.getDefaultSortType(); - break; - } - } - tableTemplate.binding("defaultSort", defaultSort); - tableTemplate.binding("defaultSortType", defaultSortType); - } - // 一行几列 - tableTemplate.binding("rowNum", rowNum); - if (rowNum == 1) { - tableTemplate.binding("modalWidth", 500); - tableTemplate.binding("width", "100%"); - tableTemplate.binding("editWidth", "100%"); - tableTemplate.binding("itemWidth", ""); - tableTemplate.binding("span", "9"); - } else if (rowNum == 2) { - tableTemplate.binding("modalWidth", 770); - tableTemplate.binding("width", "250px"); - tableTemplate.binding("editWidth", "250px"); - tableTemplate.binding("itemWidth", "350px"); - tableTemplate.binding("span", "17"); - } else if (rowNum == 3) { - tableTemplate.binding("modalWidth", 980); - tableTemplate.binding("width", "200px"); - tableTemplate.binding("editWidth", "200px"); - tableTemplate.binding("itemWidth", "300px"); - tableTemplate.binding("span", "17"); - } else if (rowNum == 4) { - tableTemplate.binding("modalWidth", 1130); - tableTemplate.binding("width", "160px"); - tableTemplate.binding("editWidth", "160px"); - tableTemplate.binding("itemWidth", "260px"); - tableTemplate.binding("span", "17"); - } else { - throw new ServiceException("rowNum仅支持数字1-4"); - } - // 生成代码 - String result = tableTemplate.render(); - return result; - } - - /** - * 生成代码数据 - * - * @param path - * @return - * @throws Exception - */ - public String generateClassData(String path) throws Exception { - - Class c = Class.forName(path); - Object obj = c.newInstance(); - java.lang.reflect.Field[] fields = ArrayUtils.concat(obj.getClass().getDeclaredFields(), obj.getClass().getSuperclass().getDeclaredFields(), java.lang.reflect.Field.class); - - //下标 - int index = 0; - - StringBuffer fieldsData = new StringBuffer(); - for (java.lang.reflect.Field field : fields) { - index++; - field.setAccessible(true); - // 字段名 - String fieldName = field.getName(); - String fieldType = field.getType().getName(); - // 序列化id,不参与表单 - if ("serialVersionUID".equals(fieldName)) { - continue; - } - - // 获得字段注解 - ApiModelProperty myFieldAnnotation = field.getAnnotation(ApiModelProperty.class); - //表单名称 - String formName = fieldName; - if (myFieldAnnotation != null) { - formName = myFieldAnnotation.value(); - } - formName = StringUtils.isEmpty(formName) ? fieldName : formName; - - //默认类型 - String type = "text"; - String searchType = "text"; - // 日期字段特殊处理,其他一律按 字符串界面处理 - if (fieldType == "java.lang.Date" || fieldType == "java.util.Date" || fieldType == "Date") { - type = "date"; - searchType = "daterange"; - } - //表单子属性 - String formItem = "{" + - "\"sortOrder\":" + index + "," + - "\"field\":\"" + fieldName + "\"," + - "\"name\":\"" + formName + "\"," + - "\"level\":\"2\"," + - "\"tableShow\":true," + - "\"editable\":true," + - "\"type\":\"" + type + "\"," + - "\"searchType\":\"" + searchType + "\"," + - "\"searchLevel\":\"2\"," + - "\"validate\":false," + - "\"searchable\":true," + - "\"sortable\":false," + - "\"defaultSort\":false," + - "\"defaultSortType\":\"desc\"},"; - fieldsData.append(formItem); - } - String start = "{\"data\":["; - String end = "]}"; - String json = start + fieldsData.substring(0, fieldsData.length()-1) + end; - return json; - } -} diff --git a/framework/src/main/java/cn/lili/generator/bean/Entity.java b/framework/src/main/java/cn/lili/generator/bean/Entity.java deleted file mode 100644 index 9f0c2957..00000000 --- a/framework/src/main/java/cn/lili/generator/bean/Entity.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.lili.generator.bean; - -import lombok.Data; - -/** - * @author Chopper - */ -@Data -public class Entity { - - /** - * 实体类,dao,service,controller目录 - */ - private String entityPackage; - - private String daoPackage; - - private String servicePackage; - - private String serviceImplPackage; - - private String controllerPackage; - - - /** - * 作者 - */ - private String author; - - /** - * 类名 - */ - private String className; - - /** - * 首字母小写的类名字,用于模版内的变量名称 - */ - private String classNameLowerCase; - - /** - * 数据库 - */ - private String tableName; - - /** - * 类说明描述,一般设定关键字即可 例如:会员 - */ - private String description; - - /** - * 主键类型 - */ - private String primaryKeyType; - -} diff --git a/framework/src/main/java/cn/lili/generator/bean/Field.java b/framework/src/main/java/cn/lili/generator/bean/Field.java deleted file mode 100644 index 1815eeb6..00000000 --- a/framework/src/main/java/cn/lili/generator/bean/Field.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.lili.generator.bean; - -import lombok.Data; - -import java.math.BigDecimal; - -/** - * @author lili - */ -@Data -public class Field { - - private String field; - - private String name; - - private String level; - - private Boolean tableShow; - - private BigDecimal sortOrder; - - private Boolean searchable; - - private Boolean editable; - - private String type; - - private Boolean validate; - - private String searchType; - - private String searchLevel; - - private Boolean sortable; - - private Boolean defaultSort; - - private String defaultSortType; -} diff --git a/framework/src/main/java/cn/lili/modules/base/entity/vo/RedisVo.java b/framework/src/main/java/cn/lili/modules/base/entity/vo/RedisVo.java deleted file mode 100644 index 638da988..00000000 --- a/framework/src/main/java/cn/lili/modules/base/entity/vo/RedisVo.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.lili.modules.base.entity.vo; - -import lombok.AllArgsConstructor; -import lombok.Data; - -/** - * REDIS VO - * @author Chopper - * @date 2020/12/2 17:50 - */ -@Data -@AllArgsConstructor -public class RedisVo { - - private String key; - - private String value; -} diff --git a/framework/src/main/java/cn/lili/modules/base/serviceimpl/VerificationSourceServiceImpl.java b/framework/src/main/java/cn/lili/modules/base/serviceimpl/VerificationSourceServiceImpl.java deleted file mode 100644 index f2637674..00000000 --- a/framework/src/main/java/cn/lili/modules/base/serviceimpl/VerificationSourceServiceImpl.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.lili.modules.base.serviceimpl; - -import cn.lili.common.cache.Cache; -import cn.lili.modules.base.entity.dos.VerificationSource; -import cn.lili.modules.base.entity.enums.VerificationSourceEnum; -import cn.lili.modules.base.entity.vo.VerificationVO; -import cn.lili.modules.base.mapper.VerificationSourceMapper; -import cn.lili.modules.base.service.VerificationSourceService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 验证码资源维护 业务层实现 - * - * @author Chopper - * @date 2020/11/17 3:48 下午 - */ -@Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class VerificationSourceServiceImpl extends ServiceImpl implements VerificationSourceService { - - private final Cache cache; - - @Override - public VerificationVO initCache() { - List dbList = this.list(); - List resourceList = new ArrayList<>(); - List sliderList = new ArrayList<>(); - for (VerificationSource item : dbList) { - if (item.getType().equals(VerificationSourceEnum.RESOURCE.name())) { - resourceList.add(item); - } else if (item.getType().equals(VerificationSourceEnum.SLIDER.name())) { - sliderList.add(item); - } - } - VerificationVO verificationVO = new VerificationVO(); - verificationVO.setVerificationResources(resourceList); - verificationVO.setVerificationSlider(sliderList); - cache.put(VERIFICATION_CACHE, verificationVO); - return verificationVO; - } - - @Override - public VerificationVO getVerificationCache() { - VerificationVO verificationVO = cache.get(VERIFICATION_CACHE); - if (verificationVO == null) { - return initCache(); - } - return verificationVO; - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/config/AuthConfig.java b/framework/src/main/java/cn/lili/modules/connect/config/AuthConfig.java index 15a7be77..b75b1e5a 100644 --- a/framework/src/main/java/cn/lili/modules/connect/config/AuthConfig.java +++ b/framework/src/main/java/cn/lili/modules/connect/config/AuthConfig.java @@ -1,6 +1,7 @@ package cn.lili.modules.connect.config; import cn.lili.modules.connect.entity.dto.AuthCallback; +import cn.lili.modules.connect.request.BaseAuthRequest; import com.xkcoding.http.config.HttpConfig; import lombok.*; @@ -85,7 +86,7 @@ public class AuthConfig { /** * 忽略校验 {@code state} 参数,默认不开启。当 {@code ignoreCheckState} 为 {@code true} 时, - * {@link cn.lili.modules.connect.request.AuthDefaultRequest#login(AuthCallback)}} 将不会校验 {@code state} 的合法性。 + * {@link BaseAuthRequest#login(AuthCallback)}} 将不会校验 {@code state} 的合法性。 *

* 使用场景:当且仅当使用自实现 {@code state} 校验逻辑时开启 *

diff --git a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuth.java b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuth.java index 179373e9..d0d13e5a 100644 --- a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuth.java +++ b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuth.java @@ -9,7 +9,6 @@ import cn.lili.modules.connect.exception.AuthException; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/12/4 12:17 */ public interface ConnectAuth { diff --git a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java index 7004313f..009e4482 100644 --- a/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java +++ b/framework/src/main/java/cn/lili/modules/connect/config/ConnectAuthEnum.java @@ -6,13 +6,12 @@ package cn.lili.modules.connect.config; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/12/4 14:10 */ public enum ConnectAuthEnum implements ConnectAuth { /** - * 微信开放平台 + * 微信公众号登录 */ WECHAT { @Override @@ -33,6 +32,7 @@ public enum ConnectAuthEnum implements ConnectAuth { /** * 微信开放平台 + * 微信PC登录 */ WECHAT_PC { @Override diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/Connect.java b/framework/src/main/java/cn/lili/modules/connect/entity/Connect.java index 238b5fc9..acd052ab 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/Connect.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/Connect.java @@ -1,8 +1,8 @@ package cn.lili.modules.connect.entity; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -13,33 +13,19 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import java.io.Serializable; import java.util.Date; /** * @author Chopper */ @Data -@Entity -@Table(name = "li_connect") @TableName("li_connect") @ApiModel(value = "联合登陆") @NoArgsConstructor -public class Connect implements Serializable { +public class Connect extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedBy @TableField(fill = FieldFill.INSERT) diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/ConnectConfig.java b/framework/src/main/java/cn/lili/modules/connect/entity/ConnectConfig.java deleted file mode 100644 index b32d62e6..00000000 --- a/framework/src/main/java/cn/lili/modules/connect/entity/ConnectConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.lili.modules.connect.entity; - -import cn.lili.base.BaseEntity; -import cn.lili.modules.connect.entity.enums.ConnectConfigEnum; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.Table; -import java.util.HashMap; -import java.util.Map; - -/** - * @author Chopper - */ -@Data -@Entity -@Table(name = "li_connect_config") -@TableName("li_connect_config") -@ApiModel(value = "联合登陆配置") -@NoArgsConstructor -public class ConnectConfig extends BaseEntity { - - private static final long serialVersionUID = 1L; - - /** - * @see cn.lili.modules.connect.entity.enums.ConnectConfigEnum - */ - @ApiModelProperty(value = "配置key") - private String configKey; - - - @ApiModelProperty(value = "配置") - private String configValue; - - public ConnectConfig(String configKey) { - this.configKey = configKey; - ConnectConfigEnum configEnum = ConnectConfigEnum.valueOf(configKey); - String[] formItems = configEnum.getForm().split(","); - Map config = new HashMap<>(formItems.length); - for (int i = 0; i < formItems.length; i++) { - config.put(formItems[i], ""); - } - this.configValue = config.toString(); - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthCallback.java b/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthCallback.java index 1fb29699..f00ec12a 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthCallback.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthCallback.java @@ -27,7 +27,7 @@ public class AuthCallback implements Serializable { /** * 访问AuthorizeUrl后回调时带的参数auth_code,该参数目前只使用于支付宝登录 */ - private String auth_code; + private String authCode; /** * 访问AuthorizeUrl后回调时带的参数state,用于和请求AuthorizeUrl前的state比较,防止CSRF攻击 diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthToken.java b/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthToken.java index cd136c92..63fbf623 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthToken.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/dto/AuthToken.java @@ -12,7 +12,6 @@ import java.io.Serializable; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/12/4 23:48 */ @Data @@ -23,20 +22,36 @@ public class AuthToken implements Serializable { private static final long serialVersionUID = -2701476618576443366L; - //第三方token + /** + * 第三方token + */ private String accessToken; - //第三方刷新token + /** + * 第三方刷新token + */ private String refreshToken; - //有效时间 + /** + * 有效时间 + */ private int expireIn; - //会员id + /** + * 会员id + */ private String uid; - //联合登录id + /** + * 联合登录id + */ private String unionId; - //联合登录openid + /** + * 联合登录openid + */ private String openId; - //请求码 + /** + * 请求码 + */ private String accessCode; - + /** + * 范围 + */ private String scope; } diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java b/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java index d9e5522d..0c1d5e83 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/dto/ConnectAuthUser.java @@ -1,7 +1,9 @@ package cn.lili.modules.connect.entity.dto; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.Builder; @@ -65,8 +67,15 @@ public class ConnectAuthUser implements Serializable { private AuthUserGender gender; /** * 用户来源 + * 例如:QQ、微信、微博等 */ - private String source; + private ConnectEnum source; + + /** + * 类型-客户端类型 + * 例如:PC、WAP、小程序 + */ + private ClientTypeEnum type; /** * 用户授权的token信息 */ @@ -81,4 +90,9 @@ public class ConnectAuthUser implements Serializable { */ private ConnectAuthEnum connectEnum; + /** + * 手机号 + */ + private String phone; + } diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/dto/MemberConnectLoginMessage.java b/framework/src/main/java/cn/lili/modules/connect/entity/dto/MemberConnectLoginMessage.java new file mode 100644 index 00000000..4e7198fd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/connect/entity/dto/MemberConnectLoginMessage.java @@ -0,0 +1,14 @@ +package cn.lili.modules.connect.entity.dto; + +import cn.lili.modules.member.entity.dos.Member; +import lombok.Data; + +/** + * 会员联合登录消息 + */ +@Data +public class MemberConnectLoginMessage { + + private Member member; + private ConnectAuthUser connectAuthUser; +} diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/enums/AuthUserGender.java b/framework/src/main/java/cn/lili/modules/connect/entity/enums/AuthUserGender.java index cd9a21bb..35a48d4e 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/enums/AuthUserGender.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/enums/AuthUserGender.java @@ -1,8 +1,8 @@ package cn.lili.modules.connect.entity.enums; +import cn.lili.common.utils.StringUtils; import lombok.AllArgsConstructor; import lombok.Getter; -import org.springframework.util.StringUtils; import java.util.Arrays; @@ -51,7 +51,8 @@ public enum AuthUserGender { * @since 1.13.2 */ public static AuthUserGender getWechatRealGender(String originalGender) { - if (StringUtils.isEmpty(originalGender) || "0".equals(originalGender)) { + String noGender="0"; + if (StringUtils.isEmpty(originalGender) || noGender.equals(originalGender)) { return AuthUserGender.UNKNOWN; } return getRealGender(originalGender); diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java b/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java index 66dad6af..162bac7a 100644 --- a/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java +++ b/framework/src/main/java/cn/lili/modules/connect/entity/enums/ConnectEnum.java @@ -5,7 +5,6 @@ package cn.lili.modules.connect.entity.enums; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/25 18:20 */ public enum ConnectEnum { @@ -14,9 +13,8 @@ public enum ConnectEnum { */ QQ("QQ登录"), WEIBO("微博联合登录"), - WECHAT("微信联合登录"),//只存放unionid - WECHAT_OPEN_ID("微信openid登录"), - WECHAT_MP_OPEN_ID("微信openid登录"), + //只存放unionid + WECHAT("微信联合登录"), ALIPAY("支付宝登录"), APPLE("苹果登录"); diff --git a/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java b/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java new file mode 100644 index 00000000..847db2c7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/connect/entity/enums/SourceEnum.java @@ -0,0 +1,62 @@ +package cn.lili.modules.connect.entity.enums; + +import cn.lili.common.enums.ClientTypeEnum; + +/** + * 联合登陆-渠道枚举 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/25 18:20 + */ +public enum SourceEnum { + + WECHAT_PC_OPEN_ID("微信PC应用 openid登录"), + WECHAT_OFFIACCOUNT_OPEN_ID("微信公众号 openid登录"), + WECHAT_MP_OPEN_ID("微信小程序 openid登录"), + WECHAT_APP_OPEN_ID("微信APP openid登录"), + + QQ_APP_OPEN_ID("QQ APP openid登录"), + QQ_PC_OPEN_ID("QQ PC应用 openid登录"), + QQ_H5_OPEN_ID("QQ H5应用 openid登录"), + + APPLE_OPEN_ID("苹果 openid登录"), + ; + + + private final String description; + + SourceEnum(String description) { + this.description = description; + } + + public static SourceEnum getSourceEnum(ConnectEnum source, ClientTypeEnum type) { + switch (source) { + case WECHAT: + switch (type) { + case APP: + return WECHAT_APP_OPEN_ID; + case WECHAT_MP: + return WECHAT_MP_OPEN_ID; + case PC: + return WECHAT_PC_OPEN_ID; + case H5: + return WECHAT_OFFIACCOUNT_OPEN_ID; + } + break; + case QQ: + switch (type) { + case APP: + return QQ_APP_OPEN_ID; + case PC: + return QQ_PC_OPEN_ID; + case H5: + return QQ_H5_OPEN_ID; + } + break; + case APPLE: + return APPLE_OPEN_ID; + } + return null; + } +} diff --git a/framework/src/main/java/cn/lili/modules/connect/mapper/ConnectConfigMapper.java b/framework/src/main/java/cn/lili/modules/connect/mapper/ConnectConfigMapper.java deleted file mode 100644 index 0ecf2a12..00000000 --- a/framework/src/main/java/cn/lili/modules/connect/mapper/ConnectConfigMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.lili.modules.connect.mapper; - -import cn.lili.modules.connect.entity.ConnectConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - * 联合登陆配置数据处理层 - * - * @author Chopper - */ -public interface ConnectConfigMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/request/AuthRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/AuthRequest.java index fddd7329..74390987 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/AuthRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/AuthRequest.java @@ -20,7 +20,7 @@ public interface AuthRequest { * 返回授权url,可自行跳转页面 *

* 不建议使用该方式获取授权地址,不带{@code state}的授权地址,容易受到csrf攻击。 - * 建议使用{@link AuthDefaultRequest#authorize(String)}方法生成授权地址,在回调方法中对{@code state}进行校验 + * 建议使用{@link BaseAuthRequest#authorize(String)}方法生成授权地址,在回调方法中对{@code state}进行校验 * * @return 返回授权地址 */ diff --git a/framework/src/main/java/cn/lili/modules/connect/request/AuthAlipayRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthAlipayRequest.java similarity index 90% rename from framework/src/main/java/cn/lili/modules/connect/request/AuthAlipayRequest.java rename to framework/src/main/java/cn/lili/modules/connect/request/BaseAuthAlipayRequest.java index b51f3d2d..92c37522 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/AuthAlipayRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthAlipayRequest.java @@ -1,6 +1,7 @@ package cn.lili.modules.connect.request; -import cn.lili.common.cache.Cache; +import cn.hutool.core.convert.Convert; +import cn.lili.cache.Cache; import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; @@ -11,6 +12,8 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.exception.AuthException; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; @@ -28,12 +31,12 @@ import com.alipay.api.response.AlipayUserInfoShareResponse; * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @since 1.0.1 */ -public class AuthAlipayRequest extends AuthDefaultRequest { +public class BaseAuthAlipayRequest extends BaseAuthRequest { private final AlipayClient alipayClient; - public AuthAlipayRequest(AuthConfig config, Cache cache) { + public BaseAuthAlipayRequest(AuthConfig config, Cache cache) { super(config, ConnectAuthEnum.ALIPAY, cache); this.alipayClient = new DefaultAlipayClient(ConnectAuthEnum.ALIPAY.accessToken(), config.getClientId(), config.getClientSecret(), "json", "UTF-8", config .getAlipayPublicKey(), "RSA2"); @@ -43,7 +46,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { protected AuthToken getAccessToken(AuthCallback authCallback) { AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); request.setGrantType("authorization_code"); - request.setCode(authCallback.getAuth_code()); + request.setCode(authCallback.getAuthCode()); AlipaySystemOauthTokenResponse response = null; try { response = this.alipayClient.execute(request); @@ -56,7 +59,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { return AuthToken.builder() .accessToken(response.getAccessToken()) .uid(response.getUserId()) - .expireIn(Integer.parseInt(response.getExpiresIn())) + .expireIn(Convert.toInt(response.getExpiresIn())) .refreshToken(response.getRefreshToken()) .build(); } @@ -86,7 +89,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { .data(AuthToken.builder() .accessToken(response.getAccessToken()) .uid(response.getUserId()) - .expireIn(Integer.parseInt(response.getExpiresIn())) + .expireIn(Convert.toInt(response.getExpiresIn())) .refreshToken(response.getRefreshToken()) .build()) .build(); @@ -118,7 +121,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { .location(location) .gender(AuthUserGender.getRealGender(response.getGender())) .token(authToken) - .source(source.toString()) + .source(ConnectEnum.ALIPAY) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/request/AuthQQRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthQQRequest.java similarity index 89% rename from framework/src/main/java/cn/lili/modules/connect/request/AuthQQRequest.java rename to framework/src/main/java/cn/lili/modules/connect/request/BaseAuthQQRequest.java index 164ec3a1..137d652e 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/AuthQQRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthQQRequest.java @@ -1,6 +1,9 @@ package cn.lili.modules.connect.request; -import cn.lili.common.cache.Cache; +import cn.hutool.core.convert.Convert; +import cn.lili.cache.Cache; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; @@ -11,9 +14,9 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.util.GlobalAuthUtils; -import cn.lili.modules.connect.util.HttpUtils; import com.alibaba.fastjson.JSONObject; import java.util.Map; @@ -25,9 +28,9 @@ import java.util.Map; * @author yangkai.shen (https://xkcoding.com) * @since 1.1.0 */ -public class AuthQQRequest extends AuthDefaultRequest { +public class BaseAuthQQRequest extends BaseAuthRequest { - public AuthQQRequest(AuthConfig config, Cache cache) { + public BaseAuthQQRequest(AuthConfig config, Cache cache) { super(config, ConnectAuthEnum.QQ, cache); } @@ -66,7 +69,8 @@ public class AuthQQRequest extends AuthDefaultRequest { .uuid(openId) .gender(AuthUserGender.getRealGender(object.getString("gender"))) .token(authToken) - .source(source.toString()) + .source(ConnectEnum.QQ) + .type(ClientTypeEnum.PC) .build(); } @@ -74,7 +78,7 @@ public class AuthQQRequest extends AuthDefaultRequest { * 获取QQ用户的OpenId,支持自定义是否启用查询unionid的功能,如果启用查询unionid的功能, * 那就需要开发者先通过邮件申请unionid功能,参考链接 {@see http://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D} * - * @param authToken 通过{@link AuthQQRequest#getAccessToken(AuthCallback)}获取到的{@code authToken} + * @param authToken 通过{@link BaseAuthQQRequest#getAccessToken(AuthCallback)}获取到的{@code authToken} * @return openId */ private String getOpenId(AuthToken authToken) { @@ -118,7 +122,7 @@ public class AuthQQRequest extends AuthDefaultRequest { } return AuthToken.builder() .accessToken(accessTokenObject.get("access_token")) - .expireIn(Integer.parseInt(accessTokenObject.getOrDefault("expires_in", "0"))) + .expireIn(Convert.toInt(accessTokenObject.getOrDefault("expires_in", "0"))) .refreshToken(accessTokenObject.get("refresh_token")) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/request/AuthDefaultRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthRequest.java similarity index 93% rename from framework/src/main/java/cn/lili/modules/connect/request/AuthDefaultRequest.java rename to framework/src/main/java/cn/lili/modules/connect/request/BaseAuthRequest.java index c138aa9f..6e695606 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/AuthDefaultRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthRequest.java @@ -1,8 +1,10 @@ package cn.lili.modules.connect.request; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; +import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.UrlBuilder; +import cn.lili.common.utils.UuidUtils; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuth; import cn.lili.modules.connect.entity.dto.AuthCallback; @@ -12,8 +14,6 @@ import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.util.AuthChecker; -import cn.lili.modules.connect.util.HttpUtils; -import cn.lili.modules.connect.util.UuidUtils; import com.xkcoding.http.util.UrlUtil; import lombok.extern.slf4j.Slf4j; @@ -27,20 +27,22 @@ import java.util.List; * @since 1.0.0 */ @Slf4j -public abstract class AuthDefaultRequest implements AuthRequest { +public abstract class BaseAuthRequest implements AuthRequest { + + protected AuthConfig config; protected ConnectAuth source; protected Cache cache; - public AuthDefaultRequest(AuthConfig config, ConnectAuth connectAuth, Cache cache) { + public BaseAuthRequest(AuthConfig config, ConnectAuth connectAuth, Cache cache) { this.config = config; this.source = connectAuth; this.cache = cache; if (!AuthChecker.isSupportedAuth(config, source)) { throw new AuthException(AuthResponseStatus.PARAMETER_INCOMPLETE, source); } - // 校验配置合法性 + //校验配置合法性 AuthChecker.checkConfig(config, source); } @@ -71,10 +73,6 @@ public abstract class AuthDefaultRequest implements AuthRequest { public AuthResponse login(AuthCallback authCallback) { try { AuthChecker.checkCode(source, authCallback); -// if (!config.isIgnoreCheckState()) { -// AuthChecker.checkState(authCallback.getState(), source, cache); -// } - AuthToken authToken = this.getAccessToken(authCallback); ConnectAuthUser user = this.getUserInfo(authToken); return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build(); @@ -85,7 +83,7 @@ public abstract class AuthDefaultRequest implements AuthRequest { } /** - * 处理{@link AuthDefaultRequest#login(AuthCallback)} 发生异常的情况,统一响应参数 + * 处理{@link BaseAuthRequest#login(AuthCallback)} 发生异常的情况,统一响应参数 * * @param e 具体的异常 * @return AuthResponse @@ -268,7 +266,7 @@ public abstract class AuthDefaultRequest implements AuthRequest { scopes = defaultScopes; } if (null == separator) { - // 默认为空格 + //默认为空格 separator = " "; } String scopeStr = String.join(separator, scopes); diff --git a/framework/src/main/java/cn/lili/modules/connect/request/AuthWeChatPCRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java similarity index 92% rename from framework/src/main/java/cn/lili/modules/connect/request/AuthWeChatPCRequest.java rename to framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java index e0c3bd2e..63feaea4 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/AuthWeChatPCRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java @@ -1,6 +1,8 @@ package cn.lili.modules.connect.request; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuthEnum; @@ -10,8 +12,9 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.exception.AuthException; -import cn.lili.modules.connect.util.HttpUtils; import com.alibaba.fastjson.JSONObject; /** @@ -20,9 +23,9 @@ import com.alibaba.fastjson.JSONObject; * @author yangkai.shen (https://xkcoding.com) * @since 1.1.0 */ -public class AuthWeChatPCRequest extends AuthDefaultRequest { +public class BaseAuthWeChatPCRequest extends BaseAuthRequest { - public AuthWeChatPCRequest(AuthConfig config, Cache cache) { + public BaseAuthWeChatPCRequest(AuthConfig config, Cache cache) { super(config, ConnectAuthEnum.WECHAT_PC, cache); } @@ -56,10 +59,11 @@ public class AuthWeChatPCRequest extends AuthDefaultRequest { .nickname(object.getString("nickname")) .avatar(object.getString("headimgurl")) .location(location) - .uuid(authToken.getUnionId()) + .uuid(authToken.getOpenId()) .gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .token(authToken) - .source(source.toString()) + .source(ConnectEnum.WECHAT) + .type(ClientTypeEnum.PC) .build(); } @@ -112,6 +116,7 @@ public class AuthWeChatPCRequest extends AuthDefaultRequest { */ @Override public String authorize(String state) { + return UrlBuilder.fromBaseUrl(source.authorize()) .queryParam("response_type", "code") .queryParam("appid", config.getClientId()) diff --git a/framework/src/main/java/cn/lili/modules/connect/request/AuthWeChatRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java similarity index 93% rename from framework/src/main/java/cn/lili/modules/connect/request/AuthWeChatRequest.java rename to framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java index bc1655fd..6418d9cf 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/AuthWeChatRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java @@ -1,6 +1,8 @@ package cn.lili.modules.connect.request; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuthEnum; @@ -10,9 +12,10 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.util.GlobalAuthUtils; -import cn.lili.modules.connect.util.HttpUtils; import com.alibaba.fastjson.JSONObject; /** @@ -21,8 +24,8 @@ import com.alibaba.fastjson.JSONObject; * @author yangkai.shen (https://xkcoding.com) * @since 1.1.0 */ -public class AuthWeChatRequest extends AuthDefaultRequest { - public AuthWeChatRequest(AuthConfig config, Cache cache) { +public class BaseAuthWeChatRequest extends BaseAuthRequest { + public BaseAuthWeChatRequest(AuthConfig config, Cache cache) { super(config, ConnectAuthEnum.WECHAT, cache); } @@ -61,7 +64,8 @@ public class AuthWeChatRequest extends AuthDefaultRequest { .uuid(openId) .gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .token(authToken) - .source(source.toString()) + .source(ConnectEnum.WECHAT) + .type(ClientTypeEnum.H5) .build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/request/AuthWeiboRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeiboRequest.java similarity index 91% rename from framework/src/main/java/cn/lili/modules/connect/request/AuthWeiboRequest.java rename to framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeiboRequest.java index 0a60fa62..e2e79b97 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/AuthWeiboRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeiboRequest.java @@ -1,7 +1,7 @@ package cn.lili.modules.connect.request; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.UrlBuilder; import cn.lili.modules.connect.config.AuthConfig; @@ -12,9 +12,10 @@ import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthUserGender; +import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.exception.AuthException; -import cn.lili.modules.connect.util.HttpUtils; -import cn.lili.modules.connect.util.IpUtils; +import cn.lili.common.utils.HttpUtils; +import cn.lili.common.utils.IpUtils; import com.alibaba.fastjson.JSONObject; import com.xkcoding.http.support.HttpHeader; @@ -25,9 +26,9 @@ import com.xkcoding.http.support.HttpHeader; * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @since 1.0.0 */ -public class AuthWeiboRequest extends AuthDefaultRequest { +public class BaseAuthWeiboRequest extends BaseAuthRequest { - public AuthWeiboRequest(AuthConfig config, Cache cache) { + public BaseAuthWeiboRequest(AuthConfig config, Cache cache) { super(config, ConnectAuthEnum.WEIBO, cache); } @@ -72,7 +73,7 @@ public class AuthWeiboRequest extends AuthDefaultRequest { .remark(object.getString("description")) .gender(AuthUserGender.getRealGender(object.getString("gender"))) .token(authToken) - .source(source.toString()) + .source(ConnectEnum.WEIBO) .build(); } @@ -107,7 +108,7 @@ public class AuthWeiboRequest extends AuthDefaultRequest { .msg(object.getString("error")) .build(); } - // 返回 result = true 表示取消授权成功,否则失败 + //返回 result = true 表示取消授权成功,否则失败 AuthResponseStatus status = object.getBooleanValue("result") ? AuthResponseStatus.SUCCESS : AuthResponseStatus.FAILURE; return AuthResponse.builder().code(status.getCode()).msg(status.getMsg()).build(); } diff --git a/framework/src/main/java/cn/lili/modules/connect/service/AbstractConnectLoginPlugin.java b/framework/src/main/java/cn/lili/modules/connect/service/AbstractConnectLoginPlugin.java deleted file mode 100644 index c37d22cc..00000000 --- a/framework/src/main/java/cn/lili/modules/connect/service/AbstractConnectLoginPlugin.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.lili.modules.connect.service; - -import cn.lili.common.utils.UrlBuilder; -import cn.lili.modules.connect.config.ConnectAuthEnum; -import cn.lili.modules.connect.entity.dto.AuthToken; -import org.springframework.stereotype.Component; - - -/** - * 信任登录抽象类 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/12/4 10:57 - */ -@Component -public abstract class AbstractConnectLoginPlugin { - - protected static String callBackUrl = "http://www.baidu.com"; - - /** - * 获取授权登录的url - * - * @return URL - */ - protected abstract String getLoginUrl(String uuid); - - /** - * 回调地址 - * - * @return 登录凭证 - */ - protected String callbackUrl(String uuid, ConnectAuthEnum authInterface) { - return UrlBuilder.fromBaseUrl(callBackUrl) - .pathAppend("/buyer/connect/callback") - .pathAppend("/" + authInterface.getName()) - .queryParam("uuid", uuid).build(); - } - - /** - * 回调地址 - * - * @return 登录凭证 - */ - protected abstract AuthToken userInfo(String uuid); - -} diff --git a/framework/src/main/java/cn/lili/modules/connect/service/ConnectConfigService.java b/framework/src/main/java/cn/lili/modules/connect/service/ConnectConfigService.java deleted file mode 100644 index ade0b4f2..00000000 --- a/framework/src/main/java/cn/lili/modules/connect/service/ConnectConfigService.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.lili.modules.connect.service; - -import cn.lili.modules.connect.entity.ConnectConfig; -import cn.lili.modules.connect.entity.vo.ConnectConfigForm; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - -/** - * 联合登陆配置接口 - * - * @author Chopper - */ -public interface ConnectConfigService extends IService { - - /** - * 获取所有配置项目 - * - * @return - */ - List listForms(); - - /** - * 获取配置详情 - * - * @return - */ - ConnectConfig getConfig(String key); - - /** - * 获取配置详情 - * - * @return - */ - ConnectConfig saveConfig(ConnectConfig connectConfig); -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java b/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java index a115c150..94fc5694 100644 --- a/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java +++ b/framework/src/main/java/cn/lili/modules/connect/service/ConnectService.java @@ -1,10 +1,11 @@ package cn.lili.modules.connect.service; -import cn.lili.common.cache.CachePrefix; -import cn.lili.common.token.Token; +import cn.lili.cache.CachePrefix; +import cn.lili.common.security.token.Token; import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.dto.WechatMPLoginParams; +import cn.lili.modules.member.entity.dto.ConnectQueryDTO; import com.baomidou.mybatisplus.extension.service.IService; import javax.naming.NoPermissionException; @@ -27,23 +28,14 @@ public interface ConnectService extends IService { */ String CONNECT_TYPE = "CONNECT_TYPE"; - /** - * 联合登陆 - * - * @param type - * @param unionid - * @return - */ - Token unionLoginCallback(String type, String unionid, String uuid,boolean longTerm) throws NoPermissionException; - /** * 联合登陆对象直接登录 * - * @param type 第三方登录类型 * @param authUser 第三方登录返回封装类 * @param uuid 用户uuid + * @return token */ - Token unionLoginCallback(String type, ConnectAuthUser authUser, String uuid); + Token unionLoginCallback(ConnectAuthUser authUser, String uuid); /** * 绑定 @@ -81,21 +73,36 @@ public interface ConnectService extends IService { return CachePrefix.CONNECT_AUTH.getPrefix() + type + uuid; } - /** - * app联合登录 回调 - * - * @param authUser 登录对象 - * @param uuid uuid - * @return - */ - Token appLoginCallback(ConnectAuthUser authUser, String uuid); - /** * 微信一键登录 * 小程序自动登录 没有账户自动注册 * - * @return + * @param params 微信小程序登录参数 + * @return token */ Token miniProgramAutoLogin(WechatMPLoginParams params); + + /** + * 根据查询dto获取查询对象 + * + * @param connectQueryDTO + * @return + */ + Connect queryConnect(ConnectQueryDTO connectQueryDTO); + + /** + * 根据会员id删除记录 + * + * @param userId 会员id + */ + void deleteByMemberId(String userId); + + /** + * 绑定第三方平台用户 + * @param userId 用户ID + * @param unionId 第三方平台用户ID + * @param type 平台类型 + */ + void loginBindUser(String userId, String unionId, String type); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectConfigServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectConfigServiceImpl.java deleted file mode 100644 index fa81bd46..00000000 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectConfigServiceImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.lili.modules.connect.serviceimpl; - -import cn.lili.modules.connect.entity.ConnectConfig; -import cn.lili.modules.connect.entity.enums.ConnectConfigEnum; -import cn.lili.modules.connect.entity.vo.ConnectConfigForm; -import cn.lili.modules.connect.mapper.ConnectConfigMapper; -import cn.lili.modules.connect.service.ConnectConfigService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 联合登陆配置接口实现 - * - * @author Chopper - */ -@Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ConnectConfigServiceImpl extends ServiceImpl implements ConnectConfigService { - - private final ConnectConfigMapper connectConfigMapper; - - @Override - public List listForms() { - - List formList = new ArrayList<>(); - for (int i = 0; i < ConnectConfigEnum.values().length; i++) { - ConnectConfigEnum enums = ConnectConfigEnum.values()[i]; - ConnectConfigForm form = new ConnectConfigForm(); - form.setKey(enums.name()); - form.setName(enums.getName()); - form.setForm(enums.getForm()); - formList.add(form); - } - - return formList; - } - - @Override - public ConnectConfig getConfig(String configKey) { - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("config_key", configKey); - ConnectConfig connectConfig = this.getOne(queryWrapper); - if (connectConfig == null) { - return new ConnectConfig(configKey); - } - return connectConfig; - } - - @Override - public ConnectConfig saveConfig(ConnectConfig connectConfig) { - return null; - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index 4d8f6fd3..260e1b34 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -1,40 +1,48 @@ package cn.lili.modules.connect.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.token.Token; -import cn.lili.common.token.base.generate.MemberTokenGenerate; -import cn.lili.common.utils.CookieUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.config.context.ThreadContextHolder; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; +import cn.lili.common.security.token.Token; +import cn.lili.common.utils.HttpUtils; +import cn.lili.common.utils.UuidUtils; import cn.lili.modules.connect.entity.Connect; +import cn.lili.modules.connect.entity.dto.AuthToken; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; +import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage; import cn.lili.modules.connect.entity.dto.WechatMPLoginParams; import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.mapper.ConnectMapper; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dto.ConnectQueryDTO; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.member.token.MemberTokenGenerate; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.connect.WechatConnectSetting; import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; -import cn.lili.modules.system.utils.HttpUtils; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.MemberTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -44,7 +52,6 @@ import java.nio.charset.StandardCharsets; import java.security.AlgorithmParameters; import java.security.Security; import java.util.*; -import java.util.concurrent.TimeUnit; /** * 联合登陆接口实现 @@ -53,85 +60,46 @@ import java.util.concurrent.TimeUnit; */ @Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ConnectServiceImpl extends ServiceImpl implements ConnectService { + static final boolean AUTO_REGION = true; @Autowired private SettingService settingService; - @Autowired private MemberService memberService; - - private MemberTokenGenerate memberTokenGenerate; - - private final Cache cache; - - static boolean AUTO_REGION = true; - @Autowired - public void setMemberTokenGenerate(MemberTokenGenerate memberTokenGenerate) { - this.memberTokenGenerate = memberTokenGenerate; - } + private MemberTokenGenerate memberTokenGenerate; + @Autowired + private Cache cache; + /** + * RocketMQ + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * RocketMQ配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; @Override - public Token unionLoginCallback(String type, String unionid, String uuid, boolean longTerm) throws NoPermissionException { - - try { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Connect::getUnionId, unionid); - queryWrapper.eq(Connect::getUnionType, type); - //查询绑定关系 - Connect connect = this.getOne(queryWrapper); - if (connect == null) { - throw new NoPermissionException("未绑定用户"); - } - //查询会员 - Member member = memberService.getById(connect.getUserId()); - //如果未绑定会员,则把刚才查询到的联合登录表数据删除 - if (member == null) { - this.remove(queryWrapper); - throw new NoPermissionException("未绑定用户"); - } - return memberTokenGenerate.createToken(member.getUsername(), longTerm); - } catch (NoPermissionException e) { - throw e; - } - } - - @Override - public Token unionLoginCallback(String type, ConnectAuthUser authUser, String uuid) { - - Token token; - try { - token = this.unionLoginCallback(type, authUser.getUuid(), uuid, false); - } catch (NoPermissionException e) { - if (AUTO_REGION) { - token = memberService.autoRegister(authUser); - return token; - } else { - //写入cookie - CookieUtil.addCookie(CONNECT_COOKIE, uuid, 1800, ThreadContextHolder.getHttpResponse()); - CookieUtil.addCookie(CONNECT_TYPE, type, 1800, ThreadContextHolder.getHttpResponse()); - //自动登录失败,则把信息缓存起来 - cache.put(ConnectService.cacheKey(type, uuid), authUser, 30L, TimeUnit.MINUTES); - throw new ServiceException("未绑定用户"); - } - } catch (Exception e) { - log.error("联合登陆异常:", e); - throw new ServiceException("未知错误,请稍后重试"); - } - return token; + @Transactional(rollbackFor = Exception.class) + public Token unionLoginCallback(ConnectAuthUser authUser, String uuid) { + return this.unionLoginCallback(authUser, false); } @Override public void bind(String unionId, String type) { - AuthUser authUser = UserContext.getCurrentUser(); + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); Connect connect = new Connect(authUser.getId(), unionId, type); this.save(connect); + + } @Override + @Transactional(rollbackFor = Exception.class) public void unbind(String type) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -148,23 +116,13 @@ public class ConnectServiceImpl extends ServiceImpl impl queryWrapper.eq(Connect::getUserId, UserContext.getCurrentUser().getId()); List connects = this.list(queryWrapper); List keys = new ArrayList<>(); - connects.forEach(item -> { - keys.add(item.getUnionType()); - }); + connects.forEach(item -> keys.add(item.getUnionType())); return keys; } - @Override - public Token appLoginCallback(ConnectAuthUser authUser, String uuid) { - try { - return this.unionLoginCallback(authUser.getSource(), authUser.getUuid(), uuid, true); - } catch (NoPermissionException e) { - return memberService.autoRegister(authUser); - } - } - @Override + @Transactional public Token miniProgramAutoLogin(WechatMPLoginParams params) { Object cacheData = cache.get(CachePrefix.WECHAT_SESSION_PARAMS.getPrefix() + params.getUuid()); @@ -191,8 +149,8 @@ public class ConnectServiceImpl extends ServiceImpl impl /** * 通过微信返回等code 获取openid 等信息 * - * @param code - * @return + * @param code 微信code + * @return 微信返回的信息 */ public JSONObject getConnect(String code) { WechatConnectSettingItem setting = getWechatMPSetting(); @@ -213,88 +171,167 @@ public class ConnectServiceImpl extends ServiceImpl impl * @param params 微信小程序自动登录参数 * @param openId 微信openid * @param unionId 微信unionid - * @return + * @return token */ + @Transactional(rollbackFor = Exception.class) public Token phoneMpBindAndLogin(String sessionKey, WechatMPLoginParams params, String openId, String unionId) { - String encryptedData = params.getEncryptedData(), iv = params.getIv(); - JSONObject userInfo = this.getUserInfo(encryptedData, sessionKey, iv); - log.info("联合登陆返回:{}", userInfo.toString()); - String phone = (String) userInfo.get("purePhoneNumber"); + try { + String encryptedData = params.getEncryptedData(); + String iv = params.getIv(); + JSONObject userInfo = this.getUserInfo(encryptedData, sessionKey, iv); + log.info("联合登陆返回:{}", userInfo.toString()); - //手机号登录 - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(Member::getMobile, phone); - Member member = memberService.getOne(lambdaQueryWrapper); - //如果不存在会员,则进行绑定微信openid 和 unionid,并且登录 - if (member != null) { - bindMpMember(openId, unionId, member); - return memberTokenGenerate.createToken(member.getUsername(), true); + + ConnectAuthUser connectAuthUser = new ConnectAuthUser(); + connectAuthUser.setUuid(openId); + connectAuthUser.setNickname(params.getNickName()); + connectAuthUser.setAvatar(params.getImage()); + + if (userInfo.containsKey("purePhoneNumber")) { + String phone = (String) userInfo.get("purePhoneNumber"); + connectAuthUser.setUsername("m" + phone); + connectAuthUser.setPhone(phone); + } else { + connectAuthUser.setUsername(UuidUtils.getUUID()); + } + connectAuthUser.setSource(ConnectEnum.WECHAT); + connectAuthUser.setType(ClientTypeEnum.WECHAT_MP); + + AuthToken authToken = new AuthToken(); + authToken.setUnionId(unionId); + connectAuthUser.setToken(authToken); + return this.unionLoginCallback(connectAuthUser, true); + } catch (Exception e) { + e.printStackTrace(); } + return null; + } - //如果没有会员,则根据手机号注册会员 - Member newMember = new Member("m" + phone,"111111",phone,params.getNickName(),params.getImage()); - memberService.save(newMember); - newMember = memberService.findByUsername(newMember.getUsername()); - bindMpMember(openId, unionId, newMember); - return memberTokenGenerate.createToken(newMember.getUsername(), true); + @Override + public Connect queryConnect(ConnectQueryDTO connectQueryDTO) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(connectQueryDTO.getUserId()), Connect::getUserId, + connectQueryDTO.getUserId()) + .eq(CharSequenceUtil.isNotEmpty(connectQueryDTO.getUnionType()), Connect::getUnionType, + connectQueryDTO.getUnionType()) + .eq(CharSequenceUtil.isNotEmpty(connectQueryDTO.getUnionId()), Connect::getUnionId, + connectQueryDTO.getUnionId()); + return this.getOne(queryWrapper,false); + } + + @Override + public void deleteByMemberId(String userId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Connect::getUserId, userId); + this.remove(queryWrapper); } /** - * 会员绑定 绑定微信小程序 - *

- * 如果openid 已经绑定其他账号,则这里不作处理,如果未绑定,则绑定最新的会员 - * 这样,微信小程序注册之后,其他app 公众号页面,都可以实现绑定自动登录功能 - *

+ * 成功登录,则检测cookie中的信息,进行会员绑定 * - * @param openId - * @param unionId - * @param member + * @param userId 用户ID + * @param unionId 第三方用户ID + * @param type 类型 */ - private void bindMpMember(String openId, String unionId, Member member) { - - - //如果unionid 不为空 则为账号绑定unionid - if (StringUtils.isNotEmpty(unionId)) { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); - lambdaQueryWrapper.eq(Connect::getUnionId, unionId); - lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT.name()); - List connects = this.list(lambdaQueryWrapper); - if (connects.size() == 0) { - Connect connect = new Connect(); - connect.setUnionId(unionId); - connect.setUserId(member.getId()); - connect.setUnionType(ConnectEnum.WECHAT.name()); - this.save(connect); - } - }//如果openid 不为空 则为账号绑定openid - if (StringUtils.isNotEmpty(openId)) { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); - lambdaQueryWrapper.eq(Connect::getUnionId, openId); - lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT_MP_OPEN_ID.name()); - List connects = this.list(lambdaQueryWrapper); - if (connects.size() == 0) { - Connect connect = new Connect(); - connect.setUnionId(openId); - connect.setUserId(member.getId()); - connect.setUnionType(ConnectEnum.WECHAT_MP_OPEN_ID.name()); - this.save(connect); - } + @Override + public void loginBindUser(String userId, String unionId, String type) { + Connect connect = this.queryConnect( + ConnectQueryDTO.builder().unionId(unionId).unionType(type).build() + ); + //如果未绑定则直接绑定 + if (connect == null) { + connect = new Connect(userId, unionId, type); + this.save(connect); + //如果已绑定不是当前用户信息则删除绑定信息,重新绑定 + } else if (!connect.getUserId().equals(userId)) { + this.removeById(connect.getId()); + this.loginBindUser(userId, unionId, type); } + } + + /** + * 第三方联合登陆 + * 1.判断是否使用开放平台 + * 1.1如果使用开放平台则使用UnionId进行登录 + * 1.2如果不适用开放平台则使用OpenId进行登录 + *

+ * 2.用户登录后判断绑定OpenId + * + * @param authUser 第三方登录封装类 + * @param longTerm 是否长时间有效 + * @return token + * @throws NoPermissionException 不允许操作 + */ + private Token unionLoginCallback(ConnectAuthUser authUser, boolean longTerm) { + + try { + Member member =null; + //判断是否传递手机号,如果传递手机号则使用手机号登录 + if(StrUtil.isNotBlank(authUser.getPhone())){ + member = memberService.findByMobile(authUser.getPhone()); + } + //如果未查到手机号的会员则使用第三方登录 + if(member==null){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + //使用UnionId登录 + if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) { + queryWrapper.eq(Connect::getUnionId, authUser.getToken().getUnionId()) + .eq(Connect::getUnionType, authUser.getSource()); + } else { + //使用OpenID登录 + SourceEnum sourceEnum = SourceEnum.getSourceEnum(authUser.getSource(), authUser.getType()); + queryWrapper.eq(Connect::getUnionId, authUser.getUuid()) + .eq(Connect::getUnionType, sourceEnum.name()); + } + + //查询绑定关系 + Connect connect = this.getOne(queryWrapper); + + if (connect == null) { + member = memberService.autoRegister(authUser); + } else { + //查询会员 + member = memberService.getById(connect.getUserId()); + //如果未绑定会员,则把刚才查询到的联合登录表数据删除 + if (member == null) { + this.remove(queryWrapper); + member = memberService.autoRegister(authUser); + } + } + } + + //发送用户第三方登录消息 + MemberConnectLoginMessage memberConnectLoginMessage = new MemberConnectLoginMessage(); + memberConnectLoginMessage.setMember(member); + memberConnectLoginMessage.setConnectAuthUser(authUser); + String destination = + rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_CONNECT_LOGIN.name(); + //发送用户第三方登录消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(memberConnectLoginMessage), + RocketmqSendCallbackBuilder.commonCallback()); + + return memberTokenGenerate.createToken(member, longTerm); + } catch (Exception e) { + log.error("联合登陆失败:", e); + throw e; + } } /** * 获取微信小程序配置 * - * @return + * @return 微信小程序配置 */ private WechatConnectSettingItem getWechatMPSetting() { Setting setting = settingService.get(SettingEnum.WECHAT_CONNECT.name()); - WechatConnectSetting wechatConnectSetting = JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class); + WechatConnectSetting wechatConnectSetting = JSONUtil.toBean(setting.getSettingValue(), + WechatConnectSetting.class); if (wechatConnectSetting == null) { - return null; + throw new ServiceException(ResultCode.WECHAT_CONNECT_NOT_EXIST); } //寻找对应对微信小程序登录配置 for (WechatConnectSettingItem wechatConnectSettingItem : wechatConnectSetting.getWechatConnectSettingItems()) { @@ -303,7 +340,7 @@ public class ConnectServiceImpl extends ServiceImpl impl } } - return null; + throw new ServiceException(ResultCode.WECHAT_CONNECT_NOT_EXIST); } @@ -316,14 +353,16 @@ public class ConnectServiceImpl extends ServiceImpl impl * @return 用户信息 */ public JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) { - // 被加密的数据 + + log.info("encryptedData:{},sessionKey:{},iv:{}", encryptedData, sessionKey, iv); + //被加密的数据 byte[] dataByte = Base64.getDecoder().decode(encryptedData); - // 加密秘钥 + //加密秘钥 byte[] keyByte = Base64.getDecoder().decode(sessionKey); - // 偏移量 + //偏移量 byte[] ivByte = Base64.getDecoder().decode(iv); try { - // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 + //如果密钥不足16位,那么就补足. 这个if 中的内容很重要 int base = 16; if (keyByte.length % base != 0) { int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); @@ -332,13 +371,13 @@ public class ConnectServiceImpl extends ServiceImpl impl System.arraycopy(keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } - // 初始化 + //初始化 Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); - // 初始化 + //初始化 cipher.init(Cipher.DECRYPT_MODE, spec, parameters); byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { @@ -346,8 +385,10 @@ public class ConnectServiceImpl extends ServiceImpl impl return JSONUtil.parseObj(result); } } catch (Exception e) { - e.printStackTrace(); + log.error("解密,获取微信信息错误", e); } throw new ServiceException(ResultCode.USER_CONNECT_ERROR); } + + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/connect/util/AuthChecker.java b/framework/src/main/java/cn/lili/modules/connect/util/AuthChecker.java index 250b0104..23337be6 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/AuthChecker.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/AuthChecker.java @@ -1,7 +1,7 @@ package cn.lili.modules.connect.util; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuth; import cn.lili.modules.connect.config.ConnectAuthEnum; @@ -47,9 +47,9 @@ public class AuthChecker { if (!GlobalAuthUtils.isHttpProtocol(redirectUri) && !GlobalAuthUtils.isHttpsProtocol(redirectUri)) { throw new AuthException(AuthResponseStatus.ILLEGAL_REDIRECT_URI, connectAuth); } - // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1 + //支付宝在创建回调地址时,不允许使用localhost或者106.124.130.167 if (ConnectAuthEnum.ALIPAY == connectAuth && GlobalAuthUtils.isLocalHost(redirectUri)) { - // The redirect uri of alipay is forbidden to use localhost or 127.0.0.1 + //The redirect uri of alipay is forbidden to use localhost or 106.124.130.167 throw new AuthException(AuthResponseStatus.ILLEGAL_REDIRECT_URI, connectAuth); } } @@ -66,7 +66,7 @@ public class AuthChecker { public static void checkCode(ConnectAuth connectAuth, AuthCallback callback) { String code = callback.getCode(); if (connectAuth == ConnectAuthEnum.ALIPAY) { - code = callback.getAuth_code(); + code = callback.getAuthCode(); } if (StringUtils.isEmpty(code)) { throw new AuthException(AuthResponseStatus.ILLEGAL_CODE, connectAuth); diff --git a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java index 4df6953b..c2f9c5d5 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java @@ -1,15 +1,16 @@ package cn.lili.modules.connect.util; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; -import cn.lili.common.token.Token; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.properties.ApiProperties; +import cn.lili.common.properties.DomainProperties; +import cn.lili.common.security.token.Token; import cn.lili.common.vo.ResultMessage; -import cn.lili.config.properties.ApiProperties; -import cn.lili.config.properties.DomainProperties; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.entity.dto.AuthCallback; @@ -17,8 +18,9 @@ import cn.lili.modules.connect.entity.dto.AuthResponse; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.request.AuthRequest; -import cn.lili.modules.connect.request.AuthWeChatPCRequest; -import cn.lili.modules.connect.request.AuthWeChatRequest; +import cn.lili.modules.connect.request.BaseAuthQQRequest; +import cn.lili.modules.connect.request.BaseAuthWeChatPCRequest; +import cn.lili.modules.connect.request.BaseAuthWeChatRequest; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.connect.QQConnectSetting; @@ -27,12 +29,15 @@ import cn.lili.modules.system.entity.dto.connect.dto.QQConnectSettingItem; import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 联合登陆工具类 @@ -41,65 +46,75 @@ import java.io.IOException; * @version v1.0 * 2020-11-25 21:16 */ +@Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ConnectUtil { - - private final Cache cache; - - private final ConnectService connectService; - - private final SettingService settingService; - - private final ApiProperties apiProperties; - - private final DomainProperties domainProperties; + @Autowired + private Cache cache; + @Autowired + private ConnectService connectService; + @Autowired + private SettingService settingService; + @Autowired + private ApiProperties apiProperties; + @Autowired + private DomainProperties domainProperties; - static String prefix = "/buyer/connect/callback/"; + static String prefix = "/buyer/passport/connect/connect/callback/"; - //回调地址获取 + /** + * 回调地址获取 + * + * @param connectAuthEnum 用户枚举 + * @return 回调地址 + */ String getRedirectUri(ConnectAuthEnum connectAuthEnum) { return apiProperties.getBuyer() + prefix + connectAuthEnum.getName(); } /** * 登录回调 + * 此方法处理第三方登录回调 + * 场景:PC、WAP(微信公众号) * - * @param type - * @param callback + * @param type 类型 + * @param callback 回调参数 * @param httpServletResponse + * @param httpServletRequest * @throws IOException */ - public void callback(String type, AuthCallback callback, HttpServletResponse httpServletResponse) throws IOException { + public void callback(String type, AuthCallback callback, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { AuthRequest authRequest = this.getAuthRequest(type); AuthResponse response = authRequest.login(callback); ResultMessage resultMessage; //联合登陆处理,如果响应正常,则录入响应结果到redis if (response.ok()) { ConnectAuthUser authUser = response.getData(); - Token token; try { - token = connectService.unionLoginCallback(type, authUser, callback.getState()); + Token token = connectService.unionLoginCallback(authUser, callback.getState()); resultMessage = ResultUtil.data(token); } catch (ServiceException e) { - resultMessage = ResultUtil.error(400,e.getMessage()); + throw new ServiceException(ResultCode.ERROR, e.getMessage()); } } //否则录入响应结果,等待前端获取信息 else { - resultMessage = ResultUtil.error(400,response.getMsg()); + throw new ServiceException(ResultCode.ERROR, response.getMsg()); } //缓存写入登录结果,300秒有效 cache.put(CachePrefix.CONNECT_RESULT.getPrefix() + callback.getCode(), resultMessage, 300L); -// String url = buyer + "/login?state=" + callback.getCode(); - String url = domainProperties.getWap() + "/pages/public/login?state=" + callback.getCode(); + //跳转地址 + String url = this.check(httpServletRequest.getHeader("user-agent")) ? + domainProperties.getWap() + "/pages/passport/login?state=" + callback.getCode() : + domainProperties.getPc() + "/login?state=" + callback.getCode(); + try { httpServletResponse.sendRedirect(url); } catch (Exception e) { - e.printStackTrace(); + log.error("登录回调错误", e); } } @@ -128,7 +143,7 @@ public class ConnectUtil { public AuthRequest getAuthRequest(String type) { ConnectAuthEnum authInterface = ConnectAuthEnum.valueOf(type); if (authInterface == null) { - throw new ServiceException("错误的登录方式"); + throw new ServiceException(ResultCode.CONNECT_NOT_EXIST); } AuthRequest authRequest = null; switch (authInterface) { @@ -139,7 +154,7 @@ public class ConnectUtil { for (WechatConnectSettingItem wechatConnectSettingItem : wechatConnectSetting.getWechatConnectSettingItems()) { if (wechatConnectSettingItem.getClientType().equals(ClientTypeEnum.H5.name())) { - authRequest = new AuthWeChatRequest(AuthConfig.builder() + authRequest = new BaseAuthWeChatRequest(AuthConfig.builder() .clientId(wechatConnectSettingItem.getAppId()) .clientSecret(wechatConnectSettingItem.getAppSecret()) .redirectUri(getRedirectUri(authInterface)) @@ -152,9 +167,10 @@ public class ConnectUtil { //寻找配置 Setting setting = settingService.get(SettingEnum.WECHAT_CONNECT.name()); WechatConnectSetting wechatConnectSetting = JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class); + for (WechatConnectSettingItem wechatConnectSettingItem : wechatConnectSetting.getWechatConnectSettingItems()) { if (wechatConnectSettingItem.getClientType().equals(ClientTypeEnum.PC.name())) { - authRequest = new AuthWeChatPCRequest(AuthConfig.builder() + authRequest = new BaseAuthWeChatPCRequest(AuthConfig.builder() .clientId(wechatConnectSettingItem.getAppId()) .clientSecret(wechatConnectSettingItem.getAppSecret()) .redirectUri(getRedirectUri(authInterface)) @@ -165,54 +181,23 @@ public class ConnectUtil { break; } case QQ: - //寻找配置 Setting setting = settingService.get(SettingEnum.QQ_CONNECT.name()); QQConnectSetting qqConnectSetting = JSONUtil.toBean(setting.getSettingValue(), QQConnectSetting.class); + for (QQConnectSettingItem qqConnectSettingItem : qqConnectSetting.getQqConnectSettingItemList()) { if (qqConnectSettingItem.getClientType().equals(ClientTypeEnum.PC.name())) { - authRequest = new AuthWeChatPCRequest(AuthConfig.builder() + authRequest = new BaseAuthQQRequest(AuthConfig.builder() .clientId(qqConnectSettingItem.getAppId()) .clientSecret(qqConnectSettingItem.getAppKey()) .redirectUri(getRedirectUri(authInterface)) + //这里qq获取unionid 需要配置为true,详情可以查阅属性说明,内部有帮助文档 + .unionId(true) .build(), cache); } } break; -// case ALIPAY: -// // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip -// authRequest = new AuthAlipayRequest(AuthConfig.builder() -// .clientId("") -// .clientSecret("") -// .alipayPublicKey("") -// .redirectUri(getRedirectUri(authInterface)) -// .build(), cache); -// break; -// case WEIBO: -// List scopes = new ArrayList<>(); -// scopes.add("all"); -// authRequest = new AuthWeiboRequest(AuthConfig.builder() -// .clientId("") -// .clientSecret("") -// .redirectUri(getRedirectUri(authInterface)) -// .scopes(scopes) -// .build(), cache); -// break; -// case "wechat_open": -// authRequest = new AuthWeChatOpenRequest(AuthConfig.builder() -// .clientId("") -// .clientSecret("") -// .redirectUri("https://z171l91606.51mypc.cn/callback/wechat") -// .build()); -// break; -// case "wechat_mp": -// authRequest = new AuthWeChatMpRequest(AuthConfig.builder() -// .clientId("") -// .clientSecret("") -// .redirectUri("") -// .build()); -// break; default: break; } @@ -222,6 +207,44 @@ public class ConnectUtil { return authRequest; } + /** + * \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔), + * 字符串在编译时会被转码一次,所以是 "\\b" + * \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔) + */ + static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i" + + "|windows (phone|ce)|blackberry" + + "|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp" + + "|laystation portable)|nokia|fennec|htc[-_]" + + "|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; + static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser" + + "|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; + /** + * 移动设备正则匹配:手机端、平板 + */ + static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE); + static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE); + + /** + * 检测是否是移动设备访问 + * + * @param userAgent 浏览器标识 + * @return true:移动设备接入,false:pc端接入 + * @Title: check + */ + private boolean check(String userAgent) { + if (null == userAgent) { + userAgent = ""; + } + //匹配 + Matcher matcherPhone = phonePat.matcher(userAgent); + Matcher matcherTable = tablePat.matcher(userAgent); + if (matcherPhone.find() || matcherTable.find()) { + return true; + } else { + return false; + } + } } diff --git a/framework/src/main/java/cn/lili/modules/connect/util/GlobalAuthUtils.java b/framework/src/main/java/cn/lili/modules/connect/util/GlobalAuthUtils.java index e4a7a256..2acb5c35 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/GlobalAuthUtils.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/GlobalAuthUtils.java @@ -1,5 +1,6 @@ package cn.lili.modules.connect.util; +import cn.lili.common.utils.Base64Utils; import cn.lili.common.utils.StringUtils; import cn.lili.modules.connect.exception.AuthException; import com.alibaba.fastjson.JSON; @@ -170,7 +171,7 @@ public class GlobalAuthUtils { * @return true: 本地主机(域名), false: 非本地主机(域名) */ public static boolean isLocalHost(String url) { - return StringUtils.isEmpty(url) || url.contains("127.0.0.1") || url.contains("localhost"); + return StringUtils.isEmpty(url) || url.contains("106.124.130.167") || url.contains("localhost"); } diff --git a/framework/src/main/java/cn/lili/modules/connect/util/HttpUtils.java b/framework/src/main/java/cn/lili/modules/connect/util/HttpUtils.java deleted file mode 100644 index e70a2b4e..00000000 --- a/framework/src/main/java/cn/lili/modules/connect/util/HttpUtils.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.lili.modules.connect.util; - -import com.xkcoding.http.HttpUtil; -import com.xkcoding.http.config.HttpConfig; -import com.xkcoding.http.support.HttpHeader; -import com.xkcoding.http.support.httpclient.HttpClientImpl; - -import java.util.Map; - -/** - * HttpUtil 工具,统一处理 http 请求,方便对 simple-http 做定制 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 4.1 - * @since 1.0.0 - */ -public class HttpUtils { - - public HttpUtils(HttpConfig config) { - HttpUtil.setConfig(config); - HttpUtil.setHttp(new HttpClientImpl()); - } - - public HttpUtils() { - } - - - /** - * GET 请求 - * - * @param url URL - * @return 结果 - */ - public String get(String url) { - return HttpUtil.get(url); - } - - /** - * GET 请求 - * - * @param url URL - * @param params 参数 - * @param header 请求头 - * @param encode 是否需要 url encode - * @return 结果 - */ - public String get(String url, Map params, HttpHeader header, boolean encode) { - return HttpUtil.get(url, params, header, encode); - } - - /** - * POST 请求 - * - * @param url URL - * @return 结果 - */ - public String post(String url) { - return HttpUtil.post(url); - } - - /** - * POST 请求 - * - * @param url URL - * @param data JSON 参数 - * @return 结果 - */ - public String post(String url, String data) { - return HttpUtil.post(url, data); - } - - /** - * POST 请求 - * - * @param url URL - * @param data JSON 参数 - * @param header 请求头 - * @return 结果 - */ - public String post(String url, String data, HttpHeader header) { - return HttpUtil.post(url, data, header); - } - - /** - * POST 请求 - * - * @param url URL - * @param params form 参数 - * @param encode 是否需要 url encode - * @return 结果 - */ - public String post(String url, Map params, boolean encode) { - return HttpUtil.post(url, params, encode); - } - - /** - * POST 请求 - * - * @param url URL - * @param params form 参数 - * @param header 请求头 - * @param encode 是否需要 url encode - * @return 结果 - */ - public String post(String url, Map params, HttpHeader header, boolean encode) { - return HttpUtil.post(url, params, header, encode); - } -} diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/Distribution.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/Distribution.java index a5a24a3d..96599e32 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/Distribution.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/Distribution.java @@ -1,39 +1,43 @@ package cn.lili.modules.distribution.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.distribution.entity.dto.DistributionApplyDTO; import cn.lili.modules.distribution.entity.enums.DistributionStatusEnum; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; /** * 分销员对象 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Data -@Entity @ApiModel(value = "分销员") @TableName("li_distribution") -@Table(name = "li_distribution") @NoArgsConstructor public class Distribution extends BaseEntity { private static final long serialVersionUID = -4878132663540847325L; - public Distribution(String memberId, String memberName, String name, String idNumber) { + public Distribution(String memberId, String memberName, DistributionApplyDTO distributionApplyDTO) { this.memberId = memberId; this.memberName = memberName; - this.name = name; - this.idNumber = idNumber; + this.distributionOrderCount=0; + this.rebateTotal=0D; + this.canRebate=0D; + this.commissionFrozen=0D; this.distributionStatus = DistributionStatusEnum.APPLY.name(); + BeanUtil.copyProperties(distributionApplyDTO, this); } @ApiModelProperty(value = "会员id") @@ -57,6 +61,8 @@ public class Distribution extends BaseEntity { @ApiModelProperty(value = "冻结金额") private Double commissionFrozen = 0D; + @ApiModelProperty(value = "分销订单数") + private Integer distributionOrderCount; /** * @see DistributionStatusEnum @@ -64,4 +70,19 @@ public class Distribution extends BaseEntity { @ApiModelProperty(value = "分销员状态", required = true) private String distributionStatus; + @Length(min = 1, max = 200, message = "结算银行开户行名称长度为1-200位") + @NotBlank(message = "结算银行开户行名称不能为空") + @ApiModelProperty(value = "结算银行开户行名称") + private String settlementBankAccountName; + + @Length(min = 1, max = 200, message = "结算银行开户账号长度为1-200位") + @NotBlank(message = "结算银行开户账号不能为空") + @ApiModelProperty(value = "结算银行开户账号") + private String settlementBankAccountNum; + + @Length(min = 1, max = 200, message = "结算银行开户支行名称长度为1-200位") + @NotBlank(message = "结算银行开户支行名称不能为空") + @ApiModelProperty(value = "结算银行开户支行名称") + private String settlementBankBranchName; + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionCash.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionCash.java index 9bfa342b..e04a5ff6 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionCash.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionCash.java @@ -1,7 +1,7 @@ package cn.lili.modules.distribution.entity.dos; -import cn.lili.base.BaseEntity; -import cn.lili.modules.distribution.entity.enums.DistributionCashStatusEnum; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -12,19 +12,15 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** * 分销佣金 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Data -@Entity -@Table(name = "li_distribution_cash") @TableName("li_distribution_cash") @ApiModel(value = "分销佣金") @NoArgsConstructor @@ -59,7 +55,7 @@ public class DistributionCash extends BaseEntity { this.sn = sn; this.distributionId = distributionId; this.price = price; - this.distributionCashStatus = DistributionCashStatusEnum.APPLY.name(); + this.distributionCashStatus = WithdrawStatusEnum.APPLY.name(); this.distributionName = memberName; } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionGoods.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionGoods.java index c967db20..ed8f2990 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionGoods.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionGoods.java @@ -3,9 +3,9 @@ package cn.lili.modules.distribution.entity.dos; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -17,10 +17,6 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import javax.validation.constraints.Max; import javax.validation.constraints.NotNull; import java.util.Date; @@ -30,25 +26,16 @@ import java.util.Map; * 分销商品 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Data -@Entity @ApiModel(value = "分销商品") -@Table(name = "li_distribution_goods") @TableName("li_distribution_goods") @NoArgsConstructor -public class DistributionGoods { +public class DistributionGoods extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建者", hidden = true) @@ -73,7 +60,6 @@ public class DistributionGoods { private String skuId; @ApiModelProperty(value = "规格信息json", hidden = true) - @Column(columnDefinition = "TEXT") @JsonIgnore private String specs; @@ -107,7 +93,7 @@ public class DistributionGoods { this.specs = ""; JSONObject jsonObject = JSONUtil.parseObj(goodsSku.getSpecs()); for (Map.Entry entry : jsonObject.entrySet()) { - if (!entry.getKey().equals("images")) { + if (!"images".equals(entry.getKey())) { this.specs = this.specs + entry.getKey() + ":" + entry.getValue() + " "; } } diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionOrder.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionOrder.java index 85902f6b..f29b9987 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionOrder.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionOrder.java @@ -2,9 +2,9 @@ package cn.lili.modules.distribution.entity.dos; import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum; import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -14,35 +14,22 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 分销订单 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Data -@Entity @ApiModel(value = "分销订单") @TableName("li_distribution_order") -@Table(name = "li_distribution_order") @NoArgsConstructor -public class DistributionOrder { +public class DistributionOrder extends BaseIdEntity { private static final long serialVersionUID = 501799944909496507L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -63,6 +50,9 @@ public class DistributionOrder { private String distributionId; @ApiModelProperty(value = "分销员名称") private String distributionName; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "解冻日期") private Date settleCycle; @ApiModelProperty(value = "提成金额") @@ -84,28 +74,27 @@ public class DistributionOrder { @ApiModelProperty(value = "货品ID") private String skuId; @ApiModelProperty(value = "规格") - @Column(columnDefinition = "TEXT") private String specs; @ApiModelProperty(value = "图片") private String image; @ApiModelProperty(value = "商品数量") private Integer num; - public DistributionOrder(StoreFlow storeFlow){ - distributionOrderStatus=DistributionOrderStatusEnum.WAIT_BILL.name(); - memberId=storeFlow.getMemberId(); - memberName=storeFlow.getMemberName(); - rebate=storeFlow.getDistributionRebate(); - storeId=storeFlow.getStoreId(); - storeName=storeFlow.getStoreName(); - orderSn=storeFlow.getOrderSn(); - orderItemSn=storeFlow.getOrderItemSn(); - goodsId=storeFlow.getGoodsId(); - goodsName=storeFlow.getGoodsName(); - skuId=storeFlow.getSkuId(); - specs=storeFlow.getSpecs(); - image=storeFlow.getImage(); - num= storeFlow.getNum(); + public DistributionOrder(StoreFlow storeFlow) { + distributionOrderStatus = DistributionOrderStatusEnum.NO_COMPLETED.name(); + memberId = storeFlow.getMemberId(); + memberName = storeFlow.getMemberName(); + rebate = storeFlow.getDistributionRebate(); + storeId = storeFlow.getStoreId(); + storeName = storeFlow.getStoreName(); + orderSn = storeFlow.getOrderSn(); + orderItemSn = storeFlow.getOrderItemSn(); + goodsId = storeFlow.getGoodsId(); + goodsName = storeFlow.getGoodsName(); + skuId = storeFlow.getSkuId(); + specs = storeFlow.getSpecs(); + image = storeFlow.getImage(); + num = storeFlow.getNum(); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionSelectedGoods.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionSelectedGoods.java index 5174ad08..3cfb0a62 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionSelectedGoods.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dos/DistributionSelectedGoods.java @@ -1,44 +1,30 @@ package cn.lili.modules.distribution.entity.dos; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; /** * 分销员已选择分销商品 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Data -@Entity @ApiModel(value = "分销商已选择分销商品") -@Table(name = "li_distribution_selected_goods") @TableName("li_distribution_selected_goods") @NoArgsConstructor -public class DistributionSelectedGoods { +public class DistributionSelectedGoods extends BaseIdEntity { - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @ApiModelProperty(value = "分销员ID") private String distributionId; - @ApiModelProperty(value = "分销员品ID") + @ApiModelProperty(value = "分销商品ID") private String distributionGoodsId; public DistributionSelectedGoods(String distributionId, String distributionGoodsId) { diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionApplyDTO.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionApplyDTO.java new file mode 100644 index 00000000..ed42feb3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionApplyDTO.java @@ -0,0 +1,41 @@ +package cn.lili.modules.distribution.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * 分销员申请DTO + * @author Bulbasaur + * @since 2021/6/30 11:07 上午 + * + */ +@Data +public class DistributionApplyDTO { + + @NotBlank(message = "姓名不能为空") + @ApiModelProperty(value = "会员姓名") + private String name; + + @NotBlank(message = "身份证号不能为空") + @ApiModelProperty(value = "身份证号") + private String idNumber; + + @Length(min = 1, max = 200, message = "结算银行开户行名称长度为1-200位") + @NotBlank(message = "结算银行开户行名称不能为空") + @ApiModelProperty(value = "结算银行开户行名称") + private String settlementBankAccountName; + + @Length(min = 1, max = 200, message = "结算银行开户账号长度为1-200位") + @NotBlank(message = "结算银行开户账号不能为空") + @ApiModelProperty(value = "结算银行开户账号") + private String settlementBankAccountNum; + + @Length(min = 1, max = 200, message = "结算银行开户支行名称长度为1-200位") + @NotBlank(message = "结算银行开户支行名称不能为空") + @ApiModelProperty(value = "结算银行开户支行名称") + private String settlementBankBranchName; +} diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java index 70cead14..4f9cd438 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java @@ -1,37 +1,50 @@ package cn.lili.modules.distribution.entity.dto; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Objects; /** * 分销员商品查询条件 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ +@EqualsAndHashCode(callSuper = true) @Data public class DistributionGoodsSearchParams extends PageVO { + @ApiModelProperty(value = "商品ID") + private String goodsId; + @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "是否已选择") private boolean isChecked; + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = this.distributionQueryWrapper(); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(goodsId), "goods_id", goodsId); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(goodsName), "goods_name", goodsId); + return queryWrapper; + } public QueryWrapper storeQueryWrapper() { QueryWrapper queryWrapper = this.distributionQueryWrapper(); - queryWrapper.eq("dg.store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.eq("dg.store_id", Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId()); return queryWrapper; } public QueryWrapper distributionQueryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq(StringUtils.isNotEmpty(goodsName), "dg.goods_name", goodsName); + queryWrapper.like(CharSequenceUtil.isNotEmpty(goodsName), "dg.goods_name", goodsName); return queryWrapper; } diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionSearchParams.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionSearchParams.java index 49d0b226..4233113e 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionSearchParams.java @@ -9,7 +9,7 @@ import lombok.Data; * 分销查询参数 * * @author Chopper - * @date 2021/3/20 10:13 + * @since 2021/3/20 10:13 */ @Data public class DistributionSearchParams { diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionCashStatusEnum.java b/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionCashStatusEnum.java deleted file mode 100644 index 56e0a137..00000000 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionCashStatusEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.lili.modules.distribution.entity.enums; - -/** - * 分销佣金状态 - * - * @author pikachu - * @date 2020-03-14 23:04:56 - */ -public enum DistributionCashStatusEnum { - /** - * 待处理 - */ - APPLY("待处理"), - /** - * 通过 - */ - PASS("通过"), - /** - * 拒绝 - */ - REFUSE("拒绝"); - - - private final String description; - - DistributionCashStatusEnum(String description) { - this.description = description; - } -} diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionOrderStatusEnum.java b/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionOrderStatusEnum.java index dfc0266a..240b9752 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionOrderStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionOrderStatusEnum.java @@ -4,9 +4,10 @@ package cn.lili.modules.distribution.entity.enums; * 分销员订单状态 * * @author pikachu - * @date 2020-03-14 23:04:56 */ public enum DistributionOrderStatusEnum { + //未完成 + NO_COMPLETED("未完成"), //待结算(冻结) WAIT_BILL("待结算"), //待提现 diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionStatusEnum.java b/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionStatusEnum.java index fc02eab0..302ad4f1 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/enums/DistributionStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.distribution.entity.enums; * 分销员状态 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ public enum DistributionStatusEnum { /** diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionCashSearchParams.java b/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionCashSearchParams.java index 71302248..4373e307 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionCashSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionCashSearchParams.java @@ -10,7 +10,7 @@ import lombok.Data; * 分销佣金查询信息 * * @author pikachu - * @date 2020-03-26 09:04:53 + * @since 2020-03-26 09:04:53 */ @Data public class DistributionCashSearchParams extends PageVO { diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionGoodsVO.java b/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionGoodsVO.java index 73a075d9..e6987b2b 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionGoodsVO.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionGoodsVO.java @@ -5,14 +5,13 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; import java.util.Date; /** * 分销商品信息 * * @author pikachu - * @date 2020-03-26 09:04:53 + * @since 2020-03-26 09:04:53 */ @Data public class DistributionGoodsVO { @@ -23,7 +22,6 @@ public class DistributionGoodsVO { @ApiModelProperty(value = "商品名称") private String goodsName; - @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "规格") private String specs; @@ -39,6 +37,9 @@ public class DistributionGoodsVO { @ApiModelProperty(value = "商品编号") private String sn; + @ApiModelProperty(value = "商品ID") + private String goodsId; + @ApiModelProperty(value = "规格ID") private String skuId; diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionOrderSearchParams.java b/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionOrderSearchParams.java index 9a4512e6..dc570fa3 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionOrderSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/vos/DistributionOrderSearchParams.java @@ -16,7 +16,7 @@ import java.util.Date; * 分销员对象 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Data @ApiModel(value = "分销订单查询对象") @@ -30,7 +30,7 @@ public class DistributionOrderSearchParams extends PageVO { @ApiModelProperty(value = "订单sn") private String orderSn; - @ApiModelProperty(value = "分销员ID",hidden = true) + @ApiModelProperty(value = "分销员ID", hidden = true) private String distributionId; @ApiModelProperty(value = "分销订单状态") @@ -55,9 +55,10 @@ public class DistributionOrderSearchParams extends PageVO { queryWrapper.like(StringUtils.isNotBlank(distributionName), "distribution_name", distributionName); queryWrapper.eq(StringUtils.isNotBlank(distributionOrderStatus), "distribution_order_status", distributionOrderStatus); queryWrapper.eq(StringUtils.isNotBlank(orderSn), "order_sn", orderSn); - queryWrapper.eq(StringUtils.isNotBlank(StringUtils.toString(distributionId)), "distribution_id", distributionId); - queryWrapper.eq(StringUtils.isNotBlank(StringUtils.toString(storeId)), "store_id", storeId); + queryWrapper.eq(StringUtils.isNotBlank(distributionId), "distribution_id", distributionId); + queryWrapper.eq(StringUtils.isNotBlank(storeId), "store_id", storeId); if (endTime != null && startTime != null) { + endTime = DateUtil.endOfDate(endTime); queryWrapper.between("create_time", startTime, endTime); } return queryWrapper; diff --git a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionCashMapper.java b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionCashMapper.java index ec21ecf1..5a3c9a4a 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionCashMapper.java +++ b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionCashMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 分销佣金数据处理层 * * @author pikachu - * @date 2020-03-26 18:45:56 + * @since 2020-03-26 18:45:56 */ public interface DistributionCashMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionGoodsMapper.java b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionGoodsMapper.java index 57e6d1a5..018886b4 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionGoodsMapper.java +++ b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionGoodsMapper.java @@ -13,17 +13,40 @@ import org.apache.ibatis.annotations.Select; * 分销商品数据处理层 * * @author pikachu - * @date 2020-03-24 23:04:56 + * @since 2020-03-24 23:04:56 */ public interface DistributionGoodsMapper extends BaseMapper { + /** + * 获取分销员未选择商品VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @param distributionId 分销员ID + * @return 分销员未选择商品VO分页 + */ @Select("SELECT dg.* FROM li_distribution_goods dg WHERE dg.id NOT IN(SELECT distribution_goods_id FROM li_distribution_selected_goods WHERE distribution_id=${distributionId}) ${ew.customSqlSegment}") IPage notSelectGoods(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper, String distributionId); + /** + * 获取分销员已选择分销商品VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @param distributionId 分销员ID + * @return 分销员已选择分销商品VO分页 + */ @Select("SELECT dg.* FROM li_distribution_goods dg WHERE dg.id IN(SELECT distribution_goods_id FROM li_distribution_selected_goods WHERE distribution_id=${distributionId}) ${ew.customSqlSegment}") IPage selectGoods(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper, String distributionId); - @Select("SELECT dg.* FROM li_distribution_goods dg LEFT JOIN li_distribution_selected_goods dsg ON dg.id = dsg.distribution_goods_id ${ew.customSqlSegment}") + /** + * 获取分销商品VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 分销商品VO分页 + */ + @Select("SELECT dg.* FROM li_distribution_goods dg ${ew.customSqlSegment}") IPage getDistributionGoodsVO(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionMapper.java b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionMapper.java index 91617051..d8ceab1c 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionMapper.java +++ b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionMapper.java @@ -9,10 +9,29 @@ import org.apache.ibatis.annotations.Update; * 分销员数据处理层 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ public interface DistributionMapper extends BaseMapper { - @Update("UPDATE li_distribution set can_rebate = can_rebate+#{canRebate} WHERE id = #{distributionId}") - void updateCanRebate(Double canRebate,String distributionId); + /** + * 修改分销员可提现金额 + * + * @param commissionFrozen 分销金额 + * @param distributionId 分销员ID + */ + @Update("UPDATE li_distribution set commission_frozen = (IFNULL(commission_frozen,0)+#{commissionFrozen}) " + + ", rebate_total=(IFNULL(rebate_total,0)+#{commissionFrozen}) WHERE id = #{distributionId}") + void subCanRebate(Double commissionFrozen, String distributionId); + + /** + * 添加分销金额 + * + * @param commissionFrozen 分销金额 + * @param distributionId 分销员ID + */ + @Update("UPDATE li_distribution set commission_frozen = (IFNULL(commission_frozen,0)+#{commissionFrozen}) " + + ", rebate_total=(IFNULL(rebate_total,0)+#{commissionFrozen}) " + + ", distribution_order_count=(IFNULL(distribution_order_count,0)+1) WHERE id = #{distributionId}") + void addCanRebate(Double commissionFrozen, String distributionId); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java index 02d8d8e1..79b9b9bd 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java +++ b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java @@ -3,22 +3,25 @@ package cn.lili.modules.distribution.mapper; import cn.hutool.core.date.DateTime; import cn.lili.modules.distribution.entity.dos.DistributionOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; /** * 分销订单数据处理层 * * @author pikachu - * @date 2020-03-15 10:45:56 + * @since 2020-03-15 10:45:56 */ public interface DistributionOrderMapper extends BaseMapper { /** - * 分销提佣 + * 修改分销员提现金额 + * + * @param distributionOrderStatus 分销订单状态 + * @param settleCycle 时间 */ - @Select("UPDATE li_distribution AS d SET " + - "d.can_rebate =(can_rebate +(SELECT SUM( dorder.rebate ) FROM li_distribution_order AS dorder " + - "WHERE dorder.distribution_id = d.id AND dorder.distribution_order_status=#{distributionOrderStatus} AND dorder.settle_cycle<=#{settleCycle}))") + @Update("UPDATE li_distribution AS d " + + "SET d.can_rebate =(ifnull(d.can_rebate,0) +(SELECT SUM( dorder.rebate ) FROM li_distribution_order AS dorder WHERE dorder.distribution_order_status = #{distributionOrderStatus} AND dorder.settle_cycle< #{settleCycle} AND dorder.distribution_id = d.id ))" + + ",d.commission_frozen =(ifnull(d.commission_frozen,0) -(SELECT SUM( dorder.rebate ) FROM li_distribution_order AS dorder WHERE dorder.distribution_order_status = #{distributionOrderStatus} AND dorder.settle_cycle< #{settleCycle} AND dorder.distribution_id = d.id ) )") void rebate(String distributionOrderStatus, DateTime settleCycle); -} \ No newline at end of file +} diff --git a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionSelectedGoodsMapper.java b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionSelectedGoodsMapper.java index e104a837..6b4335da 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionSelectedGoodsMapper.java +++ b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionSelectedGoodsMapper.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 选择分销商品数据处理层 * * @author pikachu - * @date 2020-03-15 10:45:56 + * @since 2020-03-15 10:45:56 */ public interface DistributionSelectedGoodsMapper extends BaseMapper { } diff --git a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionCashService.java b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionCashService.java index f7011a7d..2a107b9f 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionCashService.java +++ b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionCashService.java @@ -12,21 +12,23 @@ import org.springframework.web.bind.annotation.RequestParam; * 分销佣金业务层 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ public interface DistributionCashService extends IService { /** * 提交分销提现申请 * - * @param applyMoney + * @param applyMoney 申请金额 + * @return 操作状态 */ Boolean cash(Double applyMoney); /** * 获取当前会员的分销提现分页列表 * - * @return + * @param page 分页 + * @return 申请提现分页 */ IPage getDistributionCash(PageVO page); @@ -47,10 +49,4 @@ public interface DistributionCashService extends IService { */ DistributionCash audit(@PathVariable String id, @RequestParam String result); - /** - * 待处理分销员提现申请数量 - * - * @return 待处理分销员提现申请数量 - */ - Integer newDistributionCash(); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionGoodsService.java b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionGoodsService.java index 868d35da..08df403a 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionGoodsService.java +++ b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionGoodsService.java @@ -6,12 +6,14 @@ import cn.lili.modules.distribution.entity.vos.DistributionGoodsVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * 分销商品业务层 * * @author pikachu - * @date 2020-03-24 10:46:33 + * @since 2020-03-24 10:46:33 */ public interface DistributionGoodsService extends IService { @@ -19,10 +21,34 @@ public interface DistributionGoodsService extends IService { * 根据条件分页查询分销商品信息 * * @param distributionGoodsSearchParams 商品条件 - * @return + * @return 分页分销商品信息 */ IPage goodsPage(DistributionGoodsSearchParams distributionGoodsSearchParams); + + /** + * 根据条件查询分销商品信息列表 + * + * @param distributionGoodsSearchParams 条件 + * @return 分销商品信息列表 + */ + List getDistributionGoodsList(DistributionGoodsSearchParams distributionGoodsSearchParams); + + /** + * 根据条件查询分销商品信息 + * + * @param distributionGoodsSearchParams 条件 + * @return 分销商品信息 + */ + DistributionGoods getDistributionGoods(DistributionGoodsSearchParams distributionGoodsSearchParams); + + /** + * 根据条件删除分销商品 + * + * @param distributionGoodsSearchParams 条件 + */ + boolean deleteDistributionGoods(DistributionGoodsSearchParams distributionGoodsSearchParams); + /** * 获取分销商品 * @@ -39,13 +65,22 @@ public interface DistributionGoodsService extends IService { */ DistributionGoods distributionGoodsVOBySkuId(String skuId); + /** + * 批量获取分销商品 + * + * @param skuIds sku id集合 + * @return 分销商品 + */ + List distributionGoods(List skuIds); + /** * 选择分销商品 * * @param skuId SKU ID * @param commission 佣金 + * @param storeId 店铺id * @return */ - DistributionGoods checked(String skuId, Double commission); + DistributionGoods checked(String skuId, Double commission, String storeId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionOrderService.java b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionOrderService.java index 894773a6..7b52cf36 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionOrderService.java +++ b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionOrderService.java @@ -1,16 +1,20 @@ package cn.lili.modules.distribution.service; +import cn.hutool.core.date.DateTime; import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams; +import cn.lili.modules.order.order.entity.dos.OrderItem; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * 分销订单业务层 * * @author pikachu - * @date 2020-03-15 10:46:33 + * @since 2020-03-15 10:46:33 */ public interface DistributionOrderService extends IService { @@ -27,7 +31,7 @@ public interface DistributionOrderService extends IService { * * @param orderSn 订单编号 */ - void payOrder(String orderSn); + void calculationDistribution(String orderSn); /** * 取消订单 @@ -45,4 +49,17 @@ public interface DistributionOrderService extends IService { */ void refundOrder(String afterSaleSn); + /** + * 分销订单状态修改 + * + * @param orderItems + */ + void updateDistributionOrderStatus(List orderItems); + + /** + * 分销订单结算 + * @param dateTime + * @param distributionOrderStatus + */ + void updateRebate(DateTime dateTime, String distributionOrderStatus); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionSelectedGoodsService.java b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionSelectedGoodsService.java index 3912291d..5a11b548 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionSelectedGoodsService.java +++ b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionSelectedGoodsService.java @@ -6,14 +6,28 @@ import com.baomidou.mybatisplus.extension.service.IService; * 分销选择商品业务层 * * @author pikachu - * @date 2020-03-24 10:46:33 + * @since 2020-03-24 10:46:33 */ public interface DistributionSelectedGoodsService extends IService { /** * 分销员添加分销商品 * @param distributionGoodsId 分销商品ID - * @return + * @return 是否添加成功 */ boolean add(String distributionGoodsId); + + /** + * 分销员删除分销商品 + * @param distributionGoodsId 分销商品ID + * @return 是否删除成功 + */ + boolean delete(String distributionGoodsId); + + /** + * 分销员删除分销商品(管理员操作) + * @param distributionGoodsId 分销商品ID + * @return 是否删除成功 + */ + boolean deleteByDistributionGoodsId(String distributionGoodsId); } diff --git a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionService.java b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionService.java index a43c1b77..8b42b066 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/service/DistributionService.java +++ b/framework/src/main/java/cn/lili/modules/distribution/service/DistributionService.java @@ -2,6 +2,7 @@ package cn.lili.modules.distribution.service; import cn.lili.common.vo.PageVO; import cn.lili.modules.distribution.entity.dos.Distribution; +import cn.lili.modules.distribution.entity.dto.DistributionApplyDTO; import cn.lili.modules.distribution.entity.dto.DistributionSearchParams; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -11,7 +12,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 分销员业务层 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ public interface DistributionService extends IService { @@ -34,9 +35,10 @@ public interface DistributionService extends IService { /** * 提交分销申请 * - * @return + * @param distributionApplyDTO 分销申请DTO + * @return 分销员 */ - Distribution applyDistribution(String name, String idNumber); + Distribution applyDistribution(DistributionApplyDTO distributionApplyDTO); /** * 审核分销申请 @@ -66,7 +68,7 @@ public interface DistributionService extends IService { /** * 绑定会员的分销员关系 * - * @return + * @param distributionId 分销员ID */ void bindingDistribution(String distributionId); @@ -77,9 +79,17 @@ public interface DistributionService extends IService { /** * 修改可提现金额 - * @param canRebate 修改金额 + * + * @param canRebate 修改金额 * @param distributionId 分销员ID */ - void updateCanRebate(Double canRebate,String distributionId); + void subCanRebate(Double canRebate, String distributionId); + /** + * 添加分销金额 + * + * @param rebate 金额 + * @param distributionId 分销员ID + */ + void addRebate(Double rebate, String distributionId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java index bdde5e00..122b23d2 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionCashServiceImpl.java @@ -2,31 +2,29 @@ package cn.lili.modules.distribution.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.MemberTagsEnum; -import cn.lili.common.rocketmq.tags.OtherTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.PageUtil; import cn.lili.common.utils.SnowFlake; import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.distribution.entity.dos.Distribution; import cn.lili.modules.distribution.entity.dos.DistributionCash; -import cn.lili.modules.distribution.entity.enums.DistributionCashStatusEnum; import cn.lili.modules.distribution.entity.enums.DistributionStatusEnum; import cn.lili.modules.distribution.entity.vos.DistributionCashSearchParams; import cn.lili.modules.distribution.mapper.DistributionCashMapper; import cn.lili.modules.distribution.service.DistributionCashService; import cn.lili.modules.distribution.service.DistributionService; -import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage; -import cn.lili.modules.member.entity.enums.MemberWithdrawalDestinationEnum; -import cn.lili.modules.member.service.MemberWalletService; -import cn.lili.modules.order.trade.entity.enums.DepositServiceTypeEnum; +import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; +import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum; +import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; +import cn.lili.modules.wallet.service.MemberWalletService; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.MemberTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,22 +37,27 @@ import java.util.Date; * 分销佣金业务层实现 * * @author pikachu - * @date 2020-03-126 18:04:56 + * @since 2020-03-126 18:04:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionCashServiceImpl extends ServiceImpl implements DistributionCashService { - //分销员 - private final DistributionService distributionService; - //会员余额 - private final MemberWalletService memberWalletService; - - private final RocketMQTemplate rocketMQTemplate; - - private final RocketmqCustomProperties rocketmqCustomProperties; + /** + * 分销员 + */ + @Autowired + private DistributionService distributionService; + /** + * 会员余额 + */ + @Autowired + private MemberWalletService memberWalletService; + @Autowired + private RocketMQTemplate rocketMQTemplate; + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; @Override + @Transactional(rollbackFor = Exception.class) public Boolean cash(Double applyMoney) { //检查分销功能开关 @@ -74,13 +77,13 @@ public class DistributionCashServiceImpl extends ServiceImpl implements DistributionGoodsService { - //分销商品 - private final DistributionGoodsMapper distributionGoodsMapper; - //分销员 + /** + * 分销员 + */ @Autowired private DistributionService distributionService; - //规格商品 + /** + * 规格商品 + */ @Autowired private GoodsSkuService goodsSkuService; @Override public IPage goodsPage(DistributionGoodsSearchParams searchParams) { //获取商家的分销商品列表 - if (UserContext.getCurrentUser().getRole().equals(UserEnums.STORE)) { - return distributionGoodsMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.storeQueryWrapper()); + if (Objects.requireNonNull(UserContext.getCurrentUser()).getRole().equals(UserEnums.STORE)) { + return this.baseMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.storeQueryWrapper()); } else if (UserContext.getCurrentUser().getRole().equals(UserEnums.MEMBER)) { //判断当前登录用户是否为分销员 Distribution distribution = distributionService.getDistribution(); if (distribution != null) { //判断查看已选择的分销商品列表 if (searchParams.isChecked()) { - return distributionGoodsMapper.selectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); + return this.baseMapper.selectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); } else { - return distributionGoodsMapper.notSelectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); + return this.baseMapper.notSelectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); } } throw new ServiceException(ResultCode.DISTRIBUTION_NOT_EXIST); } //如果是平台则直接进行查询 - return distributionGoodsMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper()); + return this.baseMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper()); + } + + /** + * 根据条件查询分销商品信息列表 + * + * @param distributionGoodsSearchParams 商品条件 + * @return 分销商品信息列表 + */ + @Override + public List getDistributionGoodsList(DistributionGoodsSearchParams distributionGoodsSearchParams) { + return this.list(distributionGoodsSearchParams.queryWrapper()); + } + + /** + * 根据条件查询分销商品信息 + * + * @param distributionGoodsSearchParams 条件 + * @return 分销商品信息 + */ + @Override + public DistributionGoods getDistributionGoods(DistributionGoodsSearchParams distributionGoodsSearchParams) { + return this.getOne(distributionGoodsSearchParams.queryWrapper(), false); + } + + /** + * 根据条件删除分销商品 + * + * @param distributionGoodsSearchParams 条件 + */ + @Override + public boolean deleteDistributionGoods(DistributionGoodsSearchParams distributionGoodsSearchParams) { + return this.remove(distributionGoodsSearchParams.queryWrapper()); } @Override @@ -75,11 +108,16 @@ public class DistributionGoodsServiceImpl extends ServiceImpl().eq(DistributionGoods::getSkuId,skuId)); + return this.getOne(new LambdaUpdateWrapper().eq(DistributionGoods::getSkuId, skuId)); } @Override - public DistributionGoods checked(String skuId, Double commission) { + public List distributionGoods(List skuIds) { + return this.list(new LambdaUpdateWrapper().in(DistributionGoods::getSkuId, skuIds)); + } + + @Override + public DistributionGoods checked(String skuId, Double commission, String storeId) { //检查分销功能开关 distributionService.checkDistributionSetting(); @@ -91,6 +129,9 @@ public class DistributionGoodsServiceImpl extends ServiceImpl implements DistributionOrderService { - //订单 - private final OrderService orderService; - //店铺流水 - private final StoreFlowService storeFlowService; - //分销员 - private final DistributionService distributionService; - //系统设置 - private final SettingService settingService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 店铺流水 + */ + @Autowired + private StoreFlowService storeFlowService; + /** + * 分销员 + */ + @Autowired + private DistributionService distributionService; + /** + * 系统设置 + */ + @Autowired + private SettingService settingService; @Override public IPage getDistributionOrderPage(DistributionOrderSearchParams distributionOrderSearchParams) { @@ -58,23 +82,35 @@ public class DistributionOrderServiceImpl extends ServiceImpl storeFlowList = storeFlowService.list(new LambdaQueryWrapper() - .eq(StoreFlow::getOrderSn, orderSn) - .isNotNull(StoreFlow::getDistributionRebate)); + List storeFlowList = storeFlowService + .listStoreFlow(StoreFlowQueryDTO.builder().justDistribution(true).orderSn(orderSn).build()); + double rebate = 0.0; + //循环店铺流水记录判断是否包含分销商品 + //包含分销商品则进行记录分销订单、计算分销总额 for (StoreFlow storeFlow : storeFlowList) { + if (storeFlow.getDistributionRebate() == null || storeFlow.getDistributionRebate() == 0) { + continue; + } + rebate = CurrencyUtil.add(rebate, storeFlow.getDistributionRebate()); DistributionOrder distributionOrder = new DistributionOrder(storeFlow); distributionOrder.setDistributionId(order.getDistributionId()); - //分销员信息 Distribution distribution = distributionService.getById(order.getDistributionId()); distributionOrder.setDistributionName(distribution.getMemberName()); @@ -82,50 +118,224 @@ public class DistributionOrderServiceImpl extends ServiceImpl distributionOrderList = this.list(new LambdaQueryWrapper() + .eq(DistributionOrder::getOrderSn, orderSn)); + + //如果没有分销定单,则直接返回 + if (distributionOrderList.isEmpty()) { + return; + } + //分销金额 + double rebate = 0.0; + + //包含分销商品则进行记录分销订单、计算分销总额 + for (DistributionOrder distributionOrder : distributionOrderList) { + rebate = CurrencyUtil.add(rebate, distributionOrder.getRebate()); + } + + //如果包含分销商品则记录会员的分销总额 + if (rebate != 0.0) { + distributionService.subCanRebate(CurrencyUtil.sub(0, rebate), order.getDistributionId()); + } + } + + //修改分销订单的状态 this.update(new LambdaUpdateWrapper().eq(DistributionOrder::getOrderSn, orderSn) .set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.CANCEL.name())); + } @Override public void refundOrder(String afterSaleSn) { //判断是否为分销订单 - StoreFlow storeFlow = storeFlowService.getOne(new LambdaQueryWrapper() - .eq(StoreFlow::getRefundSn, afterSaleSn) - .isNotNull(StoreFlow::getDistributionRebate)); + StoreFlow storeFlow = storeFlowService.queryOne(StoreFlowQueryDTO.builder().justDistribution(true).refundSn(afterSaleSn).build()); if (storeFlow != null) { //获取收款分销订单 DistributionOrder distributionOrder = this.getOne(new LambdaQueryWrapper() .eq(DistributionOrder::getOrderItemSn, storeFlow.getOrderItemSn())); - - //已提交无法重复提交 - //如果未结算则将分销订单取消 - //如果已结算则创建退款分销订单 - if(distributionOrder.getDistributionOrderStatus().equals(DistributionOrderStatusEnum.CANCEL.name())){ - return ; - } else if(distributionOrder.getDistributionOrderStatus().equals(DistributionOrderStatusEnum.WAIT_BILL.name())){ - this.update(new LambdaUpdateWrapper().eq(DistributionOrder::getOrderItemSn, storeFlow.getOrderItemSn()) + //分销订单不存在,则直接返回 + if (distributionOrder == null) { + return; + } + if (distributionOrder.getDistributionOrderStatus().equals(DistributionOrderStatusEnum.WAIT_BILL.name())) { + this.update(new LambdaUpdateWrapper() + .eq(DistributionOrder::getOrderItemSn, storeFlow.getOrderItemSn()) .set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.CANCEL.name())); - }else{ - //创建分销退款订单 - DistributionOrder backDistributionOrder = new DistributionOrder(); - - this.save(backDistributionOrder); + } + //如果已结算则创建退款分销订单 + else { //修改分销员提成金额 - distributionService.updateCanRebate(CurrencyUtil.sub(0,storeFlow.getDistributionRebate()),distributionOrder.getDistributionId()); + distributionService.subCanRebate(CurrencyUtil.sub(0, storeFlow.getDistributionRebate()), distributionOrder.getDistributionId()); } } } + @Override + public void updateDistributionOrderStatus(List orderItems) { + if (orderItems.isEmpty()) { + return; + } + + //获取未完成分销订单 + List distributionOrderList = this.list(new LambdaQueryWrapper() + .eq(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.NO_COMPLETED.name())); + + if (distributionOrderList.isEmpty()) { + return; + } + + List list = ListUtil.list(false); + + orderItems.stream().forEach(orderItem -> { + //订单售后状态为已失效并且投诉状态为已失效 + if (StrUtil.equals(OrderItemAfterSaleStatusEnum.EXPIRED.name(), orderItem.getAfterSaleStatus())) { + + + List collect = distributionOrderList.stream() + .filter(distributionOrder -> StrUtil.equals(distributionOrder.getOrderItemSn(), orderItem.getSn())) + .map((distributionOrder) -> { + distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.WAIT_BILL.name()); + distributionOrder.setSettleCycle(new Date()); + return distributionOrder; + }) + .collect(Collectors.toList()); + + list.addAll(collect); + } + + }); + + if (!list.isEmpty()) { + //批量修改分销订单结算状态 + this.updateBatchById(list); + } + } + + @Override + public void updateRebate(DateTime dateTime, String distributionOrderStatus) { + //结算时间延后五分钟 + dateTime = dateTime.offsetNew(DateField.MINUTE, 5); + //获取待结算订单 + List distributionOrderList = this.list(new LambdaQueryWrapper() + .eq(DistributionOrder::getDistributionOrderStatus, distributionOrderStatus) + .isNotNull(DistributionOrder::getSettleCycle) + .le(DistributionOrder::getSettleCycle, dateTime)); + //校验待结算订单 + if (ObjectUtil.isNotNull(distributionOrderList) && distributionOrderList.size() > 0) { + //结算分销人员信息列表 + List distributionUpdateList = new ArrayList<>(); + //获取分销员信息 + List distributionList = distributionService.list(new LambdaQueryWrapper() + .eq(Distribution::getDistributionStatus, DistributionStatusEnum.PASS.name())); + //根据销人员获取对应分销订单 + Map> distributionOrderList1 = distributionOrderList.stream() + .collect(Collectors.groupingBy(DistributionOrder::getDistributionId)); + + //校验分销订单不为空 + if (ObjectUtil.isNotNull(distributionOrderList1) && distributionOrderList1.size() > 0) { + //遍历分销订单map + distributionOrderList1.forEach((key, value) -> { + //计算分销结算金额 + distributionUpdateList.add(checkDistribution(key, value, distributionList)); + }); + } + + //校验分销信息列表不为空 + if (ObjectUtil.isNotNull(distributionUpdateList) && !distributionUpdateList.isEmpty()) { + //修改分销员收益 + distributionService.updateBatchById(distributionUpdateList); + distributionOrderList.stream().forEach(distributionOrder -> { + //修改分销订单状态为待提现 + distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.WAIT_CASH.name()); + }); + } + + //修改分销订单状态 + this.updateBatchById(distributionOrderList); + } + + + } + + + /** + * 计算分销结算金额 + * + * @param distributionId 分销ID + * @param list 分销订单 + * @param distributionList 分销列表 + * @return + */ + public Distribution checkDistribution(String distributionId, List list, List distributionList) { + //获取所有待结算订单分销人员信息 + Distribution distribution = distributionList.parallelStream().filter(a -> StrUtil.equals(a.getId(), distributionId)).collect(Collectors.toList()).get(0); + + //获取分销订单总金额 + double rebate = list.stream().mapToDouble(DistributionOrder::getRebate).sum(); + + //检验单分销人员冻结金额为负数时.扣除负数冻结金额后再结算 + if (distribution.getCommissionFrozen() < 0) { + rebate = CurrencyUtil.add(distribution.getCommissionFrozen() == null ? 0.0 : distribution.getCommissionFrozen(), rebate); + } + //结算订单总金额+分销可提现金额 + Double canRebate = CurrencyUtil.add(rebate, distribution.getCanRebate() == null ? 0.0 : distribution.getCanRebate()); + //结算金额小于0 + if (canRebate < 0) { + //结算订单总金额+分销可提现金额 + distribution.setCanRebate(0.0); + //冻结金额 + distribution.setCommissionFrozen(canRebate); + } else { + //结算订单总金额+分销可提现金额 + distribution.setCanRebate(canRebate); + //冻结金额 + distribution.setCommissionFrozen(0.0); + } + + return distribution; + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionSelectedGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionSelectedGoodsServiceImpl.java index 4abafd47..84828e9b 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionSelectedGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionSelectedGoodsServiceImpl.java @@ -4,32 +4,50 @@ import cn.lili.modules.distribution.entity.dos.DistributionSelectedGoods; import cn.lili.modules.distribution.mapper.DistributionSelectedGoodsMapper; import cn.lili.modules.distribution.service.DistributionSelectedGoodsService; import cn.lili.modules.distribution.service.DistributionService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 分销选择商品接口实现 * * @author pikachu - * @date 2020-03-24 23:04:56 + * @since 2020-03-24 23:04:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionSelectedGoodsServiceImpl extends ServiceImpl implements DistributionSelectedGoodsService { - //分销员 - private final DistributionService distributionService; + /** + * 分销员 + */ + @Autowired + private DistributionService distributionService; + @Override public boolean add(String distributionGoodsId) { //检查分销功能开关 distributionService.checkDistributionSetting(); - String distributionId=distributionService.getDistribution().getId(); - DistributionSelectedGoods distributionSelectedGoods=new DistributionSelectedGoods(distributionId,distributionGoodsId); + String distributionId = distributionService.getDistribution().getId(); + DistributionSelectedGoods distributionSelectedGoods = new DistributionSelectedGoods(distributionId, distributionGoodsId); return this.save(distributionSelectedGoods); } + + @Override + public boolean delete(String distributionGoodsId) { + //检查分销功能开关 + distributionService.checkDistributionSetting(); + + String distributionId = distributionService.getDistribution().getId(); + return this.remove(new LambdaQueryWrapper() + .eq(DistributionSelectedGoods::getDistributionGoodsId, distributionGoodsId) + .eq(DistributionSelectedGoods::getDistributionId, distributionId)); + } + + @Override + public boolean deleteByDistributionGoodsId(String distributionGoodsId) { + return this.remove(new LambdaQueryWrapper() + .eq(DistributionSelectedGoods::getDistributionGoodsId, distributionGoodsId)); + } } diff --git a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionServiceImpl.java b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionServiceImpl.java index 37ecff55..4d3da51c 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionServiceImpl.java @@ -1,14 +1,15 @@ package cn.lili.modules.distribution.serviceimpl; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; +import cn.lili.common.utils.BeanUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.distribution.entity.dos.Distribution; +import cn.lili.modules.distribution.entity.dto.DistributionApplyDTO; import cn.lili.modules.distribution.entity.dto.DistributionSearchParams; import cn.lili.modules.distribution.entity.enums.DistributionStatusEnum; import cn.lili.modules.distribution.mapper.DistributionMapper; @@ -19,10 +20,10 @@ import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.DistributionSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,22 +35,26 @@ import java.util.concurrent.TimeUnit; * 分销员接口实现 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionServiceImpl extends ServiceImpl implements DistributionService { - //会员 + /** + * 会员 + */ @Autowired private MemberService memberService; - //分销员 - private final DistributionMapper distributionMapper; - //缓存 - private final Cache cache; - //设置 - private final SettingService settingService; + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 设置 + */ + @Autowired + private SettingService settingService; @Override public IPage distributionPage(DistributionSearchParams distributionSearchParams, PageVO page) { @@ -64,22 +69,22 @@ public class DistributionServiceImpl extends ServiceImpl { diff --git a/framework/src/main/java/cn/lili/modules/file/plugin/FileManagerPlugin.java b/framework/src/main/java/cn/lili/modules/file/plugin/FilePlugin.java similarity index 66% rename from framework/src/main/java/cn/lili/modules/file/plugin/FileManagerPlugin.java rename to framework/src/main/java/cn/lili/modules/file/plugin/FilePlugin.java index f16e90fd..2f6fa799 100644 --- a/framework/src/main/java/cn/lili/modules/file/plugin/FileManagerPlugin.java +++ b/framework/src/main/java/cn/lili/modules/file/plugin/FilePlugin.java @@ -1,17 +1,23 @@ package cn.lili.modules.file.plugin; +import cn.lili.modules.file.entity.enums.OssEnum; + import java.io.InputStream; import java.util.List; /** - * 文件管理插件 + * 文件插件接口 * * @author Chopper - * @date 2020/11/26 17:50 */ -public interface FileManagerPlugin { +public interface FilePlugin { + /** + * 插件名称 + */ + OssEnum pluginName(); + /** * 文件路径上传 * @@ -38,13 +44,4 @@ public interface FileManagerPlugin { */ void deleteFile(List key); - /** - * 根据原图生成规定尺寸的图片 - * - * @param url 连接 - * @param width 宽 - * @param height 高 - * @return - */ - String getUrl(String url, Integer width, Integer height); } diff --git a/framework/src/main/java/cn/lili/modules/file/plugin/FilePluginFactory.java b/framework/src/main/java/cn/lili/modules/file/plugin/FilePluginFactory.java new file mode 100644 index 00000000..929116f1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/file/plugin/FilePluginFactory.java @@ -0,0 +1,65 @@ +package cn.lili.modules.file.plugin; + +import cn.hutool.json.JSONUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.file.entity.enums.OssEnum; +import cn.lili.modules.file.plugin.impl.AliFilePlugin; +import cn.lili.modules.file.plugin.impl.HuaweiFilePlugin; +import cn.lili.modules.file.plugin.impl.MinioFilePlugin; +import cn.lili.modules.file.plugin.impl.TencentFilePlugin; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.OssSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 文件服务抽象工厂 直接返回操作类 + * + * @author Chopper + * @version v1.0 + * 2022-06-06 11:35 + */ +@Component +public class FilePluginFactory { + + + @Autowired + private SettingService settingService; + + + /** + * 获取oss client + * + * @return + */ + public FilePlugin filePlugin() { + + OssSetting ossSetting = null; + try { + Setting setting = settingService.get(SettingEnum.OSS_SETTING.name()); + + ossSetting = JSONUtil.toBean(setting.getSettingValue(), OssSetting.class); + + + switch (OssEnum.valueOf(ossSetting.getType())) { + + case MINIO: + return new MinioFilePlugin(ossSetting); + case ALI_OSS: + return new AliFilePlugin(ossSetting); + case HUAWEI_OBS: + return new HuaweiFilePlugin(ossSetting); + case TENCENT_COS: + return new TencentFilePlugin(ossSetting); + default: + throw new ServiceException(); + } + } catch (Exception e) { + throw new ServiceException(); + } + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/file/plugin/impl/AliFileManagerPlugin.java b/framework/src/main/java/cn/lili/modules/file/plugin/impl/AliFilePlugin.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/file/plugin/impl/AliFileManagerPlugin.java rename to framework/src/main/java/cn/lili/modules/file/plugin/impl/AliFilePlugin.java index cc189f17..31ae2c7d 100644 --- a/framework/src/main/java/cn/lili/modules/file/plugin/impl/AliFileManagerPlugin.java +++ b/framework/src/main/java/cn/lili/modules/file/plugin/impl/AliFilePlugin.java @@ -1,22 +1,17 @@ package cn.lili.modules.file.plugin.impl; -import cn.hutool.core.util.StrUtil; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.modules.file.plugin.FileManagerPlugin; -import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.file.entity.enums.OssEnum; +import cn.lili.modules.file.plugin.FilePlugin; import cn.lili.modules.system.entity.dto.OssSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.DeleteObjectsRequest; import com.aliyun.oss.model.ObjectMetadata; -import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import java.io.File; import java.io.InputStream; @@ -26,31 +21,21 @@ import java.util.List; * 阿里oss 文件操作 * * @author Chopper - * @date 2020/11/26 17:50 */ -@Component @Slf4j -public class AliFileManagerPlugin implements FileManagerPlugin { +public class AliFilePlugin implements FilePlugin { - @Autowired - private SettingService settingService; + private OssSetting ossSetting; - /** - * 下一个初始化配置参数的时间 - * 这里为了防止多次调用redis,减少与redis的交互时间 - */ - private static Long nextInitSetting; + public AliFilePlugin(OssSetting ossSetting) { + this.ossSetting = ossSetting; + } - /** - * 暂时设定3分账请求一次设置 - */ - private static final Long interval = 60 * 3 * 1000L; - - /** - * 静态设置,最快三分钟更新一次 - */ - private static OssSetting ossSetting; + @Override + public OssEnum pluginName() { + return OssEnum.ALI_OSS; + } /** * 获取oss client @@ -58,32 +43,12 @@ public class AliFileManagerPlugin implements FileManagerPlugin { * @return */ private OSS getOssClient() { - OssSetting ossSetting = getSetting(); - return new OSSClientBuilder().build( - ossSetting.getEndPoint(), - ossSetting.getAccessKeyId(), - ossSetting.getAccessKeySecret()); + ossSetting.getAliyunOSSEndPoint(), + ossSetting.getAliyunOSSAccessKeyId(), + ossSetting.getAliyunOSSAccessKeySecret()); } - /** - * 获取配置 - * - * @return - */ - private OssSetting getSetting() { - //如果没有配置,或者没有下次刷新时间,或者下次刷新时间小于当前时间,则从redis 更新一次 - if (ossSetting == null || nextInitSetting == null || nextInitSetting < System.currentTimeMillis()) { - Setting setting = settingService.getById(SettingEnum.OSS_SETTING.name()); - if (setting == null || StrUtil.isBlank(setting.getSettingValue())) { - throw new ServiceException("您还未配置阿里云OSS存储"); - } - nextInitSetting = System.currentTimeMillis() + interval; - ossSetting = new Gson().fromJson(setting.getSettingValue(), OssSetting.class); - return ossSetting; - } - return ossSetting; - } /** * 获取配置前缀 @@ -91,15 +56,14 @@ public class AliFileManagerPlugin implements FileManagerPlugin { * @return */ private String getUrlPrefix() { - OssSetting ossSetting = getSetting(); - return "https://" + ossSetting.getBucketName() + "." + ossSetting.getEndPoint() + "/"; + return "https://" + ossSetting.getAliyunOSSBucketName() + "." + ossSetting.getAliyunOSSEndPoint() + "/"; } @Override public String pathUpload(String filePath, String key) { OSS ossClient = getOssClient(); try { - ossClient.putObject(ossSetting.getBucketName(), key, new File(filePath)); + ossClient.putObject(ossSetting.getAliyunOSSBucketName(), key, new File(filePath)); } catch (OSSException oe) { log.error("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); @@ -107,13 +71,13 @@ public class AliFileManagerPlugin implements FileManagerPlugin { log.error("Error Code: " + oe.getErrorCode()); log.error("Request ID: " + oe.getRequestId()); log.error("Host ID: " + oe.getHostId()); - throw new ServiceException("图片上传失败" + oe.getErrorMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } catch (ClientException ce) { log.error("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); log.error("Error Message: " + ce.getMessage()); - throw new ServiceException("图片上传失败" + ce.getErrorMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } finally { /* * Do not forget to shut down the client finally to release all allocated resources. @@ -130,7 +94,7 @@ public class AliFileManagerPlugin implements FileManagerPlugin { try { ObjectMetadata meta = new ObjectMetadata(); meta.setContentType("image/jpg"); - ossClient.putObject(getSetting().getBucketName(), key, inputStream, meta); + ossClient.putObject(ossSetting.getAliyunOSSBucketName(), key, inputStream, meta); } catch (OSSException oe) { log.error("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); @@ -138,13 +102,13 @@ public class AliFileManagerPlugin implements FileManagerPlugin { log.error("Error Code: " + oe.getErrorCode()); log.error("Request ID: " + oe.getRequestId()); log.error("Host ID: " + oe.getHostId()); - throw new ServiceException("图片上传失败" + oe.getErrorMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } catch (ClientException ce) { log.error("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); log.error("Error Message: " + ce.getMessage()); - throw new ServiceException("图片上传失败" + ce.getErrorMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } finally { /* * Do not forget to shut down the client finally to release all allocated resources. @@ -161,7 +125,7 @@ public class AliFileManagerPlugin implements FileManagerPlugin { try { ossClient.deleteObjects( - new DeleteObjectsRequest(getSetting().getBucketName()).withKeys(key)); + new DeleteObjectsRequest(ossSetting.getAliyunOSSBucketName()).withKeys(key)); } catch (OSSException oe) { log.error("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); @@ -169,13 +133,13 @@ public class AliFileManagerPlugin implements FileManagerPlugin { log.error("Error Code: " + oe.getErrorCode()); log.error("Request ID: " + oe.getRequestId()); log.error("Host ID: " + oe.getHostId()); - throw new ServiceException("图片删除失败" + oe.getErrorMessage()); + throw new ServiceException(ResultCode.OSS_DELETE_ERROR); } catch (ClientException ce) { log.error("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); log.error("Error Message: " + ce.getMessage()); - throw new ServiceException("图片删除失败" + ce.getErrorMessage()); + throw new ServiceException(ResultCode.OSS_DELETE_ERROR); } finally { /* * Do not forget to shut down the client finally to release all allocated resources. @@ -183,11 +147,4 @@ public class AliFileManagerPlugin implements FileManagerPlugin { ossClient.shutdown(); } } - - @Override - public String getUrl(String url, Integer width, Integer height) { - // 缩略图全路径 - // 返回缩略图全路径 - return url + "?x-oss-process=style/" + width + "X" + height; - } } diff --git a/framework/src/main/java/cn/lili/modules/file/plugin/impl/HuaweiFilePlugin.java b/framework/src/main/java/cn/lili/modules/file/plugin/impl/HuaweiFilePlugin.java new file mode 100644 index 00000000..9e1fb32b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/file/plugin/impl/HuaweiFilePlugin.java @@ -0,0 +1,131 @@ +package cn.lili.modules.file.plugin.impl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.file.entity.enums.OssEnum; +import cn.lili.modules.file.plugin.FilePlugin; +import cn.lili.modules.system.entity.dto.OssSetting; + +import com.obs.services.ObsClient; +import com.obs.services.exception.ObsException; +import com.obs.services.model.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * 华为obs 文件操作 + * + * @author Bulbasaur + * + * + */ + +@Slf4j +public class HuaweiFilePlugin implements FilePlugin { + + private OssSetting ossSetting; + + public HuaweiFilePlugin(OssSetting ossSetting) { + this.ossSetting = ossSetting; + } + + @Override + public OssEnum pluginName() { + return OssEnum.HUAWEI_OBS; + } + + /** + * 获取oss client + * + * @return + */ + private ObsClient getObsClient() { + return new ObsClient(ossSetting.getHuaweicloudOBSAccessKey(), ossSetting.getHuaweicloudOBSSecretKey(), ossSetting.getHuaweicloudOBSEndPoint()); + } + + + @Override + public String pathUpload(String filePath, String key) { + ObsClient obsClient = getObsClient(); + try { + obsClient.putObject(ossSetting.getHuaweicloudOBSBucketName(), key, new File(filePath)); + } catch (ObsException ce) { + log.error("Error Message: " + ce.getMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } finally { + try { + // 关闭OBS连接 + obsClient.close(); + } catch (IOException e) { + log.error("OBS关闭连接报错!" + e.getMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } + } + return getUrlPrefix() + key; + } + + @Override + public String inputStreamUpload(InputStream inputStream, String key) { + ObsClient obsClient = getObsClient(); + try { + PutObjectRequest putObjectRequest=new PutObjectRequest(ossSetting.getHuaweicloudOBSBucketName(), key, inputStream); + obsClient.putObject(putObjectRequest); + } catch (ObsException obsException) { + obsException.printStackTrace(); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } finally { + try { + // 关闭OBS连接 + obsClient.close(); + } catch (IOException e) { + e.printStackTrace(); + log.error("OBS关闭连接报错!" + e.getMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } + } + + return getUrlPrefix() + key; + } + + @Override + public void deleteFile(List keys) { + ObsClient obsClient = getObsClient(); + ListVersionsResult result; + try { + DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest(ossSetting.getHuaweicloudOBSBucketName()); + //deleteRequest.setQuiet(true); // 注意此demo默认是详细模式,如果要使用简单模式,请添加本行代码 + for (String key : keys) { + deleteRequest.addKeyAndVersion(key); + } + DeleteObjectsResult deleteResult = obsClient.deleteObjects(deleteRequest); + // 获取删除成功的对象 + log.info("删除成功:" + deleteResult.getDeletedObjectResults()); + // 获取删除失败的对象 + log.info("删除失败:" + deleteResult.getErrorResults()); + } catch (ObsException obsException) { + throw new ServiceException(ResultCode.OSS_DELETE_ERROR); + } finally { + try { + // 关闭OBS连接 + obsClient.close(); + } catch (IOException e) { + log.error("OBS关闭连接报错!" + e.getMessage()); + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } + } + } + + + /** + * 获取配置前缀 + * + * @return + */ + private String getUrlPrefix() { + return "https://" + ossSetting.getHuaweicloudOBSBucketName() + "." + ossSetting.getHuaweicloudOBSEndPoint() + "/"; + } +} diff --git a/framework/src/main/java/cn/lili/modules/file/plugin/impl/MinioFilePlugin.java b/framework/src/main/java/cn/lili/modules/file/plugin/impl/MinioFilePlugin.java new file mode 100644 index 00000000..87d580b3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/file/plugin/impl/MinioFilePlugin.java @@ -0,0 +1,165 @@ +package cn.lili.modules.file.plugin.impl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.file.entity.enums.OssEnum; +import cn.lili.modules.file.plugin.FilePlugin; +import cn.lili.modules.system.entity.dto.OssSetting; +import io.minio.*; +import io.minio.errors.ErrorResponseException; +import io.minio.messages.DeleteObject; +import lombok.extern.slf4j.Slf4j; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * MINIO文件插件 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2022/6/6 17:45 + */ +@Slf4j +public class MinioFilePlugin implements FilePlugin { + + private OssSetting ossSetting; + + public MinioFilePlugin(OssSetting ossSetting) { + this.ossSetting = ossSetting; + } + + /** + * 桶占位符 + */ + private static final String BUCKET_PARAM = "${bucket}"; + /** + * bucket权限-只读 + */ + private static final String READ_ONLY = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}"; + /** + * bucket权限-只读 + */ + private static final String WRITE_ONLY = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}"; + /** + * bucket权限-读写 + */ + private static final String READ_WRITE = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}"; + + + private MinioClient minioClient; + + + @Override + public OssEnum pluginName() { + return OssEnum.MINIO; + } + + @Override + public String pathUpload(String filePath, String key) { + try { + return this.inputStreamUpload(new FileInputStream(filePath), key); + } catch (Exception e) { + throw new ServiceException(ResultCode.OSS_DELETE_ERROR, e.getMessage()); + } + } + + @Override + public String inputStreamUpload(InputStream inputStream, String key) { + String bucket = ""; + try { + MinioClient client = getOssClient(); + bucket = ossSetting.getM_bucketName(); + PutObjectArgs putObjectArgs = PutObjectArgs.builder() + .bucket(bucket).stream(inputStream, inputStream.available(), 5 * 1024 * 1024) + .object(key) + .contentType("image/png" ) + .build(); + client.putObject(putObjectArgs); + } catch (Exception e) { + log.error("上传失败2,", e); + throw new ServiceException(ResultCode.OSS_DELETE_ERROR, e.getMessage()); + } + //拼接出可访问的url地址 + return ossSetting.getM_frontUrl() + "/" + bucket + "/" + key; + } + + + @Override + public void deleteFile(List key) { + if (key == null || key.isEmpty()) { + return; + } + MinioClient ossClient = getOssClient(); + List objectList = key.stream().map(DeleteObject::new).collect(Collectors.toList()); + ossClient.removeObjects(RemoveObjectsArgs.builder().objects(objectList).bucket(ossSetting.getM_bucketName()).build()); + } + + + /** + * 获取oss client + * + * @return + */ + private MinioClient getOssClient() { + if (minioClient != null) { + return this.minioClient; + } + synchronized (this) { + if (minioClient == null) { + //创建客户端 + this.minioClient = MinioClient.builder() + .endpoint(ossSetting.getM_endpoint()) + .credentials(ossSetting.getM_accessKey(), ossSetting.getM_secretKey()) + .build(); + try { + //查看对应的bucket是否已经存在,不存在则创建 + if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(ossSetting.getM_bucketName()).build())) { + //创建bucket + MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(ossSetting.getM_bucketName()).build(); + this.minioClient.makeBucket(makeBucketArgs); + setBucketPolicy(this.minioClient, ossSetting.getM_bucketName(), "read-write" ); + log.info("创建minio桶成功{}", ossSetting.getM_bucketName()); + } + } catch (Exception e) { + //晴空配置 + minioClient = null; + log.error("创建[{}]bucket失败", ossSetting.getM_bucketName()); + throw new ServiceException(ResultCode.OSS_DELETE_ERROR, e.getMessage()); + } + } + } + return minioClient; + } + + + /** + * 更新桶权限策略 + * + * @param bucket 桶 + * @param policy 权限 + */ + public static void setBucketPolicy(MinioClient client, String bucket, String policy) throws Exception { + switch (policy) { + case "read-only": + client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(READ_ONLY.replace(BUCKET_PARAM, bucket)).build()); + break; + case "write-only": + client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(WRITE_ONLY.replace(BUCKET_PARAM, bucket)).build()); + break; + case "read-write": + client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).region("public" ).config(READ_WRITE.replace(BUCKET_PARAM, bucket)).build()); + break; + case "none": + default: + break; + } + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/file/plugin/impl/TencentFilePlugin.java b/framework/src/main/java/cn/lili/modules/file/plugin/impl/TencentFilePlugin.java new file mode 100644 index 00000000..e4f69a1d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/file/plugin/impl/TencentFilePlugin.java @@ -0,0 +1,123 @@ +package cn.lili.modules.file.plugin.impl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.file.entity.enums.OssEnum; +import cn.lili.modules.file.plugin.FilePlugin; +import cn.lili.modules.system.entity.dto.OssSetting; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.auth.BasicCOSCredentials; +import com.qcloud.cos.auth.COSCredentials; +import com.qcloud.cos.exception.CosClientException; +import com.qcloud.cos.exception.CosServiceException; +import com.qcloud.cos.http.HttpProtocol; +import com.qcloud.cos.model.DeleteObjectsRequest; +import com.qcloud.cos.model.ObjectMetadata; +import com.qcloud.cos.model.PutObjectRequest; +import com.qcloud.cos.region.Region; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * 腾讯cos 文件操作 + * + * @author Bulbasaur + */ + +@Slf4j +public class TencentFilePlugin implements FilePlugin { + + private OssSetting ossSetting; + + public TencentFilePlugin(OssSetting ossSetting) { + this.ossSetting = ossSetting; + } + + @Override + public OssEnum pluginName() { + return OssEnum.TENCENT_COS; + } + + /** + * 获取oss client + * + * @return + */ + private COSClient getCOSClient() { + // 1 初始化用户身份信息(secretId, secretKey)。 + COSCredentials cred = new BasicCOSCredentials(ossSetting.getTencentCOSSecretId(), ossSetting.getTencentCOSSecretKey()); + // 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224 + ClientConfig clientConfig = new ClientConfig(new Region(ossSetting.getTencentCOSRegion())); + // 这里建议设置使用 https 协议 + clientConfig.setHttpProtocol(HttpProtocol.https); + // 3 生成 cos 客户端。 + return new COSClient(cred, clientConfig); + } + + + /** + * 获取配置前缀 + * + * @return + */ + private String getUrlPrefix() { +// return "https://" + ossSetting.getTencentCOSBucket() + "." + ossSetting.getTencentCOSEndPoint() + "/"; + return "https://" + ossSetting.getTencentCOSBucket() + ".cos" + ossSetting.getTencentCOSEndPoint() + ".myqcloud.com/"; + } + + @Override + public String pathUpload(String filePath, String key) { + COSClient cosClient = getCOSClient(); + try { + cosClient.putObject(ossSetting.getTencentCOSBucket(), key, new File(filePath)); + } catch (CosServiceException oe) { + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } catch (CosClientException ce) { + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } finally { + cosClient.shutdown(); + } + return getUrlPrefix() + key; + } + + @Override + public String inputStreamUpload(InputStream inputStream, String key) { + COSClient cosClient = getCOSClient(); + try { + ObjectMetadata meta = new ObjectMetadata(); + meta.setContentType("image/jpg"); + cosClient.putObject(ossSetting.getTencentCOSBucket(), key, inputStream, meta); + } catch (CosServiceException oe) { + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } catch (CosClientException ce) { + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } finally { + cosClient.shutdown(); + } + return getUrlPrefix() + key; + } + + @Override + public void deleteFile(List keys) { + COSClient cosClient = getCOSClient(); + + try { + List delObjects = new ArrayList<>(); + for (String key:keys) { + delObjects.add(new DeleteObjectsRequest.KeyVersion(key)); + } + cosClient.deleteObjects(new DeleteObjectsRequest(ossSetting.getTencentCOSBucket()).withKeys(delObjects)); + } catch (CosServiceException oe) { + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } catch (CosClientException ce) { + throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); + } finally { + cosClient.shutdown(); + } + } +} diff --git a/framework/src/main/java/cn/lili/modules/file/service/FileService.java b/framework/src/main/java/cn/lili/modules/file/service/FileService.java index 7668510e..0760096e 100644 --- a/framework/src/main/java/cn/lili/modules/file/service/FileService.java +++ b/framework/src/main/java/cn/lili/modules/file/service/FileService.java @@ -14,7 +14,6 @@ import java.util.List; * 文件管理业务层 * * @author Chopper - * @date 2020/11/26 17:50 */ public interface FileService extends IService { @@ -29,7 +28,8 @@ public interface FileService extends IService { /** * 所有者批量删除 * - * @param ids + * @param ids ID + * @param authUser 操作者 */ void batchDelete(List ids, AuthUser authUser); @@ -50,6 +50,7 @@ public interface FileService extends IService { * @param file * @param searchVO * @param pageVo + * @param ownerDTO * @return */ IPage customerPageOwner(FileOwnerDTO ownerDTO, File file, SearchVO searchVO, PageVO pageVo); diff --git a/framework/src/main/java/cn/lili/modules/file/serviceimpl/FileServiceImpl.java b/framework/src/main/java/cn/lili/modules/file/serviceimpl/FileServiceImpl.java index f56fb0e4..11068e7d 100644 --- a/framework/src/main/java/cn/lili/modules/file/serviceimpl/FileServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/file/serviceimpl/FileServiceImpl.java @@ -1,24 +1,23 @@ package cn.lili.modules.file.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; +import cn.lili.mybatis.util.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.SearchVO; import cn.lili.modules.file.entity.File; import cn.lili.modules.file.entity.dto.FileOwnerDTO; import cn.lili.modules.file.mapper.FileMapper; -import cn.lili.modules.file.plugin.FileManagerPlugin; +import cn.lili.modules.file.plugin.FilePlugin; +import cn.lili.modules.file.plugin.FilePluginFactory; import cn.lili.modules.file.service.FileService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -27,31 +26,30 @@ import java.util.List; * 文件管理业务层实现 * * @author Chopper - * @date 2020/11/26 17:50 + * @since 2020/11/26 17:50 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FileServiceImpl extends ServiceImpl implements FileService { - private final FileManagerPlugin fileManagerPlugin; + @Autowired + private FilePluginFactory filePluginFactory; @Override public void batchDelete(List ids) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(File::getId, ids); List files = this.list(queryWrapper); List keys = new ArrayList<>(); files.forEach(item -> keys.add(item.getFileKey())); - fileManagerPlugin.deleteFile(keys); + filePluginFactory.filePlugin().deleteFile(keys); this.remove(queryWrapper); } @Override public void batchDelete(List ids, AuthUser authUser) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(File::getId, ids); queryWrapper.eq(File::getUserEnums, authUser.getRole().name()); @@ -71,33 +69,31 @@ public class FileServiceImpl extends ServiceImpl implements Fi List files = this.list(queryWrapper); List keys = new ArrayList<>(); files.forEach(item -> keys.add(item.getFileKey())); - fileManagerPlugin.deleteFile(keys); + filePluginFactory.filePlugin().deleteFile(keys); this.remove(queryWrapper); } @Override public IPage customerPage(File file, SearchVO searchVO, PageVO pageVo) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.like(StringUtils.isNotEmpty(file.getName()), File::getName, file.getName()) - .like(StringUtils.isNotEmpty(file.getFileKey()), File::getFileKey, file.getFileKey()) - .like(StringUtils.isNotEmpty(file.getFileType()), File::getFileType, file.getFileType()) - .between(StringUtils.isNotEmpty(searchVO.getStartDate()) && StringUtils.isNotEmpty(searchVO.getEndDate()), + queryWrapper.like(CharSequenceUtil.isNotEmpty(file.getName()), File::getName, file.getName()) + .like(CharSequenceUtil.isNotEmpty(file.getFileKey()), File::getFileKey, file.getFileKey()) + .like(CharSequenceUtil.isNotEmpty(file.getFileType()), File::getFileType, file.getFileType()) + .between(CharSequenceUtil.isNotEmpty(searchVO.getStartDate()) && CharSequenceUtil.isNotEmpty(searchVO.getEndDate()), File::getCreateTime, searchVO.getStartDate(), searchVO.getEndDate()); - IPage page = this.page(PageUtil.initPage(pageVo), queryWrapper); - return page; + return this.page(PageUtil.initPage(pageVo), queryWrapper); } @Override public IPage customerPageOwner(FileOwnerDTO ownerDTO, File file, SearchVO searchVO, PageVO pageVo) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(StringUtils.isNotEmpty(ownerDTO.getOwnerId()), File::getOwnerId, ownerDTO.getOwnerId()) + queryWrapper.eq(CharSequenceUtil.isNotEmpty(ownerDTO.getOwnerId()), File::getOwnerId, ownerDTO.getOwnerId()) .eq(File::getUserEnums, ownerDTO.getUserEnums()) - .like(StringUtils.isNotEmpty(file.getName()), File::getName, file.getName()) - .like(StringUtils.isNotEmpty(file.getFileKey()), File::getFileKey, file.getFileKey()) - .like(StringUtils.isNotEmpty(file.getFileType()), File::getFileType, file.getFileType()) - .between(StringUtils.isNotEmpty(searchVO.getStartDate()) && StringUtils.isNotEmpty(searchVO.getEndDate()), + .like(CharSequenceUtil.isNotEmpty(file.getName()), File::getName, file.getName()) + .like(CharSequenceUtil.isNotEmpty(file.getFileKey()), File::getFileKey, file.getFileKey()) + .like(CharSequenceUtil.isNotEmpty(file.getFileType()), File::getFileType, file.getFileType()) + .between(CharSequenceUtil.isNotEmpty(searchVO.getStartDate()) && CharSequenceUtil.isNotEmpty(searchVO.getEndDate()), File::getCreateTime, searchVO.getStartDate(), searchVO.getEndDate()); - IPage page = this.page(PageUtil.initPage(pageVo), queryWrapper); - return page; + return this.page(PageUtil.initPage(pageVo), queryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/file/util/FileUtil.java b/framework/src/main/java/cn/lili/modules/file/util/FileUtil.java new file mode 100644 index 00000000..46cbf51f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/file/util/FileUtil.java @@ -0,0 +1,24 @@ +package cn.lili.modules.file.util; + +/** + * FileUtil + * + * @author Chopper + * @version v1.0 + * 2021-11-22 11:19 + */ +public class FileUtil { + + /** + * 根据原图生成规定尺寸的图片 + * + * @param url 连接 + * @param width 宽 + * @param height 高 + * @return + */ + public static String getUrl(String url, Integer width, Integer height) { + //缩略图全路径 + return url + "?x-oss-process=style/" + width + "X" + height; + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Brand.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Brand.java index 934c0493..f02f3b0c 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Brand.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Brand.java @@ -1,40 +1,36 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; /** * 商品品牌 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @Data -@Entity -@Table(name = "li_brand") @TableName("li_brand") @ApiModel(value = "商品品牌") public class Brand extends BaseEntity { private static final long serialVersionUID = -8236865838438521426L; - /** - * 品牌名称 - */ + @NotEmpty(message = "品牌名称不能为空") + @Length(max = 20, message = "品牌名称应该小于20长度字符") @ApiModelProperty(value = "品牌名称", required = true) private String name; - /** - * 品牌图标 - */ + @NotEmpty(message = "品牌图标不能为空") + @Length(max = 255, message = "品牌图标地址长度超过255字符") @ApiModelProperty(value = "品牌图标", required = true) private String logo; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java index b4f4d4f1..05e23293 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java @@ -1,6 +1,6 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,9 +8,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; -import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; @@ -18,11 +16,9 @@ import java.util.Date; * 商品分类 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @Data -@Entity -@Table(name = "li_category") @TableName("li_category") @ApiModel(value = "商品分类") @AllArgsConstructor @@ -32,15 +28,22 @@ public class Category extends BaseEntity { private static final long serialVersionUID = 1L; @NotEmpty(message = "分类名称不能为空") + @Size(max = 20) @ApiModelProperty(value = "分类名称") private String name; + @NotEmpty(message = "请选择父分类") @ApiModelProperty(value = "父id, 根节点为0") private String parentId; + @NotNull(message = "层级不能为空") + @Min(value = 0,message = "层级需要大于0") + @Max(value = 3,message = "层级最大为3") @ApiModelProperty(value = "层级, 从0开始") private Integer level; + @NotNull(message = "排序值不能为空") + @Max(value = 999,message = "排序值最大999") @ApiModelProperty(value = "排序值") private BigDecimal sortOrder; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryBrand.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryBrand.java index 5ac1f8c1..80b4075c 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryBrand.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryBrand.java @@ -1,8 +1,8 @@ package cn.lili.modules.goods.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -13,11 +13,6 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import java.io.Serializable; import java.util.Date; @@ -25,25 +20,16 @@ import java.util.Date; * 分类品牌关联 * * @author pikachu - * @date 2020-03-02 09:34:02 + * @since 2020-03-02 09:34:02 */ @Data -@Entity -@Table(name = "li_category_brand") @TableName("li_category_brand") -@ApiModel(value = "商品分类品牌") +@ApiModel(value = "商品分类品牌关联") @NoArgsConstructor -public class CategoryBrand implements Serializable { +public class CategoryBrand extends BaseIdEntity { private static final long serialVersionUID = 3315719881926878L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedBy @TableField(fill = FieldFill.INSERT) @@ -70,8 +56,8 @@ public class CategoryBrand implements Serializable { @ApiModelProperty(value = "品牌id") private String brandId; - public CategoryBrand(String categoryId,String brandId){ - this.categoryId=categoryId; - this.brandId=brandId; + public CategoryBrand(String categoryId, String brandId) { + this.categoryId = categoryId; + this.brandId = brandId; } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryParameterGroup.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryParameterGroup.java index 5c97992d..1b573bf7 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryParameterGroup.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategoryParameterGroup.java @@ -1,14 +1,13 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -16,11 +15,10 @@ import javax.validation.constraints.NotNull; * 分类参数组关联 * * @author pikachu - * @date 2020-02-26 10:34:02 + * @since 2020-02-26 10:34:02 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_category_parameter_group") @TableName("li_category_parameter_group") @ApiModel(value = "分类绑定参数组") public class CategoryParameterGroup extends BaseEntity { @@ -32,7 +30,7 @@ public class CategoryParameterGroup extends BaseEntity { */ @ApiModelProperty(value = "参数组名称", required = true) @NotEmpty(message = "参数组名称不能为空") - @Length(max = 50, message = "参数组名称不能超过50字") + @Length(max = 20, message = "参数组名称不能超过20字") private String groupName; /** * 关联分类id @@ -41,7 +39,7 @@ public class CategoryParameterGroup extends BaseEntity { @NotNull(message = "关联的分类不能为空") private String categoryId; /** - * + * 排序 */ @ApiModelProperty(value = "排序", hidden = true) private Integer sort; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategorySpecification.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategorySpecification.java index d286db1a..c1362373 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategorySpecification.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/CategorySpecification.java @@ -1,6 +1,6 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; @@ -9,18 +9,13 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; - /** * 分类参数组关联 * * @author pikachu - * @date 2020-02-26 10:34:02 + * @since 2020-02-26 10:34:02 */ @Data -@Entity -@Table(name = "li_category_specification") @TableName("li_category_specification") @NoArgsConstructor @AllArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Commodity.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Commodity.java new file mode 100644 index 00000000..da262eec --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Commodity.java @@ -0,0 +1,62 @@ +package cn.lili.modules.goods.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 小程序直播商品 + * @author Bulbasaur + * @since 2021/5/17 9:34 上午 + * + */ +@Data +@ApiModel(value = "Commodity", description = "直播商品") +@TableName("li_commodity") +public class Commodity extends BaseEntity { + + @ApiModelProperty(value = "图片") + private String goodsImage; + + @ApiModelProperty(value = "商品名称") + private String name; + + /** + * 1:一口价(只需要传入price,price2不传) + * 2:价格区间(price字段为左边界,price2字段为右边界,price和price2必传) + * 3:显示折扣价(price字段为原价,price2字段为现价, price和price2必传 + */ + @ApiModelProperty(value = "价格类型") + private Integer priceType; + + @ApiModelProperty(value = "价格") + private Double price; + + @ApiModelProperty(value = "价格2") + private Double price2; + + @ApiModelProperty(value = "商品详情页的小程序路径") + private String url; + + @ApiModelProperty(value = "微信程序直播商品ID") + private Integer liveGoodsId; + + @ApiModelProperty(value = "审核单ID") + private String auditId; + + @ApiModelProperty(value = "审核状态") + private String auditStatus; + + @ApiModelProperty(value = "店铺ID") + private String storeId; + + @ApiModelProperty(value = "商品ID") + private String goodsId; + + @ApiModelProperty(value = "规格ID") + private String skuId; + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java index 6281e45f..589d9dc8 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java @@ -1,30 +1,28 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.http.HtmlUtil; import cn.lili.modules.goods.entity.enums.DraftGoodsSaveType; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.Max; /** * 草稿商品 * * @author pikachu - * @date 2020-02-23 9:14:33 + * @since 2020-02-23 9:14:33 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_draft_goods") @TableName("li_draft_goods") @ApiModel(value = "草稿商品") @AllArgsConstructor @@ -36,9 +34,10 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "商品名称") private String goodsName; - @Length(max = 30, message = "商品规格编号太长,不能超过30个字符") - @ApiModelProperty(value = "商品编号") - private String sn; + @Max(value = 99999999, message = "价格不能超过99999999") + @ApiModelProperty(value = "商品价格") + private Double price; + @ApiModelProperty(value = "品牌id") private String brandId; @@ -52,9 +51,6 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "卖点") private String sellingPoint; - @ApiModelProperty(value = "重量") - @Max(value = 99999999, message = "重量不能超过99999999") - private Double weight; /** * @see GoodsStatusEnum */ @@ -64,13 +60,9 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "详情") private String intro; - @Max(value = 99999999, message = "价格不能超过99999999") - @ApiModelProperty(value = "商品价格") - private Double price; - @Max(value = 99999999, message = "成本价格99999999") - @ApiModelProperty(value = "成本价格") - private Double cost; + @ApiModelProperty(value = "商品移动端详情") + private String mobileIntro; @ApiModelProperty(value = "购买数量") private Integer buyCount; @@ -112,23 +104,18 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "运费模板id") private String templateId; - @ApiModelProperty(value = "运费承担者") - private String freightPayer; - @ApiModelProperty(value = "是否自营") private Boolean selfOperated; - /** - * 商品移动端详情 - */ - @ApiModelProperty(value = "商品移动端详情") - private String mobileIntro; @ApiModelProperty(value = "商品视频") private String goodsVideo; @ApiModelProperty(value = "是否为推荐商品") - private boolean recommend; + private Boolean recommend; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum + */ @ApiModelProperty(value = "销售模式") private String salesModel; @@ -138,20 +125,36 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "草稿商品保存类型") private String saveType; - @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "分类名称JSON") private String categoryNameJson; - @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "商品参数JSON") private String goodsParamsListJson; - @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "商品图片JSON") private String goodsGalleryListJson; - @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "sku列表JSON") private String skuListJson; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型", required = true) + private String goodsType; + + public String getIntro() { + if (CharSequenceUtil.isNotEmpty(intro)) { + return HtmlUtil.unescape(intro); + } + return intro; + } + + public String getMobileIntro() { + if (CharSequenceUtil.isNotEmpty(mobileIntro)) { + return HtmlUtil.unescape(mobileIntro); + } + return mobileIntro; + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java index 4d79ab44..029a66c9 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java @@ -1,44 +1,57 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.http.HtmlUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.goods.entity.dto.DraftGoodsDTO; import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.entity.enums.GoodsTypeEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; +import com.xkcoding.http.util.StringUtil; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Map; /** * 商品 * * @author pikachu - * @date 2020-02-23 9:14:33 + * @since 2020-02-23 9:14:33 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_goods") @TableName("li_goods") @ApiModel(value = "商品") public class Goods extends BaseEntity { private static final long serialVersionUID = 370683495251252601L; - /** - * 商品名称 - */ + @ApiModelProperty(value = "商品名称") + @NotEmpty(message = "商品名称不能为空") + @Length(max = 100, message = "商品名称太长,不能超过100个字符") private String goodsName; - /** - * 商品编号 - */ - @Length(max = 30, message = "商品规格编号太长,不能超过30个字符") - @ApiModelProperty(value = "商品编号") - private String sn; + + @ApiModelProperty(value = "商品价格", required = true) + @NotNull(message = "商品价格不能为空") + @Min(value = 0, message = "商品价格不能为负数") + @Max(value = 99999999, message = "商品价格不能超过99999999") + private Double price; @ApiModelProperty(value = "品牌id") private String brandId; @@ -49,144 +62,96 @@ public class Goods extends BaseEntity { @ApiModelProperty(value = "计量单位") private String goodsUnit; - /** - * 卖点 - */ + + @Length(max = 60, message = "商品卖点太长,不能超过60个字符") @ApiModelProperty(value = "卖点") private String sellingPoint; /** - * 重量 - */ - @ApiModelProperty(value = "重量") - @Max(value = 99999999, message = "重量不能超过99999999") - private Double weight; - /** - * 上架状态 - * * @see GoodsStatusEnum */ @ApiModelProperty(value = "上架状态") private String marketEnable; - /** - * 详情 - */ + @ApiModelProperty(value = "详情") private String intro; - /** - * 商品价格 - */ - @Max(value = 99999999, message = "价格不能超过99999999") - @ApiModelProperty(value = "商品价格") - private Double price; - /** - * 成本价格 - */ - @Max(value = 99999999, message = "成本价格99999999") - @ApiModelProperty(value = "成本价格") - private Double cost; - /** - * 购买数量 - */ @ApiModelProperty(value = "购买数量") private Integer buyCount; - /** - * 库存 - */ + @Max(value = 99999999, message = "库存不能超过99999999") @ApiModelProperty(value = "库存") private Integer quantity; - /** - * 商品好评率 - */ + @ApiModelProperty(value = "商品好评率") private Double grade; - /** - * 缩略图路径 - */ + @ApiModelProperty(value = "缩略图路径") private String thumbnail; - /** - * 小图路径 - */ + @ApiModelProperty(value = "小图路径") private String small; - /** - * 原图路径 - */ + @ApiModelProperty(value = "原图路径") private String original; - /** - * 店铺分类id - */ + @ApiModelProperty(value = "店铺分类id") private String storeCategoryPath; - /** - * 评论数量 - */ + @ApiModelProperty(value = "评论数量") private Integer commentNum; - /** - * 卖家id - */ + @ApiModelProperty(value = "卖家id") private String storeId; - /** - * 卖家名字 - */ + @ApiModelProperty(value = "卖家名字") private String storeName; - /** - * 运费模板id - */ + @ApiModelProperty(value = "运费模板id") private String templateId; + /** - * 谁承担运费 BUYER:买家承担,STORE:卖家承担 - */ - @ApiModelProperty(value = "运费承担者 BUYER:买家承担,STORE:卖家承担") - private String freightPayer; - /** - * 审核状态 - * * @see GoodsAuthEnum */ @ApiModelProperty(value = "审核状态") - private String isAuth; - /** - * 审核信息 - */ + private String authFlag; + @ApiModelProperty(value = "审核信息") private String authMessage; - /** - * 下架原因 - */ + @ApiModelProperty(value = "下架原因") private String underMessage; - /** - * 是否自营 - */ + @ApiModelProperty(value = "是否自营") private Boolean selfOperated; - /** - * 商品移动端详情 - */ + @ApiModelProperty(value = "商品移动端详情") private String mobileIntro; - /** - * 商品视频 - */ + @ApiModelProperty(value = "商品视频") private String goodsVideo; @ApiModelProperty(value = "是否为推荐商品", required = true) - private boolean recommend; + private Boolean recommend; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum + */ @ApiModelProperty(value = "销售模式", required = true) private String salesModel; + + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型", required = true) + private String goodsType; + + @ApiModelProperty(value = "商品参数json", hidden = true) + private String params; + + public Goods() { } @@ -195,20 +160,88 @@ public class Goods extends BaseEntity { this.categoryPath = goodsOperationDTO.getCategoryPath(); this.storeCategoryPath = goodsOperationDTO.getStoreCategoryPath(); this.brandId = goodsOperationDTO.getBrandId(); - this.sn = goodsOperationDTO.getSn(); - this.price = goodsOperationDTO.getPrice(); - this.weight = goodsOperationDTO.getWeight(); - this.freightPayer = goodsOperationDTO.getFreightPayer(); this.templateId = goodsOperationDTO.getTemplateId(); - this.recommend = goodsOperationDTO.isRecommend(); + this.recommend = goodsOperationDTO.getRecommend(); this.sellingPoint = goodsOperationDTO.getSellingPoint(); this.salesModel = goodsOperationDTO.getSalesModel(); this.goodsUnit = goodsOperationDTO.getGoodsUnit(); this.intro = goodsOperationDTO.getIntro(); this.mobileIntro = goodsOperationDTO.getMobileIntro(); - this.cost = goodsOperationDTO.getCost(); + this.goodsVideo = goodsOperationDTO.getGoodsVideo(); + this.price = goodsOperationDTO.getPrice(); + if (goodsOperationDTO.getGoodsParamsDTOList() != null && goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) { + this.params = JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList()); + } //如果立即上架则 - this.marketEnable = goodsOperationDTO.isRelease() ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name(); + this.marketEnable = Boolean.TRUE.equals(goodsOperationDTO.getRelease()) ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name(); + this.goodsType = goodsOperationDTO.getGoodsType(); + this.grade = 100D; + + //循环sku,判定sku是否有效 + for (Map sku : goodsOperationDTO.getSkuList()) { + //判定参数不能为空 + if (!sku.containsKey("sn") || sku.get("sn") == null) { + throw new ServiceException(ResultCode.GOODS_SKU_SN_ERROR); + } + if ((!sku.containsKey("price") || StringUtil.isEmpty(sku.get("price").toString()) || Convert.toDouble(sku.get("price")) <= 0) && !goodsOperationDTO.getSalesModel().equals(GoodsSalesModeEnum.WHOLESALE.name())) { + throw new ServiceException(ResultCode.GOODS_SKU_PRICE_ERROR); + } + if ((!sku.containsKey("cost") || StringUtil.isEmpty(sku.get("cost").toString()) || Convert.toDouble(sku.get("cost")) <= 0) && !goodsOperationDTO.getSalesModel().equals(GoodsSalesModeEnum.WHOLESALE.name())) { + throw new ServiceException(ResultCode.GOODS_SKU_COST_ERROR); + } + //虚拟商品没有重量字段 + if (this.goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name()) && (!sku.containsKey("weight") || sku.containsKey("weight") && (StringUtil.isEmpty(sku.get("weight").toString()) || Convert.toDouble(sku.get("weight").toString()) < 0))) { + throw new ServiceException(ResultCode.GOODS_SKU_WEIGHT_ERROR); + } + if (!sku.containsKey("quantity") || StringUtil.isEmpty(sku.get("quantity").toString()) || Convert.toInt(sku.get("quantity").toString()) < 0) { + throw new ServiceException(ResultCode.GOODS_SKU_QUANTITY_ERROR); + } + sku.values().forEach(i -> { + if (CharSequenceUtil.isBlank(i.toString())) { + throw new ServiceException(ResultCode.MUST_HAVE_GOODS_SKU_VALUE); + } + }); + + + } + } + + public Goods(DraftGoodsDTO goodsDTO) { + this.goodsName = goodsDTO.getGoodsName(); + this.categoryPath = goodsDTO.getCategoryPath(); + this.storeCategoryPath = goodsDTO.getStoreCategoryPath(); + this.brandId = goodsDTO.getBrandId(); + this.templateId = goodsDTO.getTemplateId(); + this.recommend = goodsDTO.getRecommend(); + this.sellingPoint = goodsDTO.getSellingPoint(); + this.salesModel = goodsDTO.getSalesModel(); + this.goodsUnit = goodsDTO.getGoodsUnit(); + this.intro = goodsDTO.getIntro(); + this.mobileIntro = goodsDTO.getMobileIntro(); + this.goodsVideo = goodsDTO.getGoodsVideo(); + this.price = goodsDTO.getPrice(); + if (CollectionUtil.isNotEmpty(goodsDTO.getGoodsParamsDTOList())){ + this.params = JSONUtil.toJsonStr(goodsDTO.getGoodsParamsDTOList()); + } + //如果立即上架则 + this.marketEnable = GoodsStatusEnum.DOWN.name(); + this.goodsType = goodsDTO.getGoodsType(); + this.grade = 100D; } + + public String getIntro() { + if (CharSequenceUtil.isNotEmpty(intro)) { + return HtmlUtil.unescape(intro); + } + return intro; + } + + public String getMobileIntro() { + if (CharSequenceUtil.isNotEmpty(mobileIntro)) { + return HtmlUtil.unescape(mobileIntro); + } + return mobileIntro; + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsGallery.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsGallery.java index 4063bdba..44d2a0c4 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsGallery.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsGallery.java @@ -1,39 +1,24 @@ package cn.lili.modules.goods.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.data.annotation.CreatedBy; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import java.io.Serializable; - /** * 商品相册 * * @author pikachu - * @date 2020-02-23 9:14:33 + * @since 2020-02-23 9:14:33 */ @Data -@Entity -@Table(name = "li_goods_gallery") @TableName("li_goods_gallery") @ApiModel(value = "商品相册") -public class GoodsGallery implements Serializable { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class GoodsGallery extends BaseIdEntity { @CreatedBy diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsParams.java deleted file mode 100644 index 54d59883..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsParams.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.lili.modules.goods.entity.dos; - -import cn.lili.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.persistence.Entity; -import javax.persistence.Table; - -/** - * 商品关联参数 - * - * @author pikachu - * @date 2020-02-23 9:14:33 - */ -@Data -@Entity -@Table(name = "li_goods_params") -@TableName("li_goods_params") -@ApiModel(value = "商品关联参数") -public class GoodsParams extends BaseEntity { - - private static final long serialVersionUID = 1L; - - /** - * 商品id - */ - @TableField(value = "goods_id") - @ApiModelProperty(value = "商品id", hidden = true) - private String goodsId; - /** - * 参数id - */ - @TableField(value = "param_id") - @ApiModelProperty(value = "参数id", required = true) - private String paramId; - /** - * 参数名字 - */ - @TableField(value = "param_name") - @ApiModelProperty(value = "参数名字", required = true) - private String paramName; - /** - * 参数值 - */ - @TableField(value = "param_value") - @ApiModelProperty(value = "参数值", required = true) - @Length(max = 100, message = "参数值字符不能大于120") - private String paramValue; - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java index f3ff55c2..0c89fdc1 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java @@ -1,18 +1,17 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.Max; import java.util.Date; @@ -20,13 +19,13 @@ import java.util.Date; * 商品sku * * @author pikachu - * @date 2020-02-23 9:14:33 + * @since 2020-02-23 9:14:33 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_goods_sku") @TableName("li_goods_sku") @ApiModel(value = "商品sku对象") +@NoArgsConstructor public class GoodsSku extends BaseEntity { private static final long serialVersionUID = 4865908658161118934L; @@ -35,7 +34,6 @@ public class GoodsSku extends BaseEntity { private String goodsId; @ApiModelProperty(value = "规格信息json", hidden = true) - @Column(columnDefinition = "TEXT") @JsonIgnore private String specs; @@ -46,7 +44,7 @@ public class GoodsSku extends BaseEntity { private String freightTemplateId; @ApiModelProperty(value = "是否是促销商品") - private Boolean isPromotion; + private Boolean promotionFlag; @ApiModelProperty(value = "促销价") private Double promotionPrice; @@ -80,7 +78,6 @@ public class GoodsSku extends BaseEntity { private String marketEnable; @ApiModelProperty(value = "商品详情") - @Column(columnDefinition = "TEXT") private String intro; @Max(value = 99999999, message = "价格不能超过99999999") @@ -131,13 +128,11 @@ public class GoodsSku extends BaseEntity { @ApiModelProperty(value = "运费模板id") private String templateId; - @ApiModelProperty(value = "运费承担者") - private String freightPayer; /** * @see GoodsAuthEnum */ @ApiModelProperty(value = "审核状态") - private String isAuth; + private String authFlag; @ApiModelProperty(value = "审核信息") private String authMessage; @@ -149,24 +144,70 @@ public class GoodsSku extends BaseEntity { private Boolean selfOperated; @ApiModelProperty(value = "商品移动端详情") - @Column(columnDefinition = "TEXT") private String mobileIntro; @ApiModelProperty(value = "商品视频") private String goodsVideo; @ApiModelProperty(value = "是否为推荐商品", required = true) - private boolean recommend; + private Boolean recommend; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum + */ @ApiModelProperty(value = "销售模式", required = true) private String salesModel; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型", required = true) + private String goodsType; + + public Double getWeight() { + if (weight == null) { + return 0d; + } + return weight; + } @Override - public Date getUpdateTime() { - if (super.getUpdateTime() == null) { + public Date getCreateTime() { + if (super.getCreateTime() == null) { return new Date(1593571928); } else { - return super.getUpdateTime(); + return super.getCreateTime(); } } + + /** + * 设置规格商品的基本商品信息 + * + * @param goods 基本商品信息 + */ + public GoodsSku(Goods goods) { + //商品基本信息 + this.goodsId = goods.getId(); + this.goodsName = goods.getGoodsName(); + this.goodsType = goods.getGoodsType(); + + this.selfOperated = goods.getSelfOperated(); + this.sellingPoint = goods.getSellingPoint(); + this.categoryPath = goods.getCategoryPath(); + this.brandId = goods.getBrandId(); + this.marketEnable = goods.getMarketEnable(); + this.intro = goods.getIntro(); + this.mobileIntro = goods.getMobileIntro(); + this.goodsUnit = goods.getGoodsUnit(); + this.grade = 100D; + //商品状态 + this.authFlag = goods.getAuthFlag(); + this.salesModel = goods.getSalesModel(); + //卖家信息 + this.storeId = goods.getStoreId(); + this.storeName = goods.getStoreName(); + this.storeCategoryPath = goods.getStoreCategoryPath(); + this.freightTemplateId = goods.getTemplateId(); + this.recommend = goods.getRecommend(); + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsUnit.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsUnit.java index f8d7d72a..cf5d589f 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsUnit.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsUnit.java @@ -1,29 +1,27 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; /** * 商品计量单位 * * @author Bulbasaur - * @date: 2020/11/26 16:08 + * @since 2020/11/26 16:08 */ @Data -@Entity -@Table(name = "li_goods_unit") @TableName("li_goods_unit") @ApiModel(value = "商品计量单位") public class GoodsUnit extends BaseEntity { @NotEmpty(message = "计量单位名称不能为空") + @Size(max = 5, message = "计量单位长度最大为5") @ApiModelProperty(value = "计量单位名称") private String name; } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsWords.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsWords.java index 02579a78..d6890ec9 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsWords.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsWords.java @@ -1,25 +1,21 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.modules.goods.entity.enums.GoodsWordsTypeEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; - /** * 商品关键字 * * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 */ @Data -@Entity -@Table(name = "li_goods_words") @TableName("li_goods_words") @ApiModel(value = "商品关键字") @NoArgsConstructor @@ -46,7 +42,7 @@ public class GoodsWords extends BaseEntity { private String abbreviate; /** - * 类型 + * @see GoodsWordsTypeEnum */ @ApiModelProperty(value = "类型") private String type; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Parameters.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Parameters.java index 6b39f1ea..f0afc24d 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Parameters.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Parameters.java @@ -1,14 +1,13 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; @@ -18,29 +17,26 @@ import javax.validation.constraints.NotNull; * 商品参数 * * @author pikachu - * @date 2020-02-23 9:14:33 + * @since 2020-02-23 9:14:33 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_parameters") @TableName("li_parameters") @ApiModel(value = "商品参数") -public class Parameters extends BaseEntity { +public class Parameters extends BaseIdEntity { + private static final long serialVersionUID = -566510714456317006L; @ApiModelProperty(value = "参数名称", required = true) @NotEmpty(message = "参数名称必填") - @Length(max = 50, message = "参数名称不能超过50字") + @Length(max = 5, message = "参数名称不能超过5字") private String paramName; - @ApiModelProperty(value = "参数类型1 输入项 2 选择项", required = true) - @NotNull(message = "参数类型必选") - @Min(value = 1, message = "参数类型传值不正确") - @Max(value = 2, message = "参数类型传值不正确") - private Integer paramType; - @ApiModelProperty(value = "选择值,当参数类型是选择项2时,必填,逗号分隔") + @ApiModelProperty(value = "选择值") + @NotEmpty(message = "参数选项值必填") + @Length(max = 255, message = "参数选项过长,请简略") private String options; @ApiModelProperty(value = "是否可索引,0 不显示 1 显示", required = true) @@ -63,6 +59,8 @@ public class Parameters extends BaseEntity { private String categoryId; @ApiModelProperty(value = "排序", hidden = true) + @NotNull(message = "请输入排序值") + @Max(value = 9999, message = "排序值不能大于9999") private Integer sort; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/SpecValues.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/SpecValues.java deleted file mode 100644 index 796610c9..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/SpecValues.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.lili.modules.goods.entity.dos; - -import cn.lili.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.persistence.Entity; -import javax.persistence.Table; - -/** - * 规格值 - * - * @author pikachu - * @date 2020-02-18 15:18:56 - */ -@Data -@Entity -@Table(name = "li_spec_values") -@TableName("li_spec_values") -@ApiModel(value = "规格值") -public class SpecValues extends BaseEntity { - - private static final long serialVersionUID = 1L; - - /** - * 规格项id - */ - @TableField(value = "spec_id") - @ApiModelProperty(value = "规格项id") - private String specId; - - /** - * 规格值名字 - */ - @TableField(value = "spec_value") - @ApiModelProperty(value = "规格值名字") - private String specValue; - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Specification.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Specification.java index 95245cf1..d59c7bb4 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Specification.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Specification.java @@ -1,27 +1,26 @@ package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; /** * 商品规格项 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @Data -@Entity -@Table(name = "li_specification") @TableName("li_specification") @ApiModel(value = "规格项") -public class Specification extends BaseEntity { +public class Specification extends BaseIdEntity { private static final long serialVersionUID = 147792597901239486L; @@ -29,14 +28,26 @@ public class Specification extends BaseEntity { * 规格名称 */ @NotEmpty(message = "规格名称不能为空") + @Size(max = 20, message = "规格名称不能超过20个字符") @ApiModelProperty(value = "规格名称", required = true) private String specName; /** * 所属卖家 0属于平台 + *

+ * 店铺自定义规格暂时废弃 2021-06-23 + * 后续推出新配置方式 */ @ApiModelProperty(hidden = true) private String storeId; + /** + * 规格值名字 + */ + @TableField(value = "spec_value") + @ApiModelProperty(value = "规格值名字, 《,》分割") + @Length(max = 255, message = "长度超出限制") + private String specValue; + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreGoodsLabel.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/StoreGoodsLabel.java similarity index 57% rename from framework/src/main/java/cn/lili/modules/store/entity/dos/StoreGoodsLabel.java rename to framework/src/main/java/cn/lili/modules/goods/entity/dos/StoreGoodsLabel.java index 25da3db9..2b079e43 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreGoodsLabel.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/StoreGoodsLabel.java @@ -1,24 +1,24 @@ -package cn.lili.modules.store.entity.dos; +package cn.lili.modules.goods.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; /** * 店铺商品分类 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @Data -@Entity -@Table(name = "li_store_goods_label") @TableName("li_store_goods_label") @ApiModel(value = "店铺商品分类") public class StoreGoodsLabel extends BaseEntity { @@ -28,12 +28,18 @@ public class StoreGoodsLabel extends BaseEntity { @ApiModelProperty("店铺ID") private String storeId; + @NotEmpty(message = "店铺商品分类名称不能为空") + @Length(max = 20,message = "店铺商品分类名称太长") @ApiModelProperty("店铺商品分类名称") private String labelName; + + @NotNull(message = "店铺商品分类排序不能为空") + @Max(value = 99999,message = "排序值太大") @ApiModelProperty("店铺商品分类排序") private BigDecimal sortOrder; + @NotEmpty(message = "父节点不能为空,需设定根节点或者某节点的子节点") @ApiModelProperty(value = "父id, 根节点为0") private String parentId; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Studio.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Studio.java new file mode 100644 index 00000000..b9913804 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Studio.java @@ -0,0 +1,97 @@ +package cn.lili.modules.goods.entity.dos; + +import cn.lili.modules.goods.entity.enums.StudioStatusEnum; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 小程序直播间 + * + * @author Bulbasaur + * @since 2021/5/17 9:47 上午 + */ +@Data +@ApiModel(value = "直播间") +@TableName("li_studio") +public class Studio extends BaseEntity { + + /** + * 直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符 + */ + @ApiModelProperty(value = "直播间名字") + private String name; + + /** + * 背景图,填入mediaID(mediaID获取后,三天内有效);图片mediaID的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html;直播间背景图,图片规则:建议像素1080*1920,大小不超过2M + */ + @ApiModelProperty(value = "背景图") + private String coverImg; + + /** + * 直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后) + */ + @ApiModelProperty(value = "开始时间") + private String startTime; + + /** + * 直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时) + */ + @ApiModelProperty(value = "结束时间") + private String endTime; + + /** + * 主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符 + */ + @ApiModelProperty(value = "主播昵称") + private String anchorName; + + /** + * 主播微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证, 小程序二维码链接:https://res.wx.qq.com/op_res/9rSix1dhHfK4rR049JL0PHJ7TpOvkuZ3mE0z7Ou_Etvjf-w1J_jVX0rZqeStLfwh + */ + @ApiModelProperty(value = "主播微信号") + private String anchorWechat; + + /** + * 分享图,填入mediaID(mediaID获取后,三天内有效);图片mediaID的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html;直播间分享图,图片规则:建议像素800*640,大小不超过1M; + */ + @ApiModelProperty(value = "分享图") + private String shareImg; + + /** + * 购物直播频道封面图,填入mediaID(mediaID获取后,三天内有效);图片mediaID的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html; 购物直播频道封面图,图片规则:建议像素800*800,大小不超过100KB; + */ + @ApiModelProperty(value = "封面图") + private String feedsImg; + + + @ApiModelProperty(value = "回放视频链接") + private String mediaUrl; + + @ApiModelProperty(value = "房间ID") + private Integer roomId; + + @ApiModelProperty(value = "小程序直播码") + private String qrCodeUrl; + + @ApiModelProperty(value = "店铺ID") + private String storeId; + + @ApiModelProperty(value = "直播间商品数量") + private Integer roomGoodsNum; + + @ApiModelProperty(value = "直播间商品(最多展示两个商品:name/goodsImage)") + private String roomGoodsList; + + @ApiModelProperty(value = "推荐直播间") + private boolean recommend; + + /** + * @see StudioStatusEnum + */ + @ApiModelProperty(value = "直播间状态") + private String status; +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/StudioCommodity.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/StudioCommodity.java new file mode 100644 index 00000000..061dac65 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/StudioCommodity.java @@ -0,0 +1,37 @@ +package cn.lili.modules.goods.entity.dos; + +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + + +/** + * 直播间商品 + * + * @author Bulbasaur + * @since 2021/5/18 5:42 下午 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "直播间商品") +@TableName("li_studio_commodity") +@NoArgsConstructor +public class StudioCommodity extends BaseIdEntity { + + private static final long serialVersionUID = 8383627725577840261L; + + @ApiModelProperty(value = "房间ID") + private Integer roomId; + + @ApiModelProperty(value = "商品ID") + private Integer goodsId; + + public StudioCommodity(Integer roomId, Integer goodsId) { + this.roomId = roomId; + this.goodsId = goodsId; + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Wholesale.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Wholesale.java new file mode 100644 index 00000000..4bc804b3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Wholesale.java @@ -0,0 +1,32 @@ +package cn.lili.modules.goods.entity.dos; + +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author paulG + * @since 2022/5/20 + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("li_wholesale") +@ApiModel(value = "批发商品") +public class Wholesale extends BaseIdEntity { + + private static final long serialVersionUID = -6389806138583086068L; + + @ApiModelProperty(value = "商品ID") + private String goodsId; + @ApiModelProperty(value = "SkuID") + private String skuId; + @ApiModelProperty(value = "模版id") + private String templateId; + @ApiModelProperty(value = "数量") + private Integer num; + @ApiModelProperty(value = "金额") + private Double price; +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/BrandPageDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/BrandPageDTO.java index 05f85f94..15f07a97 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/BrandPageDTO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/BrandPageDTO.java @@ -11,7 +11,7 @@ import lombok.Data; * 商品品牌dto * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @Data @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class) diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/CategorySearchParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/CategorySearchParams.java index 03e6543c..01921d86 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/CategorySearchParams.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/CategorySearchParams.java @@ -9,7 +9,7 @@ import java.math.BigDecimal; * 分类查询参数 * * @author paulG - * @date 2020/12/1 + * @since 2020/12/1 **/ @Data public class CategorySearchParams { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/CommodityDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/CommodityDTO.java new file mode 100644 index 00000000..969809b5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/CommodityDTO.java @@ -0,0 +1,30 @@ +package cn.lili.modules.goods.entity.dto; + +import lombok.Data; + +/** + * 直播商品DTO + * 用于获取直播商品状态时使用 + * + * @author Bulbasaur + * @since 2021/5/25 12:12 下午 + */ +@Data +public class CommodityDTO { + /** + * 商品ID + */ + private Integer goods_id; + /** + * 商品名称 + */ + private String name; + /** + * 地址 + */ + private String url; + /** + * 审核状态 + */ + private Integer audit_status; +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsDTO.java index 607223b6..0030cc4a 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsDTO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsDTO.java @@ -1,7 +1,6 @@ package cn.lili.modules.goods.entity.dto; import cn.lili.modules.goods.entity.dos.DraftGoods; -import cn.lili.modules.goods.entity.dos.GoodsParams; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -22,7 +21,7 @@ public class DraftGoodsDTO extends DraftGoods { @ApiModelProperty(value = "商品参数") @Valid - private List goodsParamsList; + private List goodsParamsDTOList; @ApiModelProperty(value = "商品图片") private List goodsGalleryList; @@ -31,4 +30,10 @@ public class DraftGoodsDTO extends DraftGoods { @Valid private List> skuList; + /** + * 批发商品规则 + */ + @ApiModelProperty(value = "批发商品规则") + private List wholesaleList; + } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsSearchParams.java index d146fa51..40ce2759 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/DraftGoodsSearchParams.java @@ -1,6 +1,6 @@ package cn.lili.modules.goods.entity.dto; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.modules.goods.entity.enums.DraftGoodsSaveType; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.ApiModelProperty; @@ -10,7 +10,7 @@ import lombok.Data; * 草稿商品搜索对象 * * @author paulG - * @date 2020/12/21 + * @since 2020/12/21 **/ @Data public class DraftGoodsSearchParams extends GoodsSearchParams { @@ -26,7 +26,7 @@ public class DraftGoodsSearchParams extends GoodsSearchParams { @Override public QueryWrapper queryWrapper() { QueryWrapper queryWrapper = super.queryWrapper(); - if (StrUtil.isNotEmpty(saveType)) { + if (CharSequenceUtil.isNotEmpty(saveType)) { queryWrapper.eq("save_type", saveType); } return queryWrapper; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsCompleteMessage.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsCompleteMessage.java index 0ff1826c..6dab4d05 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsCompleteMessage.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsCompleteMessage.java @@ -7,7 +7,7 @@ import lombok.Data; * 商品购买完成信息 * * @author paulG - * @date 2021/3/24 + * @since 2021/3/24 **/ @Data public class GoodsCompleteMessage { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsImportDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsImportDTO.java new file mode 100644 index 00000000..39c2d25b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsImportDTO.java @@ -0,0 +1,67 @@ +package cn.lili.modules.goods.entity.dto; + +import cn.lili.modules.goods.entity.dos.Category; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * 商品导入DTO + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GoodsImportDTO { + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品卖点") + private String sellingPoint; + + @ApiModelProperty(value = "商品分类") + private Category category; + + @ApiModelProperty(value = "运费模板") + private String template; + + @ApiModelProperty(value = "计量单位") + private String goodsUnit; + + @ApiModelProperty(value = "发布状态") + private Boolean release; + + @ApiModelProperty(value = "商品图片") + private List> images; + private List goodsGalleryList; + + @ApiModelProperty(value = "成本价") + private Double cost; + + @ApiModelProperty(value = "销售价") + private Double price; + + @ApiModelProperty(value = "库存") + private Integer quantity; + + @ApiModelProperty(value = "重量") + private Double weight; + + @ApiModelProperty(value = "货号") + private String sn; + + @ApiModelProperty(value = "详情") + private String intro; + + @ApiModelProperty(value = "规格项") + private String skuKey; + + @ApiModelProperty(value = "规格值") + private String skuValue; + + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsInfo.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsInfo.java new file mode 100644 index 00000000..34d1261b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsInfo.java @@ -0,0 +1,45 @@ +package cn.lili.modules.goods.entity.dto; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.goods.entity.dos.Commodity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 微信小程序直播商品DTO + * + * @author Bulbasaur + * @since 2021/5/17 11:03 上午 + */ +@Data +@NoArgsConstructor +public class GoodsInfo { + + @ApiModelProperty(value = "图片mediaID") + private String coverImgUrl; + + @ApiModelProperty(value = "商品名称") + private String name; + + /** + * 1:一口价(只需要传入price,price2不传) + * 2:价格区间(price字段为左边界,price2字段为右边界,price和price2必传) + * 3:显示折扣价(price字段为原价,price2字段为现价, price和price2必传 + */ + @ApiModelProperty(value = "价格类型") + private Integer priceType; + + @ApiModelProperty(value = "价格") + private Double price; + + @ApiModelProperty(value = "价格2") + private Double price2; + + @ApiModelProperty(value = "商品详情页的小程序路径") + private String url; + + public GoodsInfo(Commodity commodity) { + BeanUtil.copyProperties(commodity, this); + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java index b6f9c4ab..f3d99e24 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java @@ -1,28 +1,32 @@ package cn.lili.modules.goods.entity.dto; -import cn.lili.modules.goods.entity.dos.GoodsParams; +import cn.lili.common.validation.EnumValue; +import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.entity.enums.GoodsTypeEnum; import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.ToString; +import lombok.*; import org.hibernate.validator.constraints.Length; import javax.validation.Valid; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; +import javax.validation.constraints.*; import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; /** - * 商品查询条件 + * 商品操作DTO * * @author pikachu - * @date 2020-02-24 19:27:20 + * @since 2020-02-24 19:27:20 */ @Data @ToString +@NoArgsConstructor +@AllArgsConstructor +@Builder public class GoodsOperationDTO implements Serializable { private static final long serialVersionUID = -509667581371776913L; @@ -30,12 +34,17 @@ public class GoodsOperationDTO implements Serializable { @ApiModelProperty(hidden = true) private String goodsId; + @ApiModelProperty(value = "商品价格", required = true) + @NotNull(message = "商品价格不能为空") + @Min(value = 0, message = "商品价格不能为负数") + @Max(value = 99999999, message = "商品价格不能超过99999999") + private Double price; + @ApiModelProperty(value = "分类path") private String categoryPath; @ApiModelProperty(value = "店铺分类id", required = true) - @NotNull(message = "店铺分类不能为空") - @Min(value = 0, message = "店铺分类值不正确") + @Size(max = 200, message = "选择了太多店铺分类") private String storeCategoryPath; @ApiModelProperty(value = "品牌id") @@ -44,34 +53,9 @@ public class GoodsOperationDTO implements Serializable { @ApiModelProperty(value = "商品名称", required = true) @NotEmpty(message = "商品名称不能为空") + @Length(max = 50, message = "商品名称不能超过50个字符") private String goodsName; - @ApiModelProperty(value = "商品编号", required = true) - @Length(max = 30, message = "商品编号太长,不能超过30个字符") - private String sn; - - @ApiModelProperty(value = "商品价格", required = true) - @NotNull(message = "商品价格不能为空") - @Min(value = 0, message = "商品价格不能为负数") - @Max(value = 99999999, message = "商品价格不能超过99999999") - private Double price; - - @ApiModelProperty(value = "市场价格", required = true) - @NotNull(message = "市场价格不能为空") - private Double cost; - - @ApiModelProperty(value = "重量", required = true) - @NotNull(message = "商品重量不能为空") - @Min(value = 0, message = "重量不能为负数") - @Max(value = 99999999, message = "重量不能超过99999999") - private Double weight; - - @ApiModelProperty(value = "谁承担运费0:买家承担,1:卖家承担", required = true) - @NotNull(message = "承担运费不能为空") - @Min(value = 0, message = "承担运费值不正确") - @Max(value = 1, message = "承担运费值不正确") - private String freightPayer; - @ApiModelProperty(value = "详情") private String intro; @@ -79,18 +63,18 @@ public class GoodsOperationDTO implements Serializable { private String mobileIntro; @ApiModelProperty(value = "库存") + @Min(value = 0, message = "库存不能为负数") @Max(value = 99999999, message = "库存不能超过99999999") private Integer quantity; @ApiModelProperty(value = "是否立即发布") - private boolean release; + private Boolean release; @ApiModelProperty(value = "是否是推荐商品") - private boolean recommend; + private Boolean recommend; @ApiModelProperty(value = "商品参数") - @Valid - private List goodsParamsList; + private List goodsParamsDTOList; @ApiModelProperty(value = "商品图片") private List goodsGalleryList; @@ -100,13 +84,12 @@ public class GoodsOperationDTO implements Serializable { @Min(value = 0, message = "运费模板值不正确") private String templateId; - @ApiModelProperty(value = "sku列表") - @Valid - private List> skuList; - @ApiModelProperty(value = "卖点") private String sellingPoint; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum + */ @ApiModelProperty(value = "销售模式", required = true) private String salesModel; @@ -121,4 +104,76 @@ public class GoodsOperationDTO implements Serializable { @ApiModelProperty(value = "是否重新生成sku数据") private Boolean regeneratorSkuFlag = true; + + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型") + @EnumValue(strValues = {"PHYSICAL_GOODS", "VIRTUAL_GOODS", "E_COUPON"}, message = "商品类型参数值错误") + private String goodsType; + + /** + * 商品视频 + */ + @ApiModelProperty(value = "商品视频") + private String goodsVideo; + + + @ApiModelProperty(value = "sku列表") + @Valid + private List> skuList; + + @ApiModelProperty(value = "是否为商品模版") + private Boolean goodsTemplateFlag = false; + /** + * 批发商品规则 + */ + @ApiModelProperty(value = "批发商品规则") + private List wholesaleList; + + @ApiModelProperty(value = "注意事项") + private String needingAttention; + + + @ApiModelProperty(value = "是否为年度会员专属") + private Boolean annualFeeExclusive; + + @ApiModelProperty(value = "浏览权限") + private String browsePermissions; + + public String getGoodsName() { + //对商品对名称做一个极限处理。这里没有用xss过滤是因为xss过滤为全局过滤,影响很大。 + // 业务中,全局代码中只有商品名称不能拥有英文逗号,是由于商品名称存在一个数据库联合查询,结果要根据逗号分组 + return goodsName.replace(",", ""); + } + + public GoodsOperationDTO(GoodsImportDTO goodsImportDTO) { + this.price = goodsImportDTO.getPrice(); + this.goodsName = goodsImportDTO.getGoodsName(); + this.intro = goodsImportDTO.getIntro(); + this.mobileIntro = goodsImportDTO.getIntro(); + this.quantity = goodsImportDTO.getQuantity(); + this.goodsGalleryList = goodsImportDTO.getGoodsGalleryList(); + this.templateId = goodsImportDTO.getTemplate(); + this.sellingPoint = goodsImportDTO.getSellingPoint(); + this.salesModel = GoodsSalesModeEnum.RETAIL.name(); + this.goodsUnit = goodsImportDTO.getGoodsUnit(); + this.goodsType = GoodsTypeEnum.PHYSICAL_GOODS.name(); + this.release = goodsImportDTO.getRelease(); + this.recommend=false; + + Map map = new HashMap<>(); + map.put("sn", goodsImportDTO.getSn()); + map.put("price", goodsImportDTO.getPrice()); + map.put("cost", goodsImportDTO.getCost()); + map.put("weight", goodsImportDTO.getWeight()); + map.put("quantity", goodsImportDTO.getQuantity()); + map.put(goodsImportDTO.getSkuKey(), goodsImportDTO.getSkuValue()); + map.put("images", goodsImportDTO.getImages()); + + List> skuList = new ArrayList<>(); + skuList.add(map); + this.skuList = skuList; + + } } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsParamsDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsParamsDTO.java new file mode 100644 index 00000000..68313ebd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsParamsDTO.java @@ -0,0 +1,34 @@ +package cn.lili.modules.goods.entity.dto; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 商品关联参数 + * + * @author pikachu + * @since 2020-02-23 9:14:33 + */ +@Data +@ApiModel(value = "商品参数分组") +public class GoodsParamsDTO implements Serializable { + + private static final long serialVersionUID = 4892783539320159200L; + + @TableField(value = "group_id") + @ApiModelProperty(value = "分组id") + private String groupId; + + @TableField(value = "group_name") + @ApiModelProperty(value = "分组名称") + private String groupName; + + @ApiModelProperty(value = "分组内的商品参数列表") + private List goodsParamsItemDTOList; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsParamsItemDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsParamsItemDTO.java new file mode 100644 index 00000000..1b0dcb0b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsParamsItemDTO.java @@ -0,0 +1,39 @@ +package cn.lili.modules.goods.entity.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 商品参数项 + * + * @author Chopper + * @version v1.0 + * 2021-06-24 15:41 + */ +@Data +@ApiModel(value = "商品参数列表") +public class GoodsParamsItemDTO implements Serializable { + + private static final long serialVersionUID = -8823775607604091035L; + + @ApiModelProperty(value = "参数ID") + private String paramId; + + @ApiModelProperty(value = "参数名字") + private String paramName; + + @ApiModelProperty(value = "参数值") + private String paramValue; + + @ApiModelProperty(value = "是否可索引,0 不索引 1 索引") + private Integer isIndex = 0; + + @ApiModelProperty(value = "是否必填,0 不显示 1 显示") + private Integer required = 0; + + @ApiModelProperty(value = "排序") + private Integer sort; +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java index 6edfcb6b..7f10d1f7 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java @@ -1,20 +1,26 @@ package cn.lili.modules.goods.entity.dto; -import cn.lili.common.utils.StringUtils; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import lombok.*; + +import java.util.Arrays; /** * 商品查询条件 * * @author pikachu - * @date 2020-02-24 19:27:20 + * @since 2020-02-24 19:27:20 */ +@EqualsAndHashCode(callSuper = true) @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class GoodsSearchParams extends PageVO { private static final long serialVersionUID = 2544015852728566887L; @@ -26,7 +32,7 @@ public class GoodsSearchParams extends PageVO { private String goodsName; @ApiModelProperty(value = "商品编号") - private String sn; + private String id; @ApiModelProperty(value = "商家ID") private String storeId; @@ -40,9 +46,6 @@ public class GoodsSearchParams extends PageVO { @ApiModelProperty(value = "分类path") private String categoryPath; - @ApiModelProperty(value = "是否是积分商品") - private Boolean isPoint; - @ApiModelProperty(value = "店铺分类id") private String storeCategoryPath; @@ -59,67 +62,89 @@ public class GoodsSearchParams extends PageVO { * @see GoodsAuthEnum */ @ApiModelProperty(value = "审核状态") - private String isAuth; + private String authFlag; @ApiModelProperty(value = "库存数量") - private Integer quantity; + private Integer leQuantity; + + @ApiModelProperty(value = "库存数量") + private Integer geQuantity; @ApiModelProperty(value = "是否为推荐商品") private Boolean recommend; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型") + private String goodsType; + + /** + * @see cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum + */ + @ApiModelProperty(value = "销售模式", required = true) + private String salesModel; + public QueryWrapper queryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); - if (StringUtils.isNotEmpty(goodsId)) { + if (CharSequenceUtil.isNotEmpty(goodsId)) { queryWrapper.eq("goods_id", goodsId); } - if (StringUtils.isNotEmpty(goodsName)) { + if (CharSequenceUtil.isNotEmpty(goodsName)) { queryWrapper.like("goods_name", goodsName); } - if (StringUtils.isNotEmpty(sn)) { - queryWrapper.eq("sn", sn); + if (CharSequenceUtil.isNotEmpty(id)) { + queryWrapper.in("id", Arrays.asList(id.split(","))); } - if (StringUtils.isNotEmpty(storeId)) { + if (CharSequenceUtil.isNotEmpty(storeId)) { queryWrapper.eq("store_id", storeId); } - if (StringUtils.isNotEmpty(storeName)) { + if (CharSequenceUtil.isNotEmpty(storeName)) { queryWrapper.like("store_name", storeName); } - if (StringUtils.isNotEmpty(categoryPath)) { + if (CharSequenceUtil.isNotEmpty(categoryPath)) { queryWrapper.like("category_path", categoryPath); } - if (isPoint != null) { - queryWrapper.eq("is_point", isPoint); - } - if (StringUtils.isNotEmpty(storeCategoryPath)) { + if (CharSequenceUtil.isNotEmpty(storeCategoryPath)) { queryWrapper.like("store_category_path", storeCategoryPath); } if (selfOperated != null) { queryWrapper.eq("self_operated", selfOperated); } - if (StringUtils.isNotEmpty(marketEnable)) { + if (CharSequenceUtil.isNotEmpty(marketEnable)) { queryWrapper.eq("market_enable", marketEnable); } - if (StringUtils.isNotEmpty(isAuth)) { - queryWrapper.eq("is_auth", isAuth); + if (CharSequenceUtil.isNotEmpty(authFlag)) { + queryWrapper.eq("auth_flag", authFlag); } - if (quantity != null) { - queryWrapper.le("quantity", quantity); + if (leQuantity != null) { + queryWrapper.le("quantity", leQuantity); + } + if (geQuantity != null) { + queryWrapper.ge("quantity", geQuantity); } if (recommend != null) { queryWrapper.le("recommend", recommend); } + if (CharSequenceUtil.isNotEmpty(goodsType)) { + queryWrapper.eq("goods_type", goodsType); + } + if (CharSequenceUtil.isNotEmpty(salesModel)) { + queryWrapper.eq("sales_model", salesModel); + } + queryWrapper.eq("delete_flag", false); this.betweenWrapper(queryWrapper); return queryWrapper; } private void betweenWrapper(QueryWrapper queryWrapper) { - if (StringUtils.isNotEmpty(price)) { + if (CharSequenceUtil.isNotEmpty(price)) { String[] s = price.split("_"); if (s.length > 1) { - queryWrapper.ge("price", s[1]); + queryWrapper.between("price", s[0], s[1]); } else { - queryWrapper.le("price", s[0]); + queryWrapper.ge("price", s[0]); } } } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuDTO.java new file mode 100644 index 00000000..a93db09f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuDTO.java @@ -0,0 +1,25 @@ +package cn.lili.modules.goods.entity.dto; + +import cn.lili.modules.goods.entity.dos.GoodsSku; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * @author paulG + * @since 2022/6/13 + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class GoodsSkuDTO extends GoodsSku { + + private static final long serialVersionUID = 6600436187015048097L; + + @ApiModelProperty(value = "商品参数json") + private String params; + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuSearchParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuSearchParams.java index 7139e103..39d01981 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuSearchParams.java @@ -9,7 +9,7 @@ import lombok.Data; * 规格商品查询条件 * * @author paulG - * @date 2020/12/15 + * @since 2020/12/15 **/ @Data public class GoodsSkuSearchParams extends GoodsSearchParams { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java index d6d4841d..694df3c9 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSkuStockDTO.java @@ -7,7 +7,7 @@ import lombok.Data; * 商品库存DTO * * @author paulG - * @date 2020/12/23 + * @since 2020/12/23 **/ @Data public class GoodsSkuStockDTO { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/SpecificationSearchParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/SpecificationSearchParams.java deleted file mode 100644 index 0b93badf..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/SpecificationSearchParams.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.lili.modules.goods.entity.dto; - -import cn.lili.common.utils.StringUtils; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 规格搜索参数 - * - * @author paulG - * @date 2020/12/19 - **/ -@Data -public class SpecificationSearchParams { - - - @ApiModelProperty(value = "规格名") - private String specName; - - @ApiModelProperty(value = "绑定分类") - private String categoryPath; - - @ApiModelProperty(value = "未删除 ") - private Boolean deleteFlag; - - public QueryWrapper queryWrapper() { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like(StringUtils.isNotEmpty(specName), "spec_name", specName); - queryWrapper.eq(deleteFlag != null, "delete_flag", deleteFlag); - return queryWrapper; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/WholesaleDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/WholesaleDTO.java new file mode 100644 index 00000000..988b81db --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/WholesaleDTO.java @@ -0,0 +1,23 @@ +package cn.lili.modules.goods.entity.dto; + +import cn.lili.modules.goods.entity.dos.Wholesale; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.beans.BeanUtils; + +/** + * @author paulG + * @since 2022/5/25 + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class WholesaleDTO extends Wholesale { + + private static final long serialVersionUID = 853297561151783335L; + + public WholesaleDTO(Wholesale wholesale) { + BeanUtils.copyProperties(wholesale, this); + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/DraftGoodsSaveType.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/DraftGoodsSaveType.java index d4e0ae8b..f210acf4 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/enums/DraftGoodsSaveType.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/DraftGoodsSaveType.java @@ -4,12 +4,17 @@ package cn.lili.modules.goods.entity.enums; * 草稿商品保存类型 * * @author paulG - * @date 2020/12/21 + * @since 2020/12/21 **/ public enum DraftGoodsSaveType { + /** + * "草稿" + */ DRAFT("草稿"), - + /** + * "模版" + */ TEMPLATE("模版"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsAuthEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsAuthEnum.java index ff5a9d63..2576a85f 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsAuthEnum.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsAuthEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.goods.entity.enums; * 商品审核 * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ public enum GoodsAuthEnum { /** diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsFreightEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsFreightEnum.java deleted file mode 100644 index c89a56c2..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsFreightEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.lili.modules.goods.entity.enums; - -/** - * 商品运费承担者 - * - * @author pikachu - * @date 2020-02-26 23:24:13 - */ -public enum GoodsFreightEnum { - /** - * 买家承担运费 - */ - BUYER("买家承担运费"), - /** - * 卖家承担运费 - */ - STORE("卖家承担运费"); - - private final String description; - - GoodsFreightEnum(String description) { - this.description = description; - } - - public String description() { - return description; - } -} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsOperate.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsOperate.java index 73b11585..89ff2822 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsOperate.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsOperate.java @@ -4,7 +4,7 @@ package cn.lili.modules.goods.entity.enums; * 商品操作枚举 * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ public enum GoodsOperate { /** diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsSalesModeEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsSalesModeEnum.java index ed6361d6..b6d03aa5 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsSalesModeEnum.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsSalesModeEnum.java @@ -1,19 +1,14 @@ package cn.lili.modules.goods.entity.enums; /** - * 商品审核 + * 销售模式 * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ public enum GoodsSalesModeEnum { - /** - * 需要审核 并且待审核 - */ + RETAIL("零售"), - /** - * 审核通过 - */ WHOLESALE("批发"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsStatusEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsStatusEnum.java index 7ea1a0cf..4f666422 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.goods.entity.enums; * 商品类型枚举 * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ public enum GoodsStatusEnum { /** diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsTypeEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsTypeEnum.java new file mode 100644 index 00000000..0dc7d6f6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsTypeEnum.java @@ -0,0 +1,35 @@ +package cn.lili.modules.goods.entity.enums; + +/** + * 商品类型 + * + * @author Bulbasaur + * @since 2021/5/28 4:23 下午 + */ +public enum GoodsTypeEnum { + + /** + * "实物商品" + */ + PHYSICAL_GOODS("实物商品"), + /** + * "虚拟商品" + */ + VIRTUAL_GOODS("虚拟商品"), + /** + * "电子卡券" + */ + E_COUPON("电子卡券"); + + + private final String description; + + GoodsTypeEnum(String description) { + this.description = description; + } + + public String description() { + return description; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/StudioStatusEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/StudioStatusEnum.java new file mode 100644 index 00000000..494578cd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/StudioStatusEnum.java @@ -0,0 +1,35 @@ +package cn.lili.modules.goods.entity.enums; + + +/** + * 直播间状态 + * + * @author Bulbasaur + * @since 2021/5/31 10:32 上午 + */ +public enum StudioStatusEnum { + + /** + * 新建 + */ + NEW("新建"), + /** + * 开始 + */ + START("开始"), + /** + * 结束 + */ + END("结束"); + + private final String clientName; + + StudioStatusEnum(String des) { + this.clientName = des; + } + + public String clientName() { + return this.clientName; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/BrandVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/BrandVO.java index beab43a5..354c473d 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/BrandVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/BrandVO.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; * 品牌VO * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data public class BrandVO extends Brand { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryBrandVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryBrandVO.java index c30a694f..3e413833 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryBrandVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryBrandVO.java @@ -7,7 +7,7 @@ import lombok.Data; * 分类品牌VO * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data public class CategoryBrandVO { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategorySpecificationVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategorySpecificationVO.java deleted file mode 100644 index 209cc5fc..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategorySpecificationVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.lili.modules.goods.entity.vos; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 分类规格VO - * - * @author pikachu - * @date 2020-02-26 23:24:13 - */ -@Data -public class CategorySpecificationVO { - /** - * 规格id - */ - @ApiModelProperty(value = "规格id", required = true) - private String id; - - /** - * 规格名称 - */ - @ApiModelProperty(value = "规格名称", required = true) - private String name; -} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryVO.java index e03b16a5..3f298e26 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/CategoryVO.java @@ -17,7 +17,7 @@ import java.util.List; * 分类VO * * @author paulG - * @date 2020/12/1 + * @since 2020/12/1 **/ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/CommodityVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/CommodityVO.java new file mode 100644 index 00000000..693a2c6f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/CommodityVO.java @@ -0,0 +1,21 @@ +package cn.lili.modules.goods.entity.vos; + +import cn.lili.modules.goods.entity.dos.Commodity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 直播商品VO + * + * @author Bulbasaur + * @since 2021/5/26 6:09 下午 + */ +@Data +public class CommodityVO extends Commodity { + + @ApiModelProperty(value = "SKU库存") + private Integer quantity; + + @ApiModelProperty(value = "店铺名称") + private String storeName; +} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/DraftGoodsVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/DraftGoodsVO.java index f6e67966..6593342e 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/DraftGoodsVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/DraftGoodsVO.java @@ -1,7 +1,8 @@ package cn.lili.modules.goods.entity.vos; import cn.lili.modules.goods.entity.dos.DraftGoods; -import cn.lili.modules.goods.entity.dos.GoodsParams; +import cn.lili.modules.goods.entity.dos.Wholesale; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -12,8 +13,9 @@ import java.util.List; * 草稿商品VO * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ +@EqualsAndHashCode(callSuper = true) @Data public class DraftGoodsVO extends DraftGoods { @@ -23,11 +25,17 @@ public class DraftGoodsVO extends DraftGoods { private List categoryName; @ApiModelProperty(value = "商品参数") - private List goodsParamsList; + private List goodsParamsDTOList; @ApiModelProperty(value = "商品图片") private List goodsGalleryList; @ApiModelProperty(value = "sku列表") private List skuList; + + /** + * 批发商品规则 + */ + @ApiModelProperty(value = "批发商品规则") + private List wholesaleList; } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/ExchangeVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/ExchangeVO.java index 1be9128d..0c9f87b7 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/ExchangeVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/ExchangeVO.java @@ -8,7 +8,7 @@ import lombok.Data; * 兑换VO * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data public class ExchangeVO { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsOperateAllowable.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsOperateAllowable.java index 7ea76081..e7b85e01 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsOperateAllowable.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsOperateAllowable.java @@ -11,7 +11,7 @@ import java.io.Serializable; * 商品操作允许的范围 * * @author Bulbasaur - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data @AllArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsGroupVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsGroupVO.java index 18d0a9d5..c3807097 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsGroupVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsGroupVO.java @@ -10,7 +10,7 @@ import java.util.List; * 商品参数vo * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data public class GoodsParamsGroupVO implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsVO.java index 795a22c6..75928656 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsParamsVO.java @@ -1,7 +1,7 @@ package cn.lili.modules.goods.entity.vos; -import cn.lili.modules.goods.entity.dos.GoodsParams; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,10 +9,10 @@ import lombok.Data; * 商品关联参数的VO * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data -public class GoodsParamsVO extends GoodsParams { +public class GoodsParamsVO extends GoodsParamsDTO { private static final long serialVersionUID = -4904700751774005326L; @ApiModelProperty("1 输入项 2 选择项") diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuSpecVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuSpecVO.java index 3fe8a9e7..70b980b3 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuSpecVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuSpecVO.java @@ -9,7 +9,7 @@ import java.util.List; * 商品规格VO * * @author paulG - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data public class GoodsSkuSpecVO { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuVO.java index bd526f81..4721a4c9 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSkuVO.java @@ -5,6 +5,7 @@ import cn.lili.modules.goods.entity.dos.GoodsSku; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import java.util.List; @@ -13,9 +14,10 @@ import java.util.List; * 商品规格VO * * @author paulG - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data +@EqualsAndHashCode(callSuper = true) @NoArgsConstructor @AllArgsConstructor public class GoodsSkuVO extends GoodsSku { diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSpecValueVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSpecValueVO.java deleted file mode 100644 index ff4bdc63..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsSpecValueVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.lili.modules.goods.entity.vos; - -import com.baomidou.mybatisplus.annotation.TableField; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * 规格值VO - * - * @author paulG - * @date 2020-02-26 23:24:13 - */ -@Data -public class GoodsSpecValueVO { - - /** - * 规格值名字 - */ - @TableField(value = "name") - @ApiModelProperty(value = "规格值名字") - private String name; - - /** - * 规格值名字 - */ - @TableField(value = "value") - @ApiModelProperty(value = "规格值") - private List value; - -} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsVO.java index 6207aac0..bf62838f 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/GoodsVO.java @@ -1,9 +1,11 @@ package cn.lili.modules.goods.entity.vos; import cn.lili.modules.goods.entity.dos.Goods; -import cn.lili.modules.goods.entity.dos.GoodsParams; +import cn.lili.modules.goods.entity.dos.Wholesale; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.List; @@ -11,9 +13,10 @@ import java.util.List; * 商品VO * * @author pikachu - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data +@EqualsAndHashCode(callSuper = true) public class GoodsVO extends Goods { private static final long serialVersionUID = 6377623919990713567L; @@ -22,11 +25,14 @@ public class GoodsVO extends Goods { private List categoryName; @ApiModelProperty(value = "商品参数") - private List goodsParamsList; + private List goodsParamsDTOList; @ApiModelProperty(value = "商品图片") private List goodsGalleryList; @ApiModelProperty(value = "sku列表") private List skuList; + + @ApiModelProperty(value = "批发商品消费规则列表") + private List wholesaleList; } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/ParameterGroupVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/ParameterGroupVO.java index 52b9059e..ee3c7045 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/ParameterGroupVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/ParameterGroupVO.java @@ -13,7 +13,7 @@ import java.util.List; * 参数组vo * * @author pikachu - * @date 2020年03月02日 16:55:21 + * @since 2020年03月02日 16:55:21 */ @ApiModel @Data diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/SpecValueVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/SpecValueVO.java index 7cf635b3..89a9d540 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/SpecValueVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/SpecValueVO.java @@ -11,32 +11,21 @@ import java.util.List; * 规格值 * * @author Chopper - * @date 2020-02-26 23:24:13 + * @since 2020-02-26 23:24:13 */ @Data public class SpecValueVO implements Serializable { private static final long serialVersionUID = -4433579132929428572L; - @TableField(value = "spec_name_id") - @ApiModelProperty(value = "规格项ID") - private String specNameId; - @TableField(value = "spec_name") @ApiModelProperty(value = "规格项名字") private String specName; - @TableField(value = "spec_value_id") - @ApiModelProperty(value = "规格值") - private String specValueId; - @TableField(value = "spec_value") @ApiModelProperty(value = "规格值") private String specValue; - /** - * 规格类型,1图片 0 非图片 - */ @ApiModelProperty(value = "该规格是否有图片,1 有 0 没有") private Integer specType; /** diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/SpecificationVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/SpecificationVO.java deleted file mode 100644 index ba1b0c27..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/SpecificationVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.lili.modules.goods.entity.vos; - -import cn.lili.modules.goods.entity.dos.Specification; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 规格VO - * - * @author Chopper - * @date 2020-02-26 23:24:13 - */ -@Data -@NoArgsConstructor -public class SpecificationVO extends Specification { - - private static final long serialVersionUID = 5504602856844228350L; - - @ApiModelProperty(value = "规格项名称") - private String specValue; - - @ApiModelProperty(value = "分类path") - private String categoryPath; - - public SpecificationVO(String specName, String storeId, String categoryPath) { - - this.setSpecName(specName); - this.setStoreId(storeId); - this.categoryPath = categoryPath; - - - } - -} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/StockWarningVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/StockWarningVO.java index 0c8aa218..dadf68ee 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/vos/StockWarningVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/StockWarningVO.java @@ -11,7 +11,7 @@ import lombok.NoArgsConstructor; * 库存警告封装类 * * @author paulG - * @date 2020/12/24 + * @since 2020/12/24 **/ @Data @NoArgsConstructor @@ -22,6 +22,6 @@ public class StockWarningVO { private Integer stockWarningNum; @ApiModelProperty(value = "商品SKU列表") - private IPage goodsSkuIPage; + private IPage goodsSkuPage; } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreGoodsLabelVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/StoreGoodsLabelVO.java similarity index 92% rename from framework/src/main/java/cn/lili/modules/store/entity/vos/StoreGoodsLabelVO.java rename to framework/src/main/java/cn/lili/modules/goods/entity/vos/StoreGoodsLabelVO.java index 5ab532fe..5f0720e6 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreGoodsLabelVO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/StoreGoodsLabelVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.store.entity.vos; +package cn.lili.modules.goods.entity.vos; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -11,7 +11,7 @@ import java.util.List; * 店铺商品分类VO * * @author Bulbasaur - * @date 2020/12/11 16:18 + * @since 2020/12/11 16:18 */ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/vos/StudioVO.java b/framework/src/main/java/cn/lili/modules/goods/entity/vos/StudioVO.java new file mode 100644 index 00000000..b6e35498 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/vos/StudioVO.java @@ -0,0 +1,22 @@ +package cn.lili.modules.goods.entity.vos; + +import cn.lili.modules.goods.entity.dos.Commodity; +import cn.lili.modules.goods.entity.dos.Studio; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 直播间VO + * + * @author Bulbasaur + * @since 2021/5/31 11:58 上午 + */ +@Data +public class StudioVO extends Studio { + + @ApiModelProperty(value = "直播间商品列表") + private List commodityList; + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/BrandMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/BrandMapper.java index ded9fee8..fd04b50c 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/BrandMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/BrandMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 商品品牌数据处理层 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ public interface BrandMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryBrandMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryBrandMapper.java index daee3eb8..189d5b76 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryBrandMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryBrandMapper.java @@ -11,7 +11,7 @@ import java.util.List; * 商品分类品牌数据处理层 * * @author pikachu - * @date 2020-02-26 18:12:56 + * @since 2020-02-26 18:12:56 */ public interface CategoryBrandMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryMapper.java index bb0b1934..f6f837ee 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryMapper.java @@ -1,24 +1,15 @@ package cn.lili.modules.goods.mapper; import cn.lili.modules.goods.entity.dos.Category; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; /** * 商品分类数据处理层 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ public interface CategoryMapper extends BaseMapper { - @Select("SELECT name FROM li_category ${ew.customSqlSegment} ") - List getNamesByIds(@Param(Constants.WRAPPER) Wrapper queryWrapper); - } diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryParameterGroupMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryParameterGroupMapper.java index 7bedb837..e0427cd6 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryParameterGroupMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/CategoryParameterGroupMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 分类绑定参数组数据处理层 * * @author pikachu - * @date 2020-03-02 16:44:56 + * @since 2020-03-02 16:44:56 */ public interface CategoryParameterGroupMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/CategorySpecificationMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/CategorySpecificationMapper.java index 26913b77..de3c4967 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/CategorySpecificationMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/CategorySpecificationMapper.java @@ -1,7 +1,7 @@ package cn.lili.modules.goods.mapper; import cn.lili.modules.goods.entity.dos.CategorySpecification; -import cn.lili.modules.goods.entity.vos.CategorySpecificationVO; +import cn.lili.modules.goods.entity.dos.Specification; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Select; @@ -11,7 +11,7 @@ import java.util.List; * 商品分类规格数据处理层 * * @author pikachu - * @date 2020-02-27 15:18:56 + * @since 2020-02-27 15:18:56 */ public interface CategorySpecificationMapper extends BaseMapper { /** @@ -20,8 +20,7 @@ public interface CategorySpecificationMapper extends BaseMapper getCategorySpecList(String categoryId); + @Select("select s.* from li_specification s INNER join li_category_specification cs " + + "on s.id = cs.specification_id and cs.category_id = #{categoryId} ") + List getCategorySpecList(String categoryId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/CommodityMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/CommodityMapper.java new file mode 100644 index 00000000..f7965913 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/CommodityMapper.java @@ -0,0 +1,58 @@ +package cn.lili.modules.goods.mapper; + +import cn.lili.modules.goods.entity.dos.Commodity; +import cn.lili.modules.goods.entity.vos.CommodityVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 直播商品数据层 + * + * @author Bulbasaur + * @since 2021/5/17 9:56 上午 + */ +public interface CommodityMapper extends BaseMapper { + + /** + * 获取直播商品ID列表 + * + * @return 直播商品ID列表 + */ + @Select("SELECT live_goods_id FROM li_commodity WHERE audit_status='0' or audit_status='1'") + List getAuditCommodity(); + + /** + * 获取直播间关联直播商品列表 + * + * @param roomId 直播间ID + * @return 直播商品列表 + */ + @Select("SELECT * FROM li_commodity c INNER JOIN li_studio_commodity sc ON sc.goods_id = c.live_goods_id WHERE sc.room_id =#{roomId}") + List getCommodityByRoomId(Integer roomId); + + /** + * 获取直播商品图片列表 + * + * @param roomId 直播间ID + * @return 直播商品图片列表 + */ + @Select("SELECT goods_image FROM li_commodity c INNER JOIN li_studio_commodity sc ON sc.goods_id = c.live_goods_id WHERE sc.room_id =#{roomId}") + List getSimpleCommodityByRoomId(Integer roomId); + + /** + * 获取直播商品VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 直播商品VO分页 + */ + @Select("SELECT c.*,gs.quantity,s.store_name FROM li_commodity c INNER JOIN li_goods_sku gs ON c.sku_id = gs.id INNER JOIN li_store s ON s.id=c.store_id ${ew.customSqlSegment}") + IPage commodityVOList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/DraftGoodsMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/DraftGoodsMapper.java index 0e1137f5..d08bb376 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/DraftGoodsMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/DraftGoodsMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 草稿商品数据处理层 * * @author paulG - * @date 2020/12/19 + * @since 2020/12/19 **/ public interface DraftGoodsMapper extends BaseMapper { } diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsGalleryMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsGalleryMapper.java index 5ce5232f..1289d21b 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsGalleryMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsGalleryMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 商品相册数据处理层 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ public interface GoodsGalleryMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsMapper.java index 928248c7..9c1b5259 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsMapper.java @@ -10,25 +10,41 @@ import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; +import java.util.List; + /** * 规格项数据处理层 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ public interface GoodsMapper extends BaseMapper { /** - * 下架所有商家商品 + * 根据店铺ID获取商品ID列表 * - * @param storeId + * @param storeId 店铺ID + * @return 商品ID列表 */ - @Update("update li_goods set market_enable = 0 WHERE store_id = #{storeId}") - void underStoreGoods(String storeId); + @Select("SELECT id FROM li_goods WHERE store_id = #{storeId}") + List getGoodsIdByStoreId(String storeId); + /** + * 添加商品评价数量 + * + * @param commentNum 评价数量 + * @param goodsId 商品ID + */ @Update("UPDATE li_goods SET comment_num = comment_num + #{commentNum} WHERE id = #{goodsId}") void addGoodsCommentNum(Integer commentNum, String goodsId); + /** + * 查询商品VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 商品VO分页 + */ @Select("select g.* from li_goods as g ") IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsParamsMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsParamsMapper.java deleted file mode 100644 index 37d136f4..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsParamsMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.lili.modules.goods.mapper; - -import cn.lili.modules.goods.entity.dos.GoodsParams; -import cn.lili.modules.goods.entity.vos.GoodsParamsVO; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - - -/** - * 商品关联参数数据处理层 - * - * @author pikachu - * @date 2020-02-18 15:18:56 - */ -public interface GoodsParamsMapper extends BaseMapper { - - @Select("select p.*,gp.param_value,p.group_id from li_parameters p left join li_goods_params gp on p.id=gp.param_id and gp.goods_id = #{goodsId} where p.category_id = #{categoryId} order by sort") - List paramList(String goodsId, String categoryId); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java index 285ac23d..e17f6d41 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsSkuMapper.java @@ -1,14 +1,117 @@ package cn.lili.modules.goods.mapper; import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dto.GoodsSkuDTO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; /** * 规格项数据处理层 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ public interface GoodsSkuMapper extends BaseMapper { + /** + * 根据商品id获取全部skuId的集合 + * + * @param goodsId goodsId + * @return 全部skuId的集合 + */ + @Select("SELECT id FROM li_goods_sku WHERE goods_id = #{goodsId}") + List getGoodsSkuIdByGoodsId(String goodsId); + + + @Insert("replace into li_goods_sku (\n" + + "\tid,\n" + + "\tgoods_id,\n" + + "\tspecs,\n" + + "\tsimple_specs,\n" + + "\tfreight_template_id,\n" + + "\tgoods_name,\n" + + "\tsn,\n" + + "\tbrand_id,\n" + + "\tcategory_path,\n" + + "\tgoods_unit,\n" + + "\tselling_point,\n" + + "\tweight,\n" + + "\tmarket_enable,\n" + + "\tintro,\n" + + "\tprice,\n" + + "\tcost,\n" + + "\tquantity,\n" + + "\tgrade,\n" + + "\tthumbnail,\n" + + "\tsmall,\n" + + "\tstore_category_path,\n" + + "\tstore_id,\n" + + "\tstore_name,\n" + + "\tauth_flag,\n" + + "\tself_operated,\n" + + "\tmobile_intro,\n" + + "\trecommend,\n" + + "\tsales_model,\n" + + "\tgoods_type,\n" + + "\tcreate_by,\n" + + "\tcreate_time,\n" + + "\tupdate_time,\n" + + "\tdelete_flag \n" + + ")\n" + + " VALUES\n" + + "(\n" + + "\t#{goodsSku.id},\n" + + "\t#{goodsSku.goodsId},\n" + + "\t#{goodsSku.specs},\n" + + "\t#{goodsSku.simpleSpecs},\n" + + "\t#{goodsSku.freightTemplateId},\n" + + "\t#{goodsSku.goodsName},\n" + + "\t#{goodsSku.sn},\n" + + "\t#{goodsSku.brandId},\n" + + "\t#{goodsSku.categoryPath},\n" + + "\t#{goodsSku.goodsUnit},\n" + + "\t#{goodsSku.sellingPoint},\n" + + "\t#{goodsSku.weight},\n" + + "\t#{goodsSku.marketEnable},\n" + + "\t#{goodsSku.intro},\n" + + "\t#{goodsSku.price},\n" + + "\t#{goodsSku.cost},\n" + + "\t#{goodsSku.quantity},\n" + + "\t#{goodsSku.grade},\n" + + "\t#{goodsSku.thumbnail},\n" + + "\t#{goodsSku.small},\n" + + "\t#{goodsSku.storeCategoryPath},\n" + + "\t#{goodsSku.storeId},\n" + + "\t#{goodsSku.storeName},\n" + + "\t#{goodsSku.authFlag},\n" + + "\t#{goodsSku.selfOperated},\n" + + "\t#{goodsSku.mobileIntro},\n" + + "\t#{goodsSku.recommend},\n" + + "\t#{goodsSku.salesModel},\n" + + "\t#{goodsSku.goodsType},\n" + + "\t#{goodsSku.createBy},\n" + + "\t#{goodsSku.createTime},\n" + + "\t#{goodsSku.updateTime},\n" + + "\t#{goodsSku.deleteFlag}\n" + + ")") + int replaceGoodsSku(@Param("goodsSku") GoodsSku goodsSku); + + + /** + * 分页查询商品skuDTO + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 售后VO分页 + */ + @Select("SELECT *,g.params as params FROM li_goods_sku gs inner join li_goods g on gs.goods_id = g.id ${ew.customSqlSegment}") + IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsUnitMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsUnitMapper.java index 912c5a52..53b3b040 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsUnitMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsUnitMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 商品计量单位数据处理层 * * @author Bulbasaur - * @date 2020/11/26 16:11 + * @since 2020/11/26 16:11 */ public interface GoodsUnitMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsWordsMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsWordsMapper.java index f34e4fa3..3308b384 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsWordsMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/GoodsWordsMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 商品关键字数据处理层 * * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 **/ public interface GoodsWordsMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/ParametersMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/ParametersMapper.java index c57dc7d5..bb9010b7 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/ParametersMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/ParametersMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 商品参数数据处理层 * * @author pikachu - * @date 2020-03-02 17:27:56 + * @since 2020-03-02 17:27:56 */ public interface ParametersMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/SpecValuesMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/SpecValuesMapper.java deleted file mode 100644 index 18e37215..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/SpecValuesMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.lili.modules.goods.mapper; - -import cn.lili.modules.goods.entity.dos.SpecValues; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - * 规格项数据处理层 - * - * @author pikachu - * @date 2020-02-18 15:18:56 - */ -public interface SpecValuesMapper extends BaseMapper { - - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/SpecificationMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/SpecificationMapper.java index 71ec8289..8c554d83 100644 --- a/framework/src/main/java/cn/lili/modules/goods/mapper/SpecificationMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/SpecificationMapper.java @@ -2,24 +2,14 @@ package cn.lili.modules.goods.mapper; import cn.lili.modules.goods.entity.dos.Specification; -import cn.lili.modules.goods.entity.vos.SpecificationVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.List; -import java.util.Map; - /** * 规格数据处理层 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ public interface SpecificationMapper extends BaseMapper { - /** - * 查询规格信息列表 - * @param param - * @return - */ - List findSpecList(Map param); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/StoreGoodsLabelMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/StoreGoodsLabelMapper.java similarity index 62% rename from framework/src/main/java/cn/lili/modules/store/mapper/StoreGoodsLabelMapper.java rename to framework/src/main/java/cn/lili/modules/goods/mapper/StoreGoodsLabelMapper.java index c59c46bc..81d1746f 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/StoreGoodsLabelMapper.java +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/StoreGoodsLabelMapper.java @@ -1,13 +1,13 @@ -package cn.lili.modules.store.mapper; +package cn.lili.modules.goods.mapper; -import cn.lili.modules.store.entity.dos.StoreGoodsLabel; +import cn.lili.modules.goods.entity.dos.StoreGoodsLabel; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 店铺商品分类数据处理层 * * @author pikachu - * @date 2020-03-07 09:18:56 + * @since 2020-03-07 09:18:56 */ public interface StoreGoodsLabelMapper extends BaseMapper { } diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/StudioCommodityMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/StudioCommodityMapper.java new file mode 100644 index 00000000..f5630119 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/StudioCommodityMapper.java @@ -0,0 +1,13 @@ +package cn.lili.modules.goods.mapper; + +import cn.lili.modules.goods.entity.dos.StudioCommodity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 直播间-商品关联持久层 + * @author Bulbasaur + * @since 2021/5/17 3:14 下午 + * + */ +public interface StudioCommodityMapper extends BaseMapper { +} diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/StudioMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/StudioMapper.java new file mode 100644 index 00000000..47c0c73a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/StudioMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.goods.mapper; + +import cn.lili.modules.goods.entity.dos.Studio; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 直播间数据层 + * + * @author Bulbasaur + * @since 2021/5/17 9:56 上午 + */ +public interface StudioMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/mapper/WholesaleMapper.java b/framework/src/main/java/cn/lili/modules/goods/mapper/WholesaleMapper.java new file mode 100644 index 00000000..372d4d43 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/mapper/WholesaleMapper.java @@ -0,0 +1,11 @@ +package cn.lili.modules.goods.mapper; + +import cn.lili.modules.goods.entity.dos.Wholesale; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @author paulG + * @since 2022/5/24 + **/ +public interface WholesaleMapper extends BaseMapper { +} diff --git a/framework/src/main/java/cn/lili/modules/goods/service/BrandService.java b/framework/src/main/java/cn/lili/modules/goods/service/BrandService.java index 45d3f2c3..63c523c9 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/BrandService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/BrandService.java @@ -8,12 +8,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; /** * 商品品牌业务层 * * @author pikachu - * @date 2020-02-18 16:18:56 + * @since 2020-02-18 16:18:56 */ public interface BrandService extends IService { @@ -25,6 +26,13 @@ public interface BrandService extends IService { */ IPage getBrandsByPage(BrandPageDTO page); + /** + * 删除品牌 + * + * @param ids 品牌id + */ + void deleteBrands(List ids); + /** * 根据分类ID获取品牌列表 * @@ -33,6 +41,14 @@ public interface BrandService extends IService { */ List getBrandsByCategory(String categoryId); + /** + * 根据分类ID获取品牌列表 + * + * @param categoryIds 分类ID + * @return 品牌列表 + */ + List> getBrandsMapsByCategory(List categoryIds, String columns); + /** * 添加品牌 * diff --git a/framework/src/main/java/cn/lili/modules/goods/service/CategoryBrandService.java b/framework/src/main/java/cn/lili/modules/goods/service/CategoryBrandService.java index 8ef40842..32f84616 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/CategoryBrandService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/CategoryBrandService.java @@ -10,7 +10,7 @@ import java.util.List; * 商品分类品牌业务层 * * @author pikachu - * @date 2020-02-26 16:18:56 + * @since 2020-02-26 16:18:56 */ public interface CategoryBrandService extends IService { /** @@ -23,6 +23,7 @@ public interface CategoryBrandService extends IService { /** * 通过分类ID删除关联品牌 + * * @param categoryId 品牌ID */ void deleteByCategoryId(String categoryId); @@ -34,6 +35,14 @@ public interface CategoryBrandService extends IService { * @param brandId 品牌ID * @return 分类品牌关联信息 */ - List getCategoryBrandListByBrandId(String brandId); + List getCategoryBrandListByBrandId(List brandId); + + /** + * 保存分类品牌关系 + * + * @param categoryId 分类id + * @param brandIds 品牌ids + */ + void saveCategoryBrandList(String categoryId, List brandIds); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/CategoryParameterGroupService.java b/framework/src/main/java/cn/lili/modules/goods/service/CategoryParameterGroupService.java index a870b4b8..f114195a 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/CategoryParameterGroupService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/CategoryParameterGroupService.java @@ -10,7 +10,7 @@ import java.util.List; * 分类绑定参数组业务层 * * @author pikachu - * @date 2020-03-02 16:44:56 + * @since 2020-03-02 16:44:56 */ public interface CategoryParameterGroupService extends IService { @@ -30,5 +30,20 @@ public interface CategoryParameterGroupService extends IService getCategoryGroup(String categoryId); - + + + /** + * 更新分类参数组绑定信息 + * + * @param categoryParameterGroup 分类参数组信息 + * @return 是否成功 + */ + boolean updateCategoryGroup(CategoryParameterGroup categoryParameterGroup); + + /** + * 通过分类ID删除关联品牌 + * @param categoryId 品牌ID + */ + void deleteByCategoryId(String categoryId); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/CategoryService.java b/framework/src/main/java/cn/lili/modules/goods/service/CategoryService.java index 94216d9f..d356381e 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/CategoryService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/CategoryService.java @@ -6,12 +6,13 @@ import cn.lili.modules.goods.entity.vos.CategoryVO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; /** * 商品分类业务层 * * @author pikachu - * @date 2020-03-02 16:44:56 + * @since 2020-03-02 16:44:56 */ public interface CategoryService extends IService { @@ -20,10 +21,35 @@ public interface CategoryService extends IService { * 管理端获取所有分类 * 即获取的对象不管是否删除,都要展示,而且不从缓存获取,保证内容是最新的 * + * @param parentId 分类父ID * @return 商品分类列表 */ List dbList(String parentId); + /** + * 获取分类 + * + * @param id + * @return + */ + Category getCategoryById(String id); + + /** + * 根据分类id集合获取所有分类根据层级排序 + * + * @param ids 分类ID集合 + * @return 商品分类列表 + */ + List listByIdsOrderByLevel(List ids); + + /** + * 根据分类id集合获取所有分类根据层级排序 + * + * @param ids 分类ID集合 + * @return 商品分类列表 + */ + List> listMapsByIdsOrderByLevel(List ids, String columns); + /** * 获取分类树 * @@ -34,16 +60,18 @@ public interface CategoryService extends IService { /** * 查询所有的分类,父子关系 * + * @param parentId 分类父ID * @return 所有的分类,父子关系 */ List listAllChildren(String parentId); /** - * 查询所有的分类,父子关系 数据库获取 + * 查询所有的分类,父子关系 + * 数据库获取 * * @return 所有的分类,父子关系 */ - List listAllChildrenDB(); + List listAllChildren(); /** * 获取指定分类的分类名称 @@ -56,6 +84,7 @@ public interface CategoryService extends IService { /** * 获取商品分类list * + * @param category 分类 * @return 商品分类list */ List findByAllBySortOrder(Category category); @@ -93,12 +122,17 @@ public interface CategoryService extends IService { /** * 获取商家经营类目 + * + * @param categories 经营范围 + * @return 分类VO列表 */ List getStoreCategory(String[] categories); /** * 获取一级分类列表 * 用于商家入驻选择 + * + * @return 分类列表 */ List firstCategory(); diff --git a/framework/src/main/java/cn/lili/modules/goods/service/CategorySpecificationService.java b/framework/src/main/java/cn/lili/modules/goods/service/CategorySpecificationService.java index 38725044..e560255e 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/CategorySpecificationService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/CategorySpecificationService.java @@ -1,7 +1,7 @@ package cn.lili.modules.goods.service; import cn.lili.modules.goods.entity.dos.CategorySpecification; -import cn.lili.modules.goods.entity.vos.CategorySpecificationVO; +import cn.lili.modules.goods.entity.dos.Specification; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -10,7 +10,7 @@ import java.util.List; * 商品分类规格业务层 * * @author pikachu - * @date 2020-02-26 16:18:56 + * @since 2020-02-26 16:18:56 */ public interface CategorySpecificationService extends IService { /** @@ -19,15 +19,8 @@ public interface CategorySpecificationService extends IService getCategorySpecList(String categoryId); + List getCategorySpecList(String categoryId); - /*** - * 根据分类id查询规格信息 - * - * @param categoryId 分类id - * @return 分类规格关联信息 - */ - List getCategorySpecList(String[] categoryId); /** * 通过分类ID删除关联规格 diff --git a/framework/src/main/java/cn/lili/modules/goods/service/CommodityService.java b/framework/src/main/java/cn/lili/modules/goods/service/CommodityService.java new file mode 100644 index 00000000..98c5e1ca --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/service/CommodityService.java @@ -0,0 +1,46 @@ +package cn.lili.modules.goods.service; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.Commodity; +import cn.lili.modules.goods.entity.vos.CommodityVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 直播商品业务层 + * + * @author Bulbasaur + * @since 2021/5/17 10:39 上午 + */ +public interface CommodityService extends IService { + + /** + * 添加直播商品 + * @param commodity 直播商品列表 + * @return 添加结果 + */ + boolean addCommodity(List commodity); + + /** + * 删除直播商品 + * @param goodsId 直播商品ID + * @return 删除结果 + */ + boolean deleteCommodity(String goodsId); + + /** + * 查询微信小程序直播商品审核状态 + */ + void getGoodsWareHouse(); + + /** + * 查看直播商品分页 + * @param pageVO 分页 + * @param name 商品名称 + * @param auditStatus 审核状态 + * @return 直播商品分页 + */ + IPage commodityList(PageVO pageVO, String name, String auditStatus); +} diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsGalleryService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsGalleryService.java index 501e22f1..65592834 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsGalleryService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsGalleryService.java @@ -36,4 +36,11 @@ public interface GoodsGalleryService extends IService { */ List goodsGalleryList(String goodsId); + /** + * 根据商品 id删除商品相册缩略图 + * + * @param goodsId 商品ID + */ + void removeByGoodsId(String goodsId); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsImportService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsImportService.java new file mode 100644 index 00000000..c7d52768 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsImportService.java @@ -0,0 +1,20 @@ +package cn.lili.modules.goods.service; + +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; + +public interface GoodsImportService { + + + /** + * 下载导入列表 + * @param response + */ + void download(HttpServletResponse response); + + /** + * 导入商品 + */ + void importExcel(MultipartFile files) throws Exception; +} diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsParamsService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsParamsService.java deleted file mode 100644 index c0ea0bd1..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsParamsService.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.lili.modules.goods.service; - -import cn.lili.modules.goods.entity.dos.GoodsParams; -import cn.lili.modules.goods.entity.vos.GoodsParamsGroupVO; -import cn.lili.modules.goods.entity.vos.GoodsParamsVO; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - - -/** - * 商品关联参数业务层 - * - * @author pikachu - * @date 2020-03-13 16:18:56 - */ -public interface GoodsParamsService extends IService { - - /** - * 添加商品参数 - * @param paramList 参数列表 - * @param goodsId 商品ID - */ - void addParams(List paramList, String goodsId); - - /** - * 获取商品关联参数 - * - * @param goodsId 商品ID - * @return 商品关联参数 - */ - List getGoodsParamsByGoodsId(String goodsId); - - /** - * 添加商品参数 - * - * @param goodsParamsVO 商品参数 - * @return 添加是否成功 - */ - boolean addParams(GoodsParamsVO goodsParamsVO); - - /** - * 根据分类id查询绑定参数信息 - * - * @param categoryId 分类id - * @param goodsId 商品id - * @return 分类id - */ - List paramList(String categoryId, String goodsId); - - /** - * 查询商品参数信息 - * - * @param goodsId 商品id - * @param categoryId 分了id - * @return 商品参数信息 - */ - List queryGoodsParams(String goodsId, String categoryId); - - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java index c84f0a97..165d1d61 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java @@ -6,6 +6,7 @@ import cn.lili.modules.goods.entity.dto.GoodsSearchParams; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.entity.vos.GoodsVO; +import cn.lili.modules.store.entity.dos.Store; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -15,11 +16,18 @@ import java.util.List; * 商品业务层 * * @author pikachu - * @date 2020-02-23 16:18:56 + * @since 2020-02-23 16:18:56 */ public interface GoodsService extends IService { + /** + * 根据品牌获取商品 + * + * @param brandIds 品牌ids + */ + List getByBrandIds(List brandIds); + /** * 下架所有商家商品 * @@ -27,13 +35,21 @@ public interface GoodsService extends IService { */ void underStoreGoods(String storeId); + /** + * 更新商品参数 + * + * @param goodsId 商品id + * @param params 商品参数 + */ + void updateGoodsParams(String goodsId, String params); + /** * 获取某分类下的商品数量 * * @param categoryId 分类ID * @return 商品数量 */ - Integer getGoodsCountByCategory(String categoryId); + long getGoodsCountByCategory(String categoryId); /** * 添加商品 @@ -46,6 +62,7 @@ public interface GoodsService extends IService { * 修改商品 * * @param goodsOperationDTO 商品查询条件 + * @param goodsId 商品ID */ void editGoods(GoodsOperationDTO goodsOperationDTO, String goodsId); @@ -57,13 +74,24 @@ public interface GoodsService extends IService { */ GoodsVO getGoodsVO(String goodsId); + /** * 商品查询 * * @param goodsSearchParams 查询参数 + * @return 商品分页 */ IPage queryByParams(GoodsSearchParams goodsSearchParams); + + /** + * 商品查询 + * + * @param goodsSearchParams 查询参数 + * @return 商品信息 + */ + List queryListByParams(GoodsSearchParams goodsSearchParams); + /** * 批量审核商品 * @@ -73,30 +101,37 @@ public interface GoodsService extends IService { */ boolean auditGoods(List goodsIds, GoodsAuthEnum goodsAuthEnum); - /** - * 获取所有的已上架的商品数量 - * - * @return 所有的已上架的商品数量 - */ - Integer goodsNum(GoodsStatusEnum goodsStatusEnum,GoodsAuthEnum goodsAuthEnum); /** - * 获取今天的已上架的商品数量 - * - * @return 今天的已上架的商品数量 - */ - Integer todayUpperNum(); - - /* * 更新商品上架状态状态 * - * @param goodsIds 商品ID集合 + * @param goodsIds 商品ID集合 * @param goodsStatusEnum 更新的商品状态 * @param underReason 下架原因 * @return 更新结果 */ Boolean updateGoodsMarketAble(List goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason); + + /** + * 更新商品上架状态状态 + * + * @param storeId 店铺ID + * @param goodsStatusEnum 更新的商品状态 + * @param underReason 下架原因 + * @return 更新结果 + */ + Boolean updateGoodsMarketAbleByStoreId(String storeId, GoodsStatusEnum goodsStatusEnum, String underReason); + + /** + * 更新商品上架状态状态 + * + * @param goodsIds 商品ID集合 + * @param goodsStatusEnum 更新的商品状态 + * @param underReason 下架原因 + * @return 更新结果 + */ + Boolean managerUpdateGoodsMarketAble(List goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason); /** * 删除商品 * @@ -108,18 +143,51 @@ public interface GoodsService extends IService { /** * 设置商品运费模板 * - * @param goodsIds 商品列表 - * @param freightPayer 承担运费者 - * @param templateId 运费模板ID + * @param goodsIds 商品列表 + * @param templateId 运费模板ID * @return 操作结果 */ - Boolean freight(List goodsIds, String freightPayer, String templateId); + Boolean freight(List goodsIds, String templateId); /** * 修改商品库存数量 * - * @param goodsId 商品ID + * @param goodsId 商品ID * @param quantity 库存数量 */ void updateStock(String goodsId, Integer quantity); -} \ No newline at end of file + + /** + * 更新商品评价数量 + * + * @param goodsId 商品ID + */ + void updateGoodsCommentNum(String goodsId); + + /** + * 更新商品的购买数量 + * + * @param goodsId 商品ID + * @param buyCount 购买数量 + */ + void updateGoodsBuyCount(String goodsId, int buyCount); + + /** + * 批量更新商品的店铺信息 + * @param store + */ + void updateStoreDetail(Store store); + /** + * 统计店铺的商品数量 + * @param storeId 店铺id + * @return + */ + long countStoreGoodsNum(String storeId); + + /** + * 同步商品分类名称 + * + * @param categoryId 分类ID + */ + void categoryGoodsName(String categoryId); +} diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java index b7f14218..f31247c8 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java @@ -1,13 +1,16 @@ package cn.lili.modules.goods.service; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.CachePrefix; import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; import cn.lili.modules.goods.entity.dto.GoodsSearchParams; +import cn.lili.modules.goods.entity.dto.GoodsSkuDTO; import cn.lili.modules.goods.entity.dto.GoodsSkuStockDTO; -import cn.lili.modules.goods.entity.vos.GoodsSkuSpecVO; import cn.lili.modules.goods.entity.vos.GoodsSkuVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -17,14 +20,26 @@ import java.util.Map; * 商品sku业务层 * * @author pikachu - * @date 2020-02-24 16:18:56 + * @since 2020-02-24 16:18:56 */ public interface GoodsSkuService extends IService { + /** + * 获取商品SKU缓存ID + * + * @param id SkuId + * @return 商品SKU缓存ID + */ static String getCacheKeys(String id) { return CachePrefix.GOODS_SKU.getPrefix() + id; } + /** + * 获取商品SKU库存缓存ID + * + * @param id SkuId + * @return 商品SKU缓存ID + */ static String getStockCacheKey(String id) { return CachePrefix.SKU_STOCK.getPrefix() + id; } @@ -32,19 +47,18 @@ public interface GoodsSkuService extends IService { /** * 添加商品sku * - * @param skuList sku列表 - * @param goods 商品信息 + * @param goods 商品信息 + * @param goodsOperationDTO 商品操作信息 */ - void add(List> skuList, Goods goods); + void add(Goods goods, GoodsOperationDTO goodsOperationDTO); /** * 更新商品sku * - * @param skuList sku列表 - * @param goods 商品信息 - * @param regeneratorSkuFlag 是否是否重新生成sku + * @param goods 商品信息 + * @param goodsOperationDTO 商品操作信息 */ - void update(List> skuList, Goods goods, Boolean regeneratorSkuFlag); + void update(Goods goods, GoodsOperationDTO goodsOperationDTO); /** * 更新商品sku @@ -53,6 +67,13 @@ public interface GoodsSkuService extends IService { */ void update(GoodsSku goodsSku); + /** + * 清除sku缓存 + * + * @param skuId skuid + */ + void clearCache(String skuId); + /** * 从redis缓存中获取商品SKU信息 * @@ -61,6 +82,14 @@ public interface GoodsSkuService extends IService { */ GoodsSku getGoodsSkuByIdFromCache(String id); + /** + * 从缓存中获取可参与促销商品 + * + * @param skuId skuid + * @return 商品详情 + */ + GoodsSku getCanPromotionGoodsSkuByIdFromCache(String skuId); + /** * 获取商品sku详情 * @@ -70,14 +99,6 @@ public interface GoodsSkuService extends IService { */ Map getGoodsSkuDetail(String goodsId, String skuId); - /** - * 根据商品分组商品sku及其规格信息 - * - * @param goodsId 商品id - * @return 分组后的商品sku及其规格信息 - */ - List groupBySkuAndSpec(String goodsId); - /** * 批量从redis中获取商品SKU信息 * @@ -94,6 +115,14 @@ public interface GoodsSkuService extends IService { */ List getGoodsListByGoodsId(String goodsId); + /** + * 获取goodsId下所有的goodsSku + * + * @param goodsId 商品id + * @return goodsSku列表 + */ + List getGoodsSkuListByGoodsId(String goodsId); + /** * 根据goodsSku组装goodsSkuVO * @@ -118,13 +147,40 @@ public interface GoodsSkuService extends IService { */ IPage getGoodsSkuByPage(GoodsSearchParams searchParams); + + /** + * 分页查询商品sku信息 + * + * @param page 分页参数 + * @param queryWrapper 查询参数 + * @return 商品sku信息 + */ + IPage getGoodsSkuDTOByPage(Page page, Wrapper queryWrapper); + + /** + * 列表查询商品sku信息 + * + * @param searchParams 查询参数 + * @return 商品sku信息 + */ + List getGoodsSkuByList(GoodsSearchParams searchParams); + /** * 更新商品sku状态 * - * @param goods 商品信息(Id,MarketEnable/IsAuth) + * @param goods 商品信息(Id,MarketEnable/AuthFlag) */ void updateGoodsSkuStatus(Goods goods); + /** + * 更新商品sku状态根据店铺id + * + * @param storeId 店铺id + * @param marketEnable 市场启用状态 + * @param authFlag 审核状态 + */ + void updateGoodsSkuStatusByStoreId(String storeId, String marketEnable, String authFlag); + /** * 更新SKU库存 * @@ -158,7 +214,39 @@ public interface GoodsSkuService extends IService { /** * 更新SKU评价数量 * - * @param skuId SKUId + * @param skuId SKUId */ void updateGoodsSkuCommentNum(String skuId); + + /** + * 根据商品id获取全部skuId的集合 + * + * @param goodsId goodsId + * @return 全部skuId的集合 + */ + List getSkuIdsByGoodsId(String goodsId); + + /** + * 删除并且新增sku,即覆盖之前信息 + * + * @param goodsSkus 商品sku集合 + * @return + */ + boolean deleteAndInsertGoodsSkus(List goodsSkus); + + /** + * 统计sku总数 + * + * @param storeId 店铺id + * @return sku总数 + */ + Long countSkuNum(String storeId); + + /** + * 批量渲染商品sku + * + * @param goodsSkuList SKU基础数据列表 + * @param goodsOperationDTO 商品操作信息 + */ + void renderGoodsSkuList(List goodsSkuList, GoodsOperationDTO goodsOperationDTO); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsUnitService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsUnitService.java index 3b4e2cf3..d8030c25 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsUnitService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsUnitService.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 商品计量单位业务层 * * @author Bulbasaur - * @date: 2020/11/26 16:12 + * @since 2020/11/26 16:12 */ public interface GoodsUnitService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/goods/service/ParametersService.java b/framework/src/main/java/cn/lili/modules/goods/service/ParametersService.java index 6c438b22..fa5fdf80 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/ParametersService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/ParametersService.java @@ -7,8 +7,18 @@ import com.baomidou.mybatisplus.extension.service.IService; * 商品参数业务层 * * @author pikachu - * @date 2020-03-02 16:18:56 + * @since 2020-03-02 16:18:56 */ public interface ParametersService extends IService { + + + /** + * 更新参数组信息 + * + * @param parameters 参数组信息 + * @return 是否更新成功 + */ + boolean updateParameter(Parameters parameters); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/SpecValuesService.java b/framework/src/main/java/cn/lili/modules/goods/service/SpecValuesService.java deleted file mode 100644 index c4947e5c..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/service/SpecValuesService.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.lili.modules.goods.service; - -import cn.lili.common.vo.PageVO; -import cn.lili.modules.goods.entity.dos.SpecValues; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - - -/** - * 规格项接口 - * - * @author pikachu - * @date 2020-02-18 15:18:56 - */ -public interface SpecValuesService extends IService { - - /** - * 保存规格值 - * - * @param specId 规格Id - * @param valueList 规格值集合 - */ - List saveSpecValue(String specId, String[] valueList); - - /** - * 保存规格值 - * - * @param specId 规格Id - * @param valueList 规格值集合 - */ - List addSpecValue(String specId, String[] valueList); - - /** - * 根据规格id查询规格值信息 - * - * @param specIds 规格值ids - * @return - */ - List getSpecValues(List specIds); - - /** - * 根据值获取规格值信息 - * 如果不存在则自动创建 - * - * @param specValue 规格值 - * @param specId 规格ID - * @return 规格值信息 - */ - SpecValues getSpecValues(String specValue, String specId); - - /** - * 分页获取规格值 - * - * @param specId 规格项ID - * @param specVal 规格值 - * @param pageVo 分页参数 - * @return 规格值列表 - */ - IPage queryByParams(String specId, String specVal, PageVO pageVo); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/service/SpecificationService.java b/framework/src/main/java/cn/lili/modules/goods/service/SpecificationService.java index 2d86c38c..8ebdfc00 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/SpecificationService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/SpecificationService.java @@ -1,83 +1,19 @@ package cn.lili.modules.goods.service; -import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.Specification; -import cn.lili.modules.goods.entity.dto.SpecificationSearchParams; -import cn.lili.modules.goods.entity.vos.GoodsSpecValueVO; -import cn.lili.modules.goods.entity.vos.SpecificationVO; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; -import java.util.Map; /** * 规格业务层 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ public interface SpecificationService extends IService { - /** - * 查询规格信息列表 - * - * @param param 查询参数 - * @return 规格列表 - */ - List getSpecList(Map param); - - /** - * 根据分类id获取规格信息 - * - * @param categoryId 分类id - * @return 商品规格值列表 - */ - List getGoodsSpecValue(String categoryId); - - /** - * 获取规格详情 - * - * @param id 规格ID - * @return 规格详情 - */ - Specification getSpecification(String id); - - /** - * 获取规格分页 - * - * @param searchParams 搜索参数 - * @param pageVo 分页参数 - * @return 规格分页 - */ - IPage getSpecificationPage(SpecificationSearchParams searchParams, PageVO pageVo); - - /** - * 获取规格分页 - * - * @param searchParams 搜索参数 - * @param pageVo 分页参数 - * @return 规格分页 - */ - IPage getSpecificationByPage(SpecificationSearchParams searchParams, PageVO pageVo); - - /** - * 添加规格 - * - * @param specificationVO 规格信息 - * @return 是否添加成功 - */ - Specification addSpecification(SpecificationVO specificationVO); - - /** - * 修改规格 - * - * @param specificationVO 规格信息 - * @return 是否修改成功 - */ - boolean updateSpecification(SpecificationVO specificationVO); - /** * 删除规格 * diff --git a/framework/src/main/java/cn/lili/modules/store/service/StoreGoodsLabelService.java b/framework/src/main/java/cn/lili/modules/goods/service/StoreGoodsLabelService.java similarity index 63% rename from framework/src/main/java/cn/lili/modules/store/service/StoreGoodsLabelService.java rename to framework/src/main/java/cn/lili/modules/goods/service/StoreGoodsLabelService.java index 7ba4c0f9..0bf6799d 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/StoreGoodsLabelService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/StoreGoodsLabelService.java @@ -1,16 +1,17 @@ -package cn.lili.modules.store.service; +package cn.lili.modules.goods.service; -import cn.lili.modules.store.entity.dos.StoreGoodsLabel; -import cn.lili.modules.store.entity.vos.StoreGoodsLabelVO; +import cn.lili.modules.goods.entity.dos.StoreGoodsLabel; +import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; /** * 店铺商品分类业务层 * * @author Bulbasaur - * @date 2020-03-07 09:24:33 + * @since 2020-03-07 09:24:33 */ public interface StoreGoodsLabelService extends IService { @@ -23,11 +24,20 @@ public interface StoreGoodsLabelService extends IService { List listByStoreId(String storeId); /** - * 获取当前店铺的店铺分类列表 + * 根据分类id集合获取所有店铺分类根据层级排序 * + * @param ids 商家ID * @return 店铺分类列表 */ - List listByStore(); + List listByStoreIds(List ids); + + /** + * 根据分类id集合获取所有店铺分类根据层级排序 + * + * @param ids 商家ID + * @return 店铺分类列表 + */ + List> listMapsByStoreIds(List ids, String columns); /** * 添加商品分类 diff --git a/framework/src/main/java/cn/lili/modules/goods/service/StudioCommodityService.java b/framework/src/main/java/cn/lili/modules/goods/service/StudioCommodityService.java new file mode 100644 index 00000000..87181eb6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/service/StudioCommodityService.java @@ -0,0 +1,13 @@ +package cn.lili.modules.goods.service; + +import cn.lili.modules.goods.entity.dos.StudioCommodity; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 直播间-商品关联业务层 + * + * @author Bulbasaur + * @since 2021/5/17 3:19 下午 + */ +public interface StudioCommodityService extends IService { +} diff --git a/framework/src/main/java/cn/lili/modules/goods/service/StudioService.java b/framework/src/main/java/cn/lili/modules/goods/service/StudioService.java new file mode 100644 index 00000000..2d783800 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/service/StudioService.java @@ -0,0 +1,80 @@ +package cn.lili.modules.goods.service; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.Studio; +import cn.lili.modules.goods.entity.vos.StudioVO; +import cn.lili.trigger.message.BroadcastMessage; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 直播间业务层 + * + * @author Bulbasaur + * @since 2021/5/17 10:02 上午 + */ +public interface StudioService extends IService { + + /** + * 创建直播间 + * 直播间默认手机直播 + * 默认开启:点赞、商品货架、评论、回放 + * @param studio 直播间 + * @return 开启状态 + */ + Boolean create(Studio studio); + + /** + * 修改直播间 + * 直播间默认手机直播 + * @param studio 直播间 + * @return 修改状态 + */ + Boolean edit(Studio studio); + + /** + * 获取直播间信息 + * @param id 直播间ID + * @return 直播间VO + */ + StudioVO getStudioVO(String id); + + /** + * 获取直播间回放 + * @param roomId 房间ID + * @return 直播间回放地址 + */ + String getLiveInfo(Integer roomId); + + /** + * 推送商品 + * @param roomId 房间ID + * @param goodsId 商品ID + * @param storeId 店铺ID + * @return 操作结果 + */ + Boolean push(Integer roomId,Integer liveGoodsId, String storeId, String goodsId); + + /** + * 删除商品 + * @param roomId 店铺ID + * @param goodsId 商品ID + * @return 操作结果 + */ + Boolean goodsDeleteInRoom(Integer roomId,Integer goodsId, String storeId); + + /** + * 获取直播间列表 + * @param pageVO 分页 + * @param recommend 是否推荐 + * @param status 直播间状态 + * @return 直播间分页 + */ + IPage studioList(PageVO pageVO, Integer recommend, String status); + + /** + * 修改直播间状态 + * @param broadcastMessage 直播间消息 + */ + void updateStudioStatus(BroadcastMessage broadcastMessage); +} diff --git a/framework/src/main/java/cn/lili/modules/goods/service/WholesaleService.java b/framework/src/main/java/cn/lili/modules/goods/service/WholesaleService.java new file mode 100644 index 00000000..b1a3164c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/service/WholesaleService.java @@ -0,0 +1,33 @@ +package cn.lili.modules.goods.service; + +import cn.lili.modules.goods.entity.dos.Wholesale; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * @author paulG + * @since 2022/5/24 + **/ +public interface WholesaleService extends IService { + + + List findByGoodsId(String goodsId); + + List findByTemplateId(String templateId); + + Boolean removeByGoodsId(String goodsId); + + + Boolean removeByTemplateId(String templateId); + + /** + * 匹配批发规则 + * + * @param goodsId 商品规则 + * @param num 数量 + * @return 批发规则 + */ + Wholesale match(String goodsId, Integer num); + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/BrandServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/BrandServiceImpl.java index 3d567979..6bee71f3 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/BrandServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/BrandServiceImpl.java @@ -1,25 +1,29 @@ package cn.lili.modules.goods.serviceimpl; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.PageUtil; import cn.lili.modules.goods.entity.dos.Brand; import cn.lili.modules.goods.entity.dos.CategoryBrand; +import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dto.BrandPageDTO; import cn.lili.modules.goods.entity.vos.BrandVO; import cn.lili.modules.goods.mapper.BrandMapper; import cn.lili.modules.goods.service.BrandService; import cn.lili.modules.goods.service.CategoryBrandService; +import cn.lili.modules.goods.service.CategoryService; +import cn.lili.modules.goods.service.GoodsService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @@ -27,14 +31,22 @@ import java.util.stream.Collectors; * 商品品牌业务层实现 * * @author pikachu - * @date 2020-02-18 16:18:56 + * @since 2020-02-18 16:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class BrandServiceImpl extends ServiceImpl implements BrandService { - //分类品牌绑定 - private final CategoryBrandService categoryBrandService; + + /** + * 分类品牌绑定 + */ + @Autowired + private CategoryBrandService categoryBrandService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private GoodsService goodsService; @Override public IPage getBrandsByPage(BrandPageDTO page) { @@ -57,11 +69,19 @@ public class BrandServiceImpl extends ServiceImpl implements return new ArrayList<>(); } + @Override + public List> getBrandsMapsByCategory(List categoryIds, String columns) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(columns); + queryWrapper.in("id", categoryIds); + return this.listMaps(queryWrapper); + } + @Override public boolean addBrand(BrandVO brandVO) { if (getOne(new LambdaQueryWrapper().eq(Brand::getName, brandVO.getName())) != null) { - throw new ServiceException("品牌名称重复!"); + throw new ServiceException(ResultCode.BRAND_NAME_EXIST_ERROR); } return this.save(brandVO); } @@ -70,7 +90,7 @@ public class BrandServiceImpl extends ServiceImpl implements public boolean updateBrand(BrandVO brandVO) { this.checkExist(brandVO.getId()); if (getOne(new LambdaQueryWrapper().eq(Brand::getName, brandVO.getName()).ne(Brand::getId, brandVO.getId())) != null) { - throw new ServiceException("品牌名称重复!"); + throw new ServiceException(ResultCode.BRAND_NAME_EXIST_ERROR); } return this.updateById(brandVO); } @@ -78,18 +98,57 @@ public class BrandServiceImpl extends ServiceImpl implements @Override public boolean brandDisable(String brandId, boolean disable) { Brand brand = this.checkExist(brandId); - if (Boolean.TRUE.equals(disable) && !categoryBrandService.getCategoryBrandListByBrandId(brandId).isEmpty()) { - throw new ServiceException("当前品牌下存在分类不可禁用"); + //如果是要禁用,则需要先判定绑定关系 + if (Boolean.TRUE.equals(disable)) { + List ids = new ArrayList<>(); + ids.add(brandId); + checkBind(ids); } brand.setDeleteFlag(disable); return updateById(brand); } + @Override + public void deleteBrands(List ids) { + checkBind(ids); + this.removeByIds(ids); + } + + + /** + * 校验绑定关系 + * + * @param brandIds 品牌Ids + */ + private void checkBind(List brandIds) { + //分了绑定关系查询 + List categoryBrands = categoryBrandService.getCategoryBrandListByBrandId(brandIds); + if (!categoryBrands.isEmpty()) { + List categoryIds = categoryBrands.stream().map(CategoryBrand::getCategoryId).collect(Collectors.toList()); + throw new ServiceException(ResultCode.BRAND_USE_DISABLE_ERROR, + JSONUtil.toJsonStr(categoryService.getCategoryNameByIds(categoryIds))); + } + + //分了商品绑定关系查询 + List goods = goodsService.getByBrandIds(brandIds); + if (!goods.isEmpty()) { + List goodsNames = goods.stream().map(Goods::getGoodsName).collect(Collectors.toList()); + throw new ServiceException(ResultCode.BRAND_BIND_GOODS_ERROR, + JSONUtil.toJsonStr(goodsNames)); + } + } + + /** + * 校验是否存在 + * + * @param brandId 品牌ID + * @return 品牌 + */ private Brand checkExist(String brandId) { Brand brand = getById(brandId); if (brand == null) { log.error("品牌ID为" + brandId + "的品牌不存在"); - throw new ServiceException(); + throw new ServiceException(ResultCode.BRAND_NOT_EXIST); } return brand; } diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java index d4fe044b..7374868f 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java @@ -7,38 +7,48 @@ import cn.lili.modules.goods.service.CategoryBrandService; 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 lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; /** * 规格项业务层实现 * * @author pikachu - * @date 2020-02-18 16:18:56 + * @since 2020-02-18 16:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CategoryBrandServiceImpl extends ServiceImpl implements CategoryBrandService { - //分类品牌绑定 - private final CategoryBrandMapper categoryBrandMapper; @Override public List getCategoryBrandList(String categoryId) { - return categoryBrandMapper.getCategoryBrandList(categoryId); + return this.baseMapper.getCategoryBrandList(categoryId); } @Override public void deleteByCategoryId(String categoryId) { - categoryBrandMapper.delete(new LambdaUpdateWrapper().eq(CategoryBrand::getCategoryId, categoryId)); + this.baseMapper.delete(new LambdaUpdateWrapper().eq(CategoryBrand::getCategoryId, categoryId)); } @Override - public List getCategoryBrandListByBrandId(String brandId) { - return this.list(new LambdaQueryWrapper().eq(CategoryBrand::getBrandId, brandId)); + public List getCategoryBrandListByBrandId(List brandId) { + return this.list(new LambdaQueryWrapper().in(CategoryBrand::getBrandId, brandId)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveCategoryBrandList(String categoryId, List brandIds) { + //删除分类品牌绑定信息 + this.deleteByCategoryId(categoryId); + //绑定品牌信息 + if (!brandIds.isEmpty()) { + List categoryBrands = new ArrayList<>(); + for (String brandId : brandIds) { + categoryBrands.add(new CategoryBrand(categoryId, brandId)); + } + this.saveBatch(categoryBrands); + } } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryParameterGroupServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryParameterGroupServiceImpl.java index 13ed9b7d..9d5ab172 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryParameterGroupServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryParameterGroupServiceImpl.java @@ -1,14 +1,21 @@ package cn.lili.modules.goods.serviceimpl; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; import cn.lili.modules.goods.entity.dos.CategoryParameterGroup; +import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dos.Parameters; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import cn.lili.modules.goods.entity.vos.ParameterGroupVO; import cn.lili.modules.goods.mapper.CategoryParameterGroupMapper; import cn.lili.modules.goods.service.CategoryParameterGroupService; +import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.goods.service.ParametersService; +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.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,6 +24,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 分类绑定参数组接口实现 @@ -27,11 +35,15 @@ import java.util.Map; * 2020-03-02 16:45:03 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CategoryParameterGroupServiceImpl extends ServiceImpl implements CategoryParameterGroupService { - //商品参数 - private final ParametersService parametersService; + /** + * 商品参数 + */ + @Autowired + private ParametersService parametersService; + + @Autowired + private GoodsService goodsService; @Override public List getCategoryParams(String categoryId) { @@ -48,12 +60,48 @@ public class CategoryParameterGroupServiceImpl extends ServiceImpl().eq("category_id", categoryId)); } + /** + * 更新分类参数组绑定信息 + * + * @param categoryParameterGroup 分类参数组信息 + * @return 是否成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateCategoryGroup(CategoryParameterGroup categoryParameterGroup) { + CategoryParameterGroup origin = this.getById(categoryParameterGroup.getId()); + if (origin == null) { + throw new ServiceException(ResultCode.CATEGORY_PARAMETER_NOT_EXIST); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(Goods::getId, Goods::getParams); + queryWrapper.like(Goods::getParams, origin.getId()); + List> goodsList = this.goodsService.listMaps(queryWrapper); + + for (Map goods : goodsList) { + String params = (String) goods.get("params"); + List goodsParamsDTOS = JSONUtil.toList(params, GoodsParamsDTO.class); + List goodsParamsDTOList = goodsParamsDTOS.stream().filter(i -> i.getGroupId() != null && i.getGroupId().equals(origin.getId())).collect(Collectors.toList()); + for (GoodsParamsDTO goodsParamsDTO : goodsParamsDTOList) { + goodsParamsDTO.setGroupName(categoryParameterGroup.getGroupName()); + } + this.goodsService.updateGoodsParams(goods.get("id").toString(), JSONUtil.toJsonStr(goodsParamsDTOS)); + } + + return this.updateById(categoryParameterGroup); + } + + @Override + public void deleteByCategoryId(String categoryId) { + this.baseMapper.delete(new LambdaUpdateWrapper().eq(CategoryParameterGroup::getCategoryId, categoryId)); + } + /** * 拼装参数组和参数的返回值 * * @param groupList 参数组list * @param paramList 商品参数list - * @return + * @return 参数组和参数的返回值 */ public List convertParamList(List groupList, List paramList) { Map> map = new HashMap<>(paramList.size()); diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java index dfd6f47e..1095544a 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java @@ -1,24 +1,32 @@ package cn.lili.modules.goods.serviceimpl; -import cn.hutool.core.util.StrUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.goods.entity.dos.Category; -import cn.lili.modules.goods.entity.dos.CategoryParameterGroup; import cn.lili.modules.goods.entity.vos.CategoryVO; -import cn.lili.modules.goods.entity.vos.GoodsParamsGroupVO; -import cn.lili.modules.goods.entity.vos.GoodsParamsVO; import cn.lili.modules.goods.mapper.CategoryMapper; +import cn.lili.modules.goods.service.CategoryBrandService; +import cn.lili.modules.goods.service.CategoryParameterGroupService; import cn.lili.modules.goods.service.CategoryService; +import cn.lili.modules.goods.service.CategorySpecificationService; +import cn.lili.rocketmq.tags.GoodsTagsEnum; 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.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,52 +38,97 @@ import java.util.stream.Collectors; * 商品分类业务层实现 * * @author pikachu - * @date 2020-02-23 15:18:56 + * @since 2020-02-23 15:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@CacheConfig(cacheNames = "{CATEGORY}") public class CategoryServiceImpl extends ServiceImpl implements CategoryService { private static final String DELETE_FLAG_COLUMN = "delete_flag"; - //缓存 - private final Cache cache; - //分类 - private final CategoryMapper categoryMapper; + /** + * 缓存 + */ + @Autowired + private Cache cache; + + @Autowired + private CategoryBrandService categoryBrandService; + + @Autowired + private CategoryParameterGroupService categoryParameterGroupService; + + @Autowired + private CategorySpecificationService categorySpecificationService; + + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * rocketMq配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; @Override public List dbList(String parentId) { return this.list(new LambdaQueryWrapper().eq(Category::getParentId, parentId)); } + @Override + @Cacheable(key = "#id") + public Category getCategoryById(String id) { + return this.getById(id); + } + + /** + * 根据分类id集合获取所有分类根据层级排序 + * + * @param ids 分类ID集合 + * @return 商品分类列表 + */ + @Override + public List listByIdsOrderByLevel(List ids) { + return this.list(new LambdaQueryWrapper().in(Category::getId, ids).orderByAsc(Category::getLevel)); + } + + @Override + public List> listMapsByIdsOrderByLevel(List ids, String columns) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(columns); + queryWrapper.in("id", ids).orderByAsc("level"); + return this.listMaps(queryWrapper); + } + @Override public List categoryTree() { - if (cache.hasKey(CachePrefix.CATEGORY.getPrefix() + "tree")) { - return (List) cache.get(CachePrefix.CATEGORY.getPrefix() + "tree"); + List categoryVOList = (List) cache.get(CachePrefix.CATEGORY.getPrefix()); + if (categoryVOList != null) { + return categoryVOList; } - // 获取全部分类 + //获取全部分类 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Category::getDeleteFlag, false); List list = this.list(queryWrapper); - // 构造分类树 - List categoryVOList = new ArrayList<>(); + //构造分类树 + categoryVOList = new ArrayList<>(); for (Category category : list) { - if (category.getParentId().equals("0")) { + if ("0".equals(category.getParentId())) { CategoryVO categoryVO = new CategoryVO(category); categoryVO.setChildren(findChildren(list, categoryVO)); categoryVOList.add(categoryVO); } } - categoryVOList.sort(new Comparator() { - @Override - public int compare(CategoryVO o1, CategoryVO o2) { - return o1.getSortOrder().compareTo(o2.getSortOrder()); - } - }); - if (categoryVOList.size() != 0) { - cache.put(CachePrefix.CATEGORY.getPrefix() + "tree", categoryVOList); + categoryVOList.sort(Comparator.comparing(Category::getSortOrder)); + if (!categoryVOList.isEmpty()) { + cache.put(CachePrefix.CATEGORY.getPrefix(), categoryVOList); + cache.put(CachePrefix.CATEGORY_ARRAY.getPrefix(), list); } return categoryVOList; } @@ -83,22 +136,20 @@ public class CategoryServiceImpl extends ServiceImpl i @Override public List getStoreCategory(String[] categories) { List arr = Arrays.asList(categories.clone()); - List categoryVOS = categoryTree().stream() + return categoryTree().stream() .filter(item -> arr.contains(item.getId())).collect(Collectors.toList()); - return categoryVOS; - } @Override public List firstCategory() { - QueryWrapper queryWrapper = Wrappers.query(); + QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.eq("level", 0); return list(queryWrapper); } @Override public List listAllChildren(String parentId) { - if (parentId.equals("0")) { + if ("0".equals(parentId)) { return categoryTree(); } //循环代码,找到对象,把他的子分类返回 @@ -106,33 +157,29 @@ public class CategoryServiceImpl extends ServiceImpl i for (CategoryVO item : topCatList) { if (item.getId().equals(parentId)) { return item.getChildren(); + } else { + return getChildren(parentId, item.getChildren()); } - return getChildren(parentId, item.getChildren()); } return new ArrayList<>(); } @Override - public List listAllChildrenDB() { + public List listAllChildren() { - // 获取全部分类 + //获取全部分类 List list = this.list(); - // 构造分类树 + //构造分类树 List categoryVOList = new ArrayList<>(); for (Category category : list) { - if (category.getParentId().equals("0")) { + if (("0").equals(category.getParentId())) { CategoryVO categoryVO = new CategoryVO(category); categoryVO.setChildren(findChildren(list, categoryVO)); categoryVOList.add(categoryVO); } } - categoryVOList.sort(new Comparator() { - @Override - public int compare(CategoryVO o1, CategoryVO o2) { - return o1.getSortOrder().compareTo(o2.getSortOrder()); - } - }); + categoryVOList.sort(Comparator.comparing(Category::getSortOrder)); return categoryVOList; } @@ -144,62 +191,100 @@ public class CategoryServiceImpl extends ServiceImpl i */ @Override public List getCategoryNameByIds(List ids) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(Category::getId, ids); - return this.baseMapper.getNamesByIds(queryWrapper); + List categoryName = new ArrayList<>(); + List categoryVOList = (List) cache.get(CachePrefix.CATEGORY_ARRAY.getPrefix()); + //如果缓存中为空,则重新获取缓存 + if (categoryVOList == null) { + categoryTree(); + categoryVOList = (List) cache.get(CachePrefix.CATEGORY_ARRAY.getPrefix()); + } + //还为空的话,直接返回 + if (categoryVOList == null) { + return new ArrayList<>(); + } + //循环顶级分类 + for (Category category : categoryVOList) { + //循环查询的id匹配 + for (String id : ids) { + if (category.getId().equals(id)) { + //写入商品分类 + categoryName.add(category.getName()); + } + } + } + return categoryName; } @Override public List findByAllBySortOrder(Category category) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq(category.getLevel() != null, "level", category.getLevel()) - .eq(StrUtil.isNotBlank(category.getName()), "name", category.getName()) + .eq(CharSequenceUtil.isNotBlank(category.getName()), "name", category.getName()) .eq(category.getParentId() != null, "parent_id", category.getParentId()) .ne(category.getId() != null, "id", category.getId()) .eq(DELETE_FLAG_COLUMN, false) .orderByAsc("sort_order"); - return this.categoryMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override + @Transactional(rollbackFor = Exception.class) public boolean saveCategory(Category category) { - if (category.getParentId() != null && !category.getParentId().equals("0")) { + //判断分类佣金是否正确 + if (category.getCommissionRate() < 0) { + throw new ServiceException(ResultCode.CATEGORY_COMMISSION_RATE_ERROR); + } + //子分类与父分类的状态一致 + if (category.getParentId() != null && !("0").equals(category.getParentId())) { Category parentCategory = this.getById(category.getParentId()); category.setDeleteFlag(parentCategory.getDeleteFlag()); } + this.save(category); removeCache(); return true; } @Override + @CacheEvict(key = "#category.id") + @Transactional(rollbackFor = Exception.class) public void updateCategory(Category category) { - if (category.getParentId() != null && !category.getParentId().equals("0")) { + //判断分类佣金是否正确 + if (category.getCommissionRate() < 0) { + throw new ServiceException(ResultCode.CATEGORY_COMMISSION_RATE_ERROR); + } + //判断父分类与子分类的状态是否一致 + if (category.getParentId() != null && !"0".equals(category.getParentId())) { Category parentCategory = this.getById(category.getParentId()); if (!parentCategory.getDeleteFlag().equals(category.getDeleteFlag())) { - throw new ServiceException("子类状态不能与父类不一致!"); + throw new ServiceException(ResultCode.CATEGORY_DELETE_FLAG_ERROR); } } UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", category.getId()) - .set("name", category.getName()) - .set("image", category.getImage()) - .set("sort_order", category.getSortOrder()) - .set(DELETE_FLAG_COLUMN, category.getDeleteFlag()) - .set("commission_rate", category.getCommissionRate()); - categoryMapper.update(category, updateWrapper); + updateWrapper.eq("id", category.getId()); + this.baseMapper.update(category, updateWrapper); removeCache(); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("同步商品分类名称", + rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.CATEGORY_GOODS_NAME.name(), category.getId())); } @Override + @CacheEvict(key = "#id") + @Transactional(rollbackFor = Exception.class) public void delete(String id) { this.removeById(id); removeCache(); + //删除关联关系 + categoryBrandService.deleteByCategoryId(id); + categoryParameterGroupService.deleteByCategoryId(id); + categorySpecificationService.deleteByCategoryId(id); } @Override + @CacheEvict(key = "#categoryId") + @Transactional(rollbackFor = Exception.class) public void updateCategoryStatus(String categoryId, Boolean enableOperations) { - // 禁用子分类 + //禁用子分类 CategoryVO categoryVO = new CategoryVO(this.getById(categoryId)); List ids = new ArrayList<>(); ids.add(categoryVO.getId()); @@ -241,44 +326,16 @@ public class CategoryServiceImpl extends ServiceImpl i LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Category::getParentId, category.getId()); List categories = this.list(queryWrapper); - List categoryVOS = new ArrayList<>(); + List categoryVOList = new ArrayList<>(); for (Category category1 : categories) { - categoryVOS.add(new CategoryVO(category1)); + categoryVOList.add(new CategoryVO(category1)); } - category.setChildren(categoryVOS); - if (!categoryVOS.isEmpty()) { - categoryVOS.forEach(this::findAllChild); + category.setChildren(categoryVOList); + if (!categoryVOList.isEmpty()) { + categoryVOList.forEach(this::findAllChild); } } - /** - * 拼装返回值 - * - * @param paramList 参数列表 - * @return 拼装后的返回值 - */ - private List convertParamList(List groupList, List paramList) { - Map> map = new HashMap<>(16); - for (GoodsParamsVO param : paramList) { - if (map.get(param.getGroupId()) != null) { - map.get(param.getGroupId()).add(param); - } else { - List list = new ArrayList<>(); - list.add(param); - map.put(param.getGroupId(), list); - } - } - List resList = new ArrayList<>(); - for (CategoryParameterGroup group : groupList) { - GoodsParamsGroupVO list = new GoodsParamsGroupVO(); - list.setGroupName(group.getGroupName()); - list.setGroupId(group.getId()); - list.setParams(map.get(group.getId())); - resList.add(list); - } - return resList; - } - /** * 获取所有的子分类ID * @@ -297,26 +354,27 @@ public class CategoryServiceImpl extends ServiceImpl i /** * 递归自身,找到id等于parentId的对象,获取他的children 返回 * - * @param parentId 父ID - * @param categoryVOS 分类VO + * @param parentId 父ID + * @param categoryVOList 分类VO * @return 子分类列表VO */ - private List getChildren(String parentId, List categoryVOS) { - for (CategoryVO item : categoryVOS) { + private List getChildren(String parentId, List categoryVOList) { + for (CategoryVO item : categoryVOList) { if (item.getId().equals(parentId)) { return item.getChildren(); } - if (item.getChildren() != null && item.getChildren().size() > 0) { - return getChildren(parentId, categoryVOS); + if (item.getChildren() != null && !item.getChildren().isEmpty()) { + return getChildren(parentId, item.getChildren()); } } - return null; + return categoryVOList; } /** * 清除缓存 */ private void removeCache() { - cache.remove(CachePrefix.CATEGORY.getPrefix() + "tree"); + cache.remove(CachePrefix.CATEGORY.getPrefix()); + cache.remove(CachePrefix.CATEGORY_ARRAY.getPrefix()); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java index 67f4d626..2ff12b2a 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java @@ -1,44 +1,31 @@ package cn.lili.modules.goods.serviceimpl; import cn.lili.modules.goods.entity.dos.CategorySpecification; -import cn.lili.modules.goods.entity.vos.CategorySpecificationVO; +import cn.lili.modules.goods.entity.dos.Specification; import cn.lili.modules.goods.mapper.CategorySpecificationMapper; import cn.lili.modules.goods.service.CategorySpecificationService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; import java.util.List; /** * 商品分类规格业务层实现 * * @author pikachu - * @date 2020-02-23 15:18:56 + * @since 2020-02-23 15:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CategorySpecificationServiceImpl extends ServiceImpl implements CategorySpecificationService { - private final CategorySpecificationMapper categorySpecificationMapper; - @Override - public List getCategorySpecList(String categoryId) { - return categorySpecificationMapper.getCategorySpecList(categoryId); - } - - @Override - public List getCategorySpecList(String[] categoryId) { - return this.list(new LambdaQueryWrapper().in(CategorySpecification::getCategoryId, Arrays.asList(categoryId))); + public List getCategorySpecList(String categoryId) { + return this.baseMapper.getCategorySpecList(categoryId); } @Override public void deleteByCategoryId(String categoryId) { - categorySpecificationMapper.delete(new LambdaQueryWrapper().eq(CategorySpecification::getCategoryId,categoryId)); + this.baseMapper.delete(new LambdaQueryWrapper().eq(CategorySpecification::getCategoryId, categoryId)); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CommodityServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CommodityServiceImpl.java new file mode 100644 index 00000000..0beff15b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CommodityServiceImpl.java @@ -0,0 +1,124 @@ +package cn.lili.modules.goods.serviceimpl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.Commodity; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dto.CommodityDTO; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.vos.CommodityVO; +import cn.lili.modules.goods.mapper.CommodityMapper; +import cn.lili.modules.goods.service.CommodityService; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.goods.util.WechatLivePlayerUtil; +import cn.lili.mybatis.util.PageUtil; +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.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + +/** + * 直播商品业务层实现 + * + * @author Bulbasaur + * @since 2021/5/17 11:16 上午 + */ +@Service +public class CommodityServiceImpl extends ServiceImpl implements CommodityService { + + @Autowired + private WechatLivePlayerUtil wechatLivePlayerUtil; + @Autowired + private GoodsSkuService goodsSkuService; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean addCommodity(List commodityList) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + for (Commodity commodity : commodityList) { + //检测直播商品 + checkCommodity(commodity); + commodity.setStoreId(storeId); + //添加直播商品 + JSONObject json = wechatLivePlayerUtil.addGoods(commodity); + if (!"0".equals(json.getStr("errcode"))) { + log.error(json.getStr("errmsg")); + throw new ServiceException(ResultCode.COMMODITY_ERROR); + } + commodity.setLiveGoodsId(Convert.toInt(json.getStr("goodsId"))); + commodity.setAuditId(json.getStr("auditId")); + //默认为待审核状态 + commodity.setAuditStatus("0"); + this.save(commodity); + } + return true; + } + + private void checkCommodity(Commodity commodity) { + //商品是否审核通过 + GoodsSku goodsSku = goodsSkuService.getById(commodity.getSkuId()); + if (!goodsSku.getAuthFlag().equals(GoodsAuthEnum.PASS.name())) { + throw new ServiceException(goodsSku.getGoodsName() + " 未审核通过,不能添加直播商品"); + } + //是否已添加规格商品 + if (this.count(new LambdaQueryWrapper().eq(Commodity::getSkuId, commodity.getSkuId())) > 0) { + throw new ServiceException(goodsSku.getGoodsName() + " 已添加规格商品,无法重复增加"); + } + } + + @Override + public boolean deleteCommodity(String goodsId) { + AuthUser currentUser = UserContext.getCurrentUser(); + if (currentUser == null || (currentUser.getRole().equals(UserEnums.STORE) && currentUser.getStoreId() == null)) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + JSONObject json = wechatLivePlayerUtil.deleteGoods(goodsId); + if ("0".equals(json.getStr("errcode"))) { + return this.remove(new LambdaQueryWrapper().eq(Commodity::getLiveGoodsId, goodsId).eq(Commodity::getStoreId, currentUser.getStoreId())); + } + return false; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void getGoodsWareHouse() { + //查询审核中的商品 + List goodsIdList = this.baseMapper.getAuditCommodity(); + if (!goodsIdList.isEmpty()) { + //同步状态 + JSONObject json = wechatLivePlayerUtil.getGoodsWareHouse(goodsIdList); + //修改状态 + List commodityDTOList = JSONUtil.toList((JSONArray) json.get("goods"), CommodityDTO.class); + for (CommodityDTO commodityDTO : commodityDTOList) { + //修改审核状态 + this.update(new LambdaUpdateWrapper() + .eq(Commodity::getLiveGoodsId, commodityDTO.getGoods_id()) + .set(Commodity::getAuditStatus, commodityDTO.getAudit_status())); + } + } + } + + @Override + public IPage commodityList(PageVO pageVO, String name, String auditStatus) { + return this.baseMapper.commodityVOList(PageUtil.initPage(pageVO), + new QueryWrapper().like(name != null, "c.name", name) + .eq(auditStatus != null, "c.audit_status", auditStatus) + .eq(Objects.requireNonNull(UserContext.getCurrentUser()).getRole().equals(UserEnums.STORE), "c.store_id", UserContext.getCurrentUser().getStoreId()) + .orderByDesc("create_time")); + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java index 6b674caf..facbfe4a 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java @@ -1,27 +1,25 @@ package cn.lili.modules.goods.serviceimpl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.modules.goods.entity.dos.*; -import cn.lili.modules.goods.entity.dto.DraftGoodsDTO; -import cn.lili.modules.goods.entity.dto.DraftGoodsSearchParams; +import cn.lili.modules.goods.entity.dto.*; import cn.lili.modules.goods.entity.vos.DraftGoodsVO; import cn.lili.modules.goods.mapper.DraftGoodsMapper; -import cn.lili.modules.goods.service.CategoryService; -import cn.lili.modules.goods.service.DraftGoodsService; -import cn.lili.modules.goods.service.GoodsGalleryService; -import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.goods.service.*; +import cn.lili.modules.goods.sku.GoodsSkuBuilder; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * 草稿商品业务层实现 @@ -30,21 +28,31 @@ import java.util.*; * @since 2020/12/19 **/ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DraftGoodsServiceImpl extends ServiceImpl implements DraftGoodsService { - //分类 - private final CategoryService categoryService; - //商品相册 - private final GoodsGalleryService goodsGalleryService; - //规格商品 - private final GoodsSkuService goodsSkuService; + /** + * 分类 + */ + @Autowired + private CategoryService categoryService; + /** + * 商品相册 + */ + @Autowired + private GoodsGalleryService goodsGalleryService; + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + + @Autowired + private WholesaleService wholesaleService; @Override public boolean addGoodsDraft(DraftGoodsDTO draftGoods) { draftGoods.setGoodsGalleryListJson(JSONUtil.toJsonStr(draftGoods.getGoodsGalleryList())); draftGoods.setSkuListJson(JSONUtil.toJsonStr(draftGoods.getSkuList())); - draftGoods.setGoodsParamsListJson(JSONUtil.toJsonStr(draftGoods.getGoodsParamsList())); + draftGoods.setGoodsParamsListJson(JSONUtil.toJsonStr(draftGoods.getGoodsParamsDTOList())); return this.save(draftGoods); } @@ -52,7 +60,7 @@ public class DraftGoodsServiceImpl extends ServiceImpl goodsSkus = GoodsSkuBuilder.buildBatch(new Goods(draftGoods), draftGoods.getSkuList()); + GoodsOperationDTO.GoodsOperationDTOBuilder goodsOperationDTOBuilder = GoodsOperationDTO.builder().goodsTemplateFlag(true).salesModel(draftGoods.getSalesModel()); + if (draftGoods.getWholesaleList() != null && !draftGoods.getWholesaleList().isEmpty()) { + + for (WholesaleDTO wholesaleDTO : draftGoods.getWholesaleList()) { + wholesaleDTO.setTemplateId(draftGoods.getId()); + } + goodsOperationDTOBuilder.wholesaleList(draftGoods.getWholesaleList()); + } + goodsSkuService.renderGoodsSkuList(goodsSkus, goodsOperationDTOBuilder.build()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(DraftGoods::getId, draftGoods.getId()); + updateWrapper.set(DraftGoods::getSkuListJson, JSONUtil.toJsonStr(goodsSkus)); + this.update(updateWrapper); + } } @Override public void deleteGoodsDraft(String id) { this.removeById(id); + this.wholesaleService.removeByTemplateId(id); } @Override @@ -90,11 +116,15 @@ public class DraftGoodsServiceImpl extends ServiceImpl list = JSONUtil.toList(jsonArray, GoodsSku.class); draftGoodsVO.setSkuList(goodsSkuService.getGoodsSkuVOList(list)); + List wholesaleList = wholesaleService.findByTemplateId(draftGoods.getId()); + if (CollUtil.isNotEmpty(wholesaleList)) { + draftGoodsVO.setWholesaleList(wholesaleList); + } return draftGoodsVO; } @@ -103,48 +133,4 @@ public class DraftGoodsServiceImpl extends ServiceImpl getGoodsSkuList(List> skuList) { - List skus = new ArrayList<>(); - for (Map skuVO : skuList) { - GoodsSku add = this.add(skuVO); - skus.add(add); - } - return skus; - } - - private GoodsSku add(Map map) { - Map specMap = new HashMap<>(); - GoodsSku sku = new GoodsSku(); - for (Map.Entry m : map.entrySet()) { - switch (m.getKey()) { - case "sn": - sku.setSn(m.getValue() != null ? m.getValue().toString() : ""); - break; - case "cost": - sku.setCost(StringUtils.toDouble(m.getValue(), false)); - break; - case "price": - sku.setPrice(StringUtils.toDouble(m.getValue(), false)); - break; - case "quantity": - sku.setQuantity(StringUtils.toInt(m.getValue(), false)); - break; - case "weight": - sku.setWeight(StringUtils.toDouble(m.getValue(), false)); - break; - default: - specMap.put(m.getKey(), m.getValue()); - break; - } - } - sku.setSpecs(JSONUtil.toJsonStr(specMap)); - return sku; - } - } diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsGalleryServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsGalleryServiceImpl.java index 40d9b220..34b71e08 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsGalleryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsGalleryServiceImpl.java @@ -1,7 +1,7 @@ package cn.lili.modules.goods.serviceimpl; import cn.hutool.json.JSONUtil; -import cn.lili.modules.file.plugin.FileManagerPlugin; +import cn.lili.modules.file.util.FileUtil; import cn.lili.modules.goods.entity.dos.GoodsGallery; import cn.lili.modules.goods.mapper.GoodsGalleryMapper; import cn.lili.modules.goods.service.GoodsGalleryService; @@ -10,9 +10,7 @@ import cn.lili.modules.system.entity.dto.GoodsSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,31 +26,29 @@ import java.util.List; * 2020-02-23 15:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsGalleryServiceImpl extends ServiceImpl implements GoodsGalleryService { - //文件 - private final FileManagerPlugin fileManagerPlugin; - //商品相册数据层 - private final GoodsGalleryMapper goodsGalleryMapper; - //设置 - private final SettingService settingService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; @Override + @Transactional(rollbackFor = Exception.class) public void add(List goodsGalleryList, String goodsId) { //删除原来商品相册信息 - this.goodsGalleryMapper.delete(new UpdateWrapper().eq("goods_id", goodsId)); + this.baseMapper.delete(new QueryWrapper().eq("goods_id", goodsId)); //确定好图片选择器后进行处理 int i = 0; for (String origin : goodsGalleryList) { - // 获取带所有缩略的相册 + //获取带所有缩略的相册 GoodsGallery galley = this.getGoodsGallery(origin); galley.setGoodsId(goodsId); - // 默认第一个为默认图片 + //默认第一个为默认图片 galley.setIsDefault(i == 0 ? 1 : 0); i++; - this.goodsGalleryMapper.insert(galley); + this.baseMapper.insert(galley); } } @@ -60,12 +56,12 @@ public class GoodsGalleryServiceImpl extends ServiceImpl goodsGalleryList(String goodsId) { //根据商品id查询商品相册 - return goodsGalleryMapper.selectList(new QueryWrapper().eq("goods_id", goodsId)); + return this.baseMapper.selectList(new QueryWrapper().eq("goods_id", goodsId)); + } + + /** + * 根据商品 id删除商品相册缩略图 + * + * @param goodsId 商品ID + */ + @Override + public void removeByGoodsId(String goodsId) { + this.baseMapper.delete(new QueryWrapper().eq("goods_id", goodsId)); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsImportServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsImportServiceImpl.java new file mode 100644 index 00000000..349ac5d9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsImportServiceImpl.java @@ -0,0 +1,290 @@ +package cn.lili.modules.goods.serviceimpl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.goods.entity.dos.Category; +import cn.lili.modules.goods.entity.dos.GoodsUnit; +import cn.lili.modules.goods.entity.dto.GoodsImportDTO; +import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; +import cn.lili.modules.goods.entity.vos.CategoryVO; +import cn.lili.modules.goods.service.CategoryService; +import cn.lili.modules.goods.service.GoodsImportService; +import cn.lili.modules.goods.service.GoodsService; +import cn.lili.modules.goods.service.GoodsUnitService; +import cn.lili.modules.store.entity.vos.FreightTemplateVO; +import cn.lili.modules.store.service.FreightTemplateService; +import cn.lili.modules.store.service.StoreDetailService; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hssf.usermodel.DVConstraint; +import org.apache.poi.hssf.usermodel.HSSFDataValidation; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.*; + +@Slf4j +@Service +public class GoodsImportServiceImpl implements GoodsImportService { + + @Autowired + private FreightTemplateService freightTemplateService; + @Autowired + private StoreDetailService storeDetailService; + @Autowired + private CategoryService categoryService; + @Autowired + private GoodsUnitService goodsUnitService; + @Autowired + private GoodsService goodsService; + + private static final int COLUMS = 15; + + @Override + public void download(HttpServletResponse response) { +// String storeId = "1376369067769724928"; + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + //创建Excel工作薄对象 + Workbook workbook = new HSSFWorkbook(); + //生成一个表格 设置:页签 + Sheet sheet = workbook.createSheet("导入模板"); + //创建第1行 + Row row0 = sheet.createRow(0); + row0.createCell(0).setCellValue("商品名称"); + row0.createCell(1).setCellValue("商品卖点"); + row0.createCell(2).setCellValue("商品分类"); + row0.createCell(3).setCellValue("运费模板"); + row0.createCell(4).setCellValue("计量单位"); + row0.createCell(5).setCellValue("发布状态"); + row0.createCell(6).setCellValue("商品图片"); + row0.createCell(7).setCellValue("成本价"); + row0.createCell(8).setCellValue("销售价"); + row0.createCell(9).setCellValue("库存"); + row0.createCell(10).setCellValue("重量"); + row0.createCell(11).setCellValue("货号"); + row0.createCell(12).setCellValue("详情"); + row0.createCell(13).setCellValue("规格项"); + row0.createCell(14).setCellValue("规格值"); + + + sheet.setColumnWidth(0, 7000); + sheet.setColumnWidth(1, 7000); + sheet.setColumnWidth(2, 7000); + sheet.setColumnWidth(3, 7000); + sheet.setColumnWidth(4, 7000); + sheet.setColumnWidth(5, 3000); + sheet.setColumnWidth(6, 7000); + sheet.setColumnWidth(7, 3000); + sheet.setColumnWidth(8, 3000); + sheet.setColumnWidth(9, 3000); + sheet.setColumnWidth(10, 3000); + sheet.setColumnWidth(11, 7000); + sheet.setColumnWidth(12, 7000); + sheet.setColumnWidth(13, 3000); + sheet.setColumnWidth(14, 3000); + + String goodsManagementCategory = storeDetailService.getStoreDetail(storeId).getGoodsManagementCategory(); + List categoryVOList = this.categoryService.getStoreCategory(goodsManagementCategory.split(",")); + List categoryNameList = new ArrayList<>(); + + //先简单写,后期优化 + //循环三次添加值 + //循环列表,存放ID-分类名称 + for (CategoryVO categoryVO1 : categoryVOList) { + for (CategoryVO categoryVO2 : categoryVO1.getChildren()) { + for (CategoryVO categoryVO3 : categoryVO2.getChildren()) { + categoryNameList.add(categoryVO3.getId() + "-" + categoryVO3.getName()); + } + } + } + + List freightTemplateNameList = new ArrayList<>(); + //循环列表,存放ID-运费模板名称 + for (FreightTemplateVO freightTemplateVO : freightTemplateService.getFreightTemplateList(storeId)) { + freightTemplateNameList.add(freightTemplateVO.getId() + "-" + freightTemplateVO.getName()); + } + + //获取计量单位 + List goodsUnitList = new ArrayList<>(); + List goodsUnitListVO = goodsUnitService.list(); + for (GoodsUnit goodsUnit : goodsUnitListVO) { + goodsUnitList.add(goodsUnit.getId() + "-" + goodsUnit.getName()); + } + + //添加分类 + this.excelTo255(workbook, "hiddenCategoryVO", 1, categoryNameList.toArray(new String[]{}), 1, 5000, 2, 2); + + //添加运费模板 + this.excelTo255(workbook, "hiddenFreightTemplateVO", 2, freightTemplateNameList.toArray(new String[]{}), 1, 5000, 3, 3); + + //添加计量单位 + this.excelTo255(workbook, "hiddenGoodsUnit", 3, goodsUnitList.toArray(new String[]{}), 1, 5000, 4, 4); + + //添加计量单位 + this.excelTo255(workbook, "hiddenRelease", 4, new String[]{"上架", "仓库中"}, 1, 5000, 5, 5); + + + ServletOutputStream out = null; + try { + //设置公共属性,列表名称 + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载商品导入模板", "UTF8") + ".xls"); + out = response.getOutputStream(); + workbook.write(out); + } catch (Exception e) { + log.error("下载商品导入模板错误", e); + } finally { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public void importExcel(MultipartFile files) throws Exception { + InputStream inputStream; + List goodsImportDTOList = new ArrayList<>(); + + inputStream = files.getInputStream(); + ExcelReader excelReader = ExcelUtil.getReader(inputStream); + // 读取列表 + // 检测数据-查看分类、模板、计量单位是否存在 + List> read = excelReader.read(1, excelReader.getRowCount()); + for (List objects : read) { + GoodsImportDTO goodsImportDTO = new GoodsImportDTO(); + if (objects.size() < COLUMS){ + throw new ServiceException("请将表格内容填写完全!"); + } + for (Object object : objects) { + if( CharSequenceUtil.isEmpty(object.toString()) || CharSequenceUtil.isBlank(object.toString())){ + throw new ServiceException("请将表格内容填写完全!"); + } + } + + String categoryId = objects.get(2).toString().substring(0, objects.get(2).toString().indexOf("-")); + + Category category = categoryService.getCategoryById(categoryId); + if (category == null) { + throw new ServiceException("商品分类不存在:" + objects.get(2).toString().substring(objects.get(2).toString().indexOf("-"))); + } + + String templateId = objects.get(3).toString().substring(0, objects.get(3).toString().indexOf("-")); + FreightTemplateVO freightTemplateVO = freightTemplateService.getFreightTemplate(templateId); + if (freightTemplateVO == null) { + throw new ServiceException("配送模板不存在:" + objects.get(3).toString().substring(objects.get(3).toString().indexOf("-"))); + } + + goodsImportDTO.setGoodsName(objects.get(0).toString()); + goodsImportDTO.setSellingPoint(objects.get(1).toString()); + goodsImportDTO.setCategory(category); + goodsImportDTO.setTemplate(templateId); + goodsImportDTO.setGoodsUnit(objects.get(4).toString().substring(objects.get(4).toString().indexOf("-") + 1)); + goodsImportDTO.setRelease(objects.get(5).toString().equals("上架") ? true : false); + + List> images = new ArrayList<>(); + List goodsGalleryList = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("url", objects.get(6).toString()); + images.add(map); + goodsGalleryList.add(objects.get(6).toString()); + goodsImportDTO.setImages(images); + goodsImportDTO.setGoodsGalleryList(goodsGalleryList); + + goodsImportDTO.setCost(Convert.toDouble(objects.get(7))); + goodsImportDTO.setPrice(Convert.toDouble(objects.get(8))); + goodsImportDTO.setQuantity(Convert.toInt(objects.get(9))); + goodsImportDTO.setWeight(Convert.toDouble(objects.get(10))); + goodsImportDTO.setSn(objects.get(11).toString()); + goodsImportDTO.setIntro("

" + objects.get(12).toString() + "

"); + goodsImportDTO.setSkuKey(objects.get(13).toString()); + goodsImportDTO.setSkuValue(objects.get(14).toString()); + goodsImportDTOList.add(goodsImportDTO); + } + //添加商品 + addGoodsList(goodsImportDTOList); + + } + + /** + * 添加商品 + * + * @param goodsImportDTOList + */ + private void addGoodsList(List goodsImportDTOList) { + + for (GoodsImportDTO goodsImportDTO : goodsImportDTOList) { + GoodsOperationDTO goodsOperationDTO = new GoodsOperationDTO(goodsImportDTO); + + //获取父 + Category parentCategory = categoryService.getCategoryById(goodsImportDTO.getCategory().getParentId()); + goodsOperationDTO.setCategoryPath(parentCategory.getParentId() + "," + parentCategory.getId() + "," + goodsImportDTO.getCategory().getParentId()); + //添加商品 + goodsService.addGoods(goodsOperationDTO); + } + + } + + /** + * 表格 + * + * @param workbook 表格 + * @param sheetName sheet名称 + * @param sheetNameIndex 开始 + * @param sheetData 数据 + * @param firstRow 开始行 + * @param lastRow 结束行 + * @param firstCol 开始列 + * @param lastCol 结束列 + */ + private void excelTo255(Workbook workbook, String sheetName, int sheetNameIndex, String[] sheetData, + int firstRow, int lastRow, int firstCol, int lastCol) { + //将下拉框数据放到新的sheet里,然后excle通过新的sheet数据加载下拉框数据 + Sheet hidden = workbook.createSheet(sheetName); + + //创建单元格对象 + Cell cell = null; + //遍历我们上面的数组,将数据取出来放到新sheet的单元格中 + for (int i = 0, length = sheetData.length; i < length; i++) { + //取出数组中的每个元素 + String name = sheetData[i]; + //根据i创建相应的行对象(说明我们将会把每个元素单独放一行) + Row row = hidden.createRow(i); + //创建每一行中的第一个单元格 + cell = row.createCell(0); + //然后将数组中的元素赋值给这个单元格 + cell.setCellValue(name); + } + // 创建名称,可被其他单元格引用 + Name namedCell = workbook.createName(); + namedCell.setNameName(sheetName); + // 设置名称引用的公式 + namedCell.setRefersToFormula(sheetName + "!$A$1:$A$" + (sheetData.length > 0 ? sheetData.length : 1)); + //加载数据,将名称为hidden的sheet中的数据转换为List形式 + DVConstraint constraint = DVConstraint.createFormulaListConstraint(sheetName); + + // 设置第一列的3-65534行为下拉列表 + // (3, 65534, 2, 2) ====> (起始行,结束行,起始列,结束列) + CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol); + // 将设置下拉选的位置和数据的对应关系 绑定到一起 + DataValidation dataValidation = new HSSFDataValidation(regions, constraint); + + //将第二个sheet设置为隐藏 + workbook.setSheetHidden(sheetNameIndex, true); + //将数据赋给下拉列表 + workbook.getSheetAt(0).addValidationData(dataValidation); + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsParamsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsParamsServiceImpl.java deleted file mode 100644 index 144f1638..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsParamsServiceImpl.java +++ /dev/null @@ -1,115 +0,0 @@ -package cn.lili.modules.goods.serviceimpl; - -import cn.lili.modules.goods.entity.dos.CategoryParameterGroup; -import cn.lili.modules.goods.entity.dos.GoodsParams; -import cn.lili.modules.goods.entity.vos.GoodsParamsGroupVO; -import cn.lili.modules.goods.entity.vos.GoodsParamsVO; -import cn.lili.modules.goods.mapper.GoodsParamsMapper; -import cn.lili.modules.goods.service.CategoryParameterGroupService; -import cn.lili.modules.goods.service.GoodsParamsService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -/** - * 商品关联参数接口实现 - * - * @author pikachu - * @version v1.0 - * @since v1.0 - * 2020-02-23 15:18:56 - */ -@Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class GoodsParamsServiceImpl extends ServiceImpl implements GoodsParamsService { - //分类-参数绑定 - private final CategoryParameterGroupService categoryParameterGroupService; - - @Override - public void addParams(List paramList, String goodsId) { - //先删除现有商品参数 - this.remove(new UpdateWrapper().eq("goods_id", goodsId)); - //循环添加参数 - if (paramList != null) { - for (GoodsParams param : paramList) { - GoodsParams goodsParams = new GoodsParams(); - goodsParams.setGoodsId(goodsId); - goodsParams.setParamName(param.getParamName()); - goodsParams.setParamValue(param.getParamValue()); - goodsParams.setParamId(param.getId()); - this.save(goodsParams); - } - } - } - - @Override - public List getGoodsParamsByGoodsId(String goodsId) { - return this.list(new LambdaQueryWrapper().eq(GoodsParams::getGoodsId, goodsId)); - } - - /** - * 添加商品参数 - * - * @param goodsParamsVO 商品参数 - * @return 添加是否成功 - */ - @Override - public boolean addParams(GoodsParamsVO goodsParamsVO) { - return this.save(goodsParamsVO); - } - - @Override - public List paramList(String goodsId, String categoryId) { - return this.baseMapper.paramList(goodsId, categoryId); - } - - @Override - public List queryGoodsParams(String categoryId, String goodsId) { - //查询分类关联参数组 - List groupList = categoryParameterGroupService.getCategoryGroup(categoryId); - //查询商品参数 - List paramList = this.paramList(goodsId, categoryId); - //拼装数据返回 - return this.convertParamList(groupList, paramList); - } - - - /** - * 拼装返回值 - * - * @param paramList - * @return - */ - private List convertParamList(List groupList, List paramList) { - Map> map = new HashMap<>(16); - for (GoodsParamsVO param : paramList) { - if (map.get(param.getGroupId()) != null) { - map.get(param.getGroupId()).add(param); - } else { - List list = new ArrayList<>(); - list.add(param); - map.put(param.getGroupId(), list); - } - } - List resList = new ArrayList<>(); - for (CategoryParameterGroup group : groupList) { - GoodsParamsGroupVO list = new GoodsParamsGroupVO(); - list.setGroupName(group.getGroupName()); - list.setGroupId(group.getId()); - list.setParams(map.get(group.getId())); - resList.add(list); - } - return resList; - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java index e4b355af..5bd264f0 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java @@ -1,21 +1,24 @@ package cn.lili.modules.goods.serviceimpl; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.GoodsTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.goods.entity.dos.Category; import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dos.GoodsGallery; +import cn.lili.modules.goods.entity.dos.Wholesale; import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import cn.lili.modules.goods.entity.dto.GoodsSearchParams; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; @@ -23,157 +26,214 @@ import cn.lili.modules.goods.entity.vos.GoodsSkuVO; import cn.lili.modules.goods.entity.vos.GoodsVO; import cn.lili.modules.goods.mapper.GoodsMapper; import cn.lili.modules.goods.service.*; +import cn.lili.modules.member.entity.dos.MemberEvaluation; +import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; +import cn.lili.modules.member.service.MemberEvaluationService; +import cn.lili.modules.store.entity.dos.FreightTemplate; +import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.vos.StoreVO; +import cn.lili.modules.store.service.FreightTemplateService; import cn.lili.modules.store.service.StoreService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.GoodsSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; 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.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; /** * 商品业务层实现 * * @author pikachu - * @date 2020-02-23 15:18:56 + * @since 2020-02-23 15:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsServiceImpl extends ServiceImpl implements GoodsService { - //商品 - private final GoodsMapper goodsMapper; - //商品属性 - private final GoodsParamsService goodsParamsService; - //分类 - private final CategoryService categoryService; - //设置 - private final SettingService settingService; - //商品相册 - private final GoodsGalleryService goodsGalleryService; - //商品规格 + + /** + * 分类 + */ + @Autowired + private CategoryService categoryService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; + /** + * 商品相册 + */ + @Autowired + private GoodsGalleryService goodsGalleryService; + /** + * 商品规格 + */ + @Autowired private GoodsSkuService goodsSkuService; - //店铺详情 + /** + * 店铺详情 + */ + @Autowired private StoreService storeService; - //rocketMq - private final RocketMQTemplate rocketMQTemplate; - //rocketMq配置 - private final RocketmqCustomProperties rocketmqCustomProperties; + /** + * 会员评价 + */ + @Autowired + private MemberEvaluationService memberEvaluationService; + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * rocketMq配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + @Autowired + private FreightTemplateService freightTemplateService; + + @Autowired + private WholesaleService wholesaleService; + + @Autowired + private Cache cache; @Override - public void underStoreGoods(String storeId) { - this.goodsMapper.underStoreGoods(storeId); + public List getByBrandIds(List brandIds) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(Goods::getBrandId, brandIds); + return list(lambdaQueryWrapper); } @Override - public final Integer getGoodsCountByCategory(String categoryId) { - QueryWrapper queryWrapper = Wrappers.query(); + @Transactional(rollbackFor = Exception.class) + public void underStoreGoods(String storeId) { + //获取商品ID列表 + List list = this.baseMapper.getGoodsIdByStoreId(storeId); + //下架店铺下的商品 + this.updateGoodsMarketAbleByStoreId(storeId, GoodsStatusEnum.DOWN, "店铺关闭"); + + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("下架商品", + rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.DOWN.name(), JSONUtil.toJsonStr(list))); + + } + + /** + * 更新商品参数 + * + * @param goodsId 商品id + * @param params 商品参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateGoodsParams(String goodsId, String params) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Goods::getId, goodsId); + updateWrapper.set(Goods::getParams, params); + this.update(updateWrapper); + } + + @Override + public final long getGoodsCountByCategory(String categoryId) { + QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.like("category_path", categoryId); + queryWrapper.eq("delete_flag", false); return this.count(queryWrapper); } @Override + @Transactional(rollbackFor = Exception.class) public void addGoods(GoodsOperationDTO goodsOperationDTO) { - Goods goods = new Goods(goodsOperationDTO); - - //判定商品是否需要审核 - this.checkNeedAuth(goods); - - // 向goods加入图片 - this.setGoodsGalleryParam(goodsOperationDTO.getGoodsGalleryList().get(0), goods); - - //商品添加卖家信息 - StoreVO storeDetail = this.storeService.getStoreDetail(); - goods.setStoreId(storeDetail.getId()); - goods.setStoreName(storeDetail.getStoreName()); - if (storeDetail.getSelfOperated() != null) { - goods.setSelfOperated(storeDetail.getSelfOperated()); + //检查商品 + this.checkGoods(goods); + //向goods加入图片 + if (goodsOperationDTO.getGoodsGalleryList().size() > 0 ) { + this.setGoodsGalleryParam(goodsOperationDTO.getGoodsGalleryList().get(0), goods); } - // 评论次数 - goods.setCommentNum(0); - // 购买次数 - goods.setBuyCount(0); - // 购买次数 - goods.setQuantity(0); - // 商品评分 - goods.setGrade(100.0); - + //添加商品参数 + if (goodsOperationDTO.getGoodsParamsDTOList() != null && !goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) { + //给商品参数填充值 + goods.setParams(JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList())); + } + //添加商品 this.save(goods); - - // 添加商品参数 - if (goodsOperationDTO.getGoodsParamsList() != null && !goodsOperationDTO.getGoodsParamsList().isEmpty()) { - this.goodsParamsService.addParams(goodsOperationDTO.getGoodsParamsList(), goods.getId()); - } - - // 添加商品sku信息 - this.goodsSkuService.add(goodsOperationDTO.getSkuList(), goods); - - // 添加相册 + //添加商品sku信息 + this.goodsSkuService.add(goods, goodsOperationDTO); + //添加相册 if (goodsOperationDTO.getGoodsGalleryList() != null && !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); } + this.generateEs(goods); } + @Override + @Transactional(rollbackFor = Exception.class) public void editGoods(GoodsOperationDTO goodsOperationDTO, String goodsId) { - this.checkExist(goodsId); Goods goods = new Goods(goodsOperationDTO); goods.setId(goodsId); - - //是否需要审核 - this.checkNeedAuth(goods); - - // 向goods加入图片 + //检查商品信息 + this.checkGoods(goods); + //向goods加入图片 this.setGoodsGalleryParam(goodsOperationDTO.getGoodsGalleryList().get(0), goods); - - //商品添加卖家信息 - StoreVO storeDetail = this.storeService.getStoreDetail(); - if (storeDetail.getSelfOperated() != null) { - goods.setSelfOperated(storeDetail.getSelfOperated()); + //添加商品参数 + if (goodsOperationDTO.getGoodsParamsDTOList() != null && !goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) { + goods.setParams(JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList())); } - goods.setStoreId(storeDetail.getId()); - goods.setStoreName(storeDetail.getStoreName()); - //修改商品 this.updateById(goods); - - // 添加商品参数 - this.goodsParamsService.addParams(goodsOperationDTO.getGoodsParamsList(), goods.getId()); - - //修改商品规格 - this.goodsSkuService.update(goodsOperationDTO.getSkuList(), goods, goodsOperationDTO.getRegeneratorSkuFlag()); - - // 添加相册 - this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); + //修改商品sku信息 + this.goodsSkuService.update(goods, goodsOperationDTO); + //添加相册 + if (goodsOperationDTO.getGoodsGalleryList() != null && !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { + this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); + } + if (GoodsAuthEnum.TOBEAUDITED.name().equals(goods.getAuthFlag())) { + this.deleteEsGoods(Collections.singletonList(goodsId)); + } + cache.remove(CachePrefix.GOODS.getPrefix() + goodsId); + this.generateEs(goods); } + @Override public GoodsVO getGoodsVO(String goodsId) { + //缓存获取,如果没有则读取缓存 + GoodsVO goodsVO = cache.get(CachePrefix.GOODS.getPrefix() + goodsId); + if (goodsVO != null) { + return goodsVO; + } //查询商品信息 Goods goods = this.getById(goodsId); if (goods == null) { log.error("商品ID为" + goodsId + "的商品不存在"); throw new ServiceException(ResultCode.GOODS_NOT_EXIST); } - GoodsVO goodsVO = new GoodsVO(); + goodsVO = new GoodsVO(); //赋值 BeanUtils.copyProperties(goods, goodsVO); //商品id @@ -185,7 +245,7 @@ public class GoodsServiceImpl extends ServiceImpl implements images.add(goodsGallery.getOriginal()); } goodsVO.setGoodsGalleryList(images); - // 商品sku赋值 + //商品sku赋值 List goodsListByGoodsId = goodsSkuService.getGoodsListByGoodsId(goodsId); if (goodsListByGoodsId != null && !goodsListByGoodsId.isEmpty()) { goodsVO.setSkuList(goodsListByGoodsId); @@ -200,8 +260,17 @@ public class GoodsServiceImpl extends ServiceImpl implements } goodsVO.setCategoryName(categoryName); - goodsVO.setGoodsParamsList(goodsParamsService.getGoodsParamsByGoodsId(goodsId)); + //参数非空则填写参数 + if (CharSequenceUtil.isNotEmpty(goods.getParams())) { + goodsVO.setGoodsParamsDTOList(JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class)); + } + List wholesaleList = wholesaleService.findByGoodsId(goodsId); + if (CollUtil.isNotEmpty(wholesaleList)) { + goodsVO.setWholesaleList(wholesaleList); + } + + cache.put(CachePrefix.GOODS.getPrefix() + goodsId, goodsVO); return goodsVO; } @@ -210,93 +279,155 @@ public class GoodsServiceImpl extends ServiceImpl implements return this.page(PageUtil.initPage(goodsSearchParams), goodsSearchParams.queryWrapper()); } + /** + * 商品查询 + * + * @param goodsSearchParams 查询参数 + * @return 商品信息 + */ @Override + public List queryListByParams(GoodsSearchParams goodsSearchParams) { + return this.list(goodsSearchParams.queryWrapper()); + } + + @Override + @Transactional(rollbackFor = Exception.class) public boolean auditGoods(List goodsIds, GoodsAuthEnum goodsAuthEnum) { + List goodsCacheKeys = new ArrayList<>(); boolean result = false; for (String goodsId : goodsIds) { Goods goods = this.checkExist(goodsId); - goods.setIsAuth(goodsAuthEnum.name()); + goods.setAuthFlag(goodsAuthEnum.name()); result = this.updateById(goods); goodsSkuService.updateGoodsSkuStatus(goods); + //删除之前的缓存 + goodsCacheKeys.add(CachePrefix.GOODS.getPrefix() + goodsId); //商品审核消息 String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GOODS_AUDIT.name(); //发送mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goods.getStoreId()), RocketmqSendCallbackBuilder.commonCallback()); + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goods), RocketmqSendCallbackBuilder.commonCallback()); } + cache.multiDel(goodsCacheKeys); return result; } @Override - public Integer goodsNum(GoodsStatusEnum goodsStatusEnum, GoodsAuthEnum goodsAuthEnum) { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - if (goodsStatusEnum != null) { - queryWrapper.eq(Goods::getMarketEnable, goodsStatusEnum.name()); - } - if (goodsAuthEnum != null) { - queryWrapper.eq(Goods::getIsAuth, goodsAuthEnum.name()); - } - queryWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), - Goods::getStoreId, UserContext.getCurrentUser().getStoreId()); - - return this.count(queryWrapper); - } - - @Override - public Integer todayUpperNum() { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name()); - queryWrapper.gt(Goods::getCreateTime, DateUtil.beginOfDay(new DateTime())); - return this.count(queryWrapper); - } - - @Override + @Transactional(rollbackFor = Exception.class) public Boolean updateGoodsMarketAble(List goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason) { - LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(); + boolean result; + + //如果商品为空,直接返回 + if (goodsIds == null || goodsIds.isEmpty()) { + return true; + } + + LambdaUpdateWrapper updateWrapper = this.getUpdateWrapperByStoreAuthority(); updateWrapper.set(Goods::getMarketEnable, goodsStatusEnum.name()); updateWrapper.set(Goods::getUnderMessage, underReason); updateWrapper.in(Goods::getId, goodsIds); - //商品审核通过的才可以上架 - updateWrapper.eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name()); - this.update(updateWrapper); + result = this.update(updateWrapper); //修改规格商品 - List goodsList = this.list(new LambdaQueryWrapper().in(Goods::getId, goodsIds)); - for (Goods goods : goodsList) { - goodsSkuService.updateGoodsSkuStatus(goods); - } - return true; + LambdaQueryWrapper queryWrapper = this.getQueryWrapperByStoreAuthority(); + queryWrapper.in(Goods::getId, goodsIds); + List goodsList = this.list(queryWrapper); + this.updateGoodsStatus(goodsIds, goodsStatusEnum, goodsList); + return result; + } + /** + * 更新商品上架状态状态 + * + * @param storeId 店铺ID + * @param goodsStatusEnum 更新的商品状态 + * @param underReason 下架原因 + * @return 更新结果 + */ + @Override + public Boolean updateGoodsMarketAbleByStoreId(String storeId, GoodsStatusEnum goodsStatusEnum, String underReason) { + + + LambdaUpdateWrapper updateWrapper = this.getUpdateWrapperByStoreAuthority(); + updateWrapper.set(Goods::getMarketEnable, goodsStatusEnum.name()); + updateWrapper.set(Goods::getUnderMessage, underReason); + updateWrapper.eq(Goods::getStoreId, storeId); + boolean result = this.update(updateWrapper); + + //修改规格商品 + this.goodsSkuService.updateGoodsSkuStatusByStoreId(storeId, goodsStatusEnum.name(), null); + return result; } @Override + @Transactional(rollbackFor = Exception.class) + public Boolean managerUpdateGoodsMarketAble(List goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason) { + boolean result; + + //如果商品为空,直接返回 + if (goodsIds == null || goodsIds.isEmpty()) { + return true; + } + + //检测管理员权限 + this.checkManagerAuthority(); + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(Goods::getMarketEnable, goodsStatusEnum.name()); + updateWrapper.set(Goods::getUnderMessage, underReason); + updateWrapper.in(Goods::getId, goodsIds); + result = this.update(updateWrapper); + + //修改规格商品 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(Goods::getId, goodsIds); + List goodsList = this.list(queryWrapper); + this.updateGoodsStatus(goodsIds, goodsStatusEnum, goodsList); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) public Boolean deleteGoods(List goodsIds) { - LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(); + LambdaUpdateWrapper updateWrapper = this.getUpdateWrapperByStoreAuthority(); updateWrapper.set(Goods::getMarketEnable, GoodsStatusEnum.DOWN.name()); updateWrapper.set(Goods::getDeleteFlag, true); updateWrapper.in(Goods::getId, goodsIds); this.update(updateWrapper); //修改规格商品 - List goodsList = this.list(new LambdaQueryWrapper().in(Goods::getId, goodsIds)); + LambdaQueryWrapper queryWrapper = this.getQueryWrapperByStoreAuthority(); + queryWrapper.in(Goods::getId, goodsIds); + List goodsList = this.list(queryWrapper); + List goodsCacheKeys = new ArrayList<>(); for (Goods goods : goodsList) { //修改SKU状态 goodsSkuService.updateGoodsSkuStatus(goods); - //商品删除消息 - String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GOODS_DELETE.name(); - //发送mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goods.getStoreId()), RocketmqSendCallbackBuilder.commonCallback()); + goodsCacheKeys.add(CachePrefix.GOODS.getPrefix() + goods.getId()); } - + //删除缓存 + cache.multiDel(goodsCacheKeys); + this.deleteEsGoods(goodsIds); return true; } @Override - public Boolean freight(List goodsIds, String freightPayer, String templateId) { + @Transactional(rollbackFor = Exception.class) + public Boolean freight(List goodsIds, String templateId) { + + AuthUser authUser = this.checkStoreAuthority(); + + FreightTemplate freightTemplate = freightTemplateService.getById(templateId); + if (freightTemplate == null) { + throw new ServiceException(ResultCode.FREIGHT_TEMPLATE_NOT_EXIST); + } + if (authUser != null && !freightTemplate.getStoreId().equals(authUser.getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); - lambdaUpdateWrapper.set(Goods::getFreightPayer, freightPayer); lambdaUpdateWrapper.set(Goods::getTemplateId, templateId); lambdaUpdateWrapper.in(Goods::getId, goodsIds); + cache.multiDel(goodsIds); return this.update(lambdaUpdateWrapper); } @@ -305,9 +436,138 @@ public class GoodsServiceImpl extends ServiceImpl implements LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.set(Goods::getQuantity, quantity); lambdaUpdateWrapper.eq(Goods::getId, goodsId); + cache.remove(CachePrefix.GOODS.getPrefix() + goodsId); this.update(lambdaUpdateWrapper); } + @Override + public void updateGoodsCommentNum(String goodsId) { + + //获取商品信息 + Goods goods = this.getById(goodsId); + //修改商品评价数量 + goods.setCommentNum(goods.getCommentNum() + 1); + + //修改商品好评率 + LambdaQueryWrapper goodEvaluationQueryWrapper = new LambdaQueryWrapper<>(); + goodEvaluationQueryWrapper.eq(MemberEvaluation::getId, goodsId); + goodEvaluationQueryWrapper.eq(MemberEvaluation::getGrade, EvaluationGradeEnum.GOOD.name()); + //好评数量 + long highPraiseNum = memberEvaluationService.count(goodEvaluationQueryWrapper); + //好评率 + double grade = NumberUtil.mul(NumberUtil.div(highPraiseNum, goods.getCommentNum().doubleValue(), 2), 100); + goods.setGrade(grade); + this.updateById(goods); + } + + /** + * 更新商品的购买数量 + * + * @param goodsId 商品ID + * @param buyCount 购买数量 + */ + @Override + public void updateGoodsBuyCount(String goodsId, int buyCount) { + this.update(new LambdaUpdateWrapper() + .eq(Goods::getId, goodsId) + .set(Goods::getBuyCount, buyCount)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStoreDetail(Store store) { + UpdateWrapper updateWrapper = new UpdateWrapper<>() + .eq("store_id", store.getId()) + .set("store_name", store.getStoreName()) + .set("self_operated", store.getSelfOperated()); + this.update(updateWrapper); + goodsSkuService.update(updateWrapper); + } + + @Override + public long countStoreGoodsNum(String storeId) { + return this.count( + new LambdaQueryWrapper() + .eq(Goods::getStoreId, storeId) + .eq(Goods::getDeleteFlag, Boolean.FALSE) + .eq(Goods::getAuthFlag, GoodsAuthEnum.PASS.name()) + .eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name())); + } + + @Override + public void categoryGoodsName(String categoryId) { + //获取分类下的商品 + List list = this.list(new LambdaQueryWrapper().like(Goods::getCategoryPath,categoryId)); + list.parallelStream().forEach(goods->{ + //移除redis中商品缓存 + cache.remove(CachePrefix.GOODS.getPrefix() + goods.getId()); + }); + } + + + /** + * 更新商品状态 + * + * @param goodsIds 商品ID + * @param goodsStatusEnum 商品状态 + * @param goodsList 商品列表 + */ + private void updateGoodsStatus(List goodsIds, GoodsStatusEnum goodsStatusEnum, List goodsList) { + List goodsCacheKeys = new ArrayList<>(); + for (Goods goods : goodsList) { + goodsCacheKeys.add(CachePrefix.GOODS.getPrefix() + goods.getId()); + goodsSkuService.updateGoodsSkuStatus(goods); + } + cache.multiDel(goodsCacheKeys); + + if (GoodsStatusEnum.DOWN.equals(goodsStatusEnum)) { + this.deleteEsGoods(goodsIds); + } else { + this.updateEsGoods(goodsIds); + } + + + //下架商品发送消息 + if (goodsStatusEnum.equals(GoodsStatusEnum.DOWN)) { + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("下架商品", + rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.DOWN.name(), JSONUtil.toJsonStr(goodsIds))); + } + } + + /** + * 发送生成ES商品索引 + * + * @param goods 商品信息 + */ + @Transactional + public void generateEs(Goods goods) { + // 不生成没有审核通过且没有上架的商品 + if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) { + return; + } + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("生成商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(), goods.getId())); + } + + /** + * 发送生成ES商品索引 + * + * @param goodsIds 商品id + */ + @Transactional + public void updateEsGoods(List goodsIds) { + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("更新商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.UPDATE_GOODS_INDEX.name(), goodsIds)); + } + + /** + * 发送删除es索引的信息 + * + * @param goodsIds 商品id + */ + @Transactional + public void deleteEsGoods(List goodsIds) { + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("删除商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.GOODS_DELETE.name(), JSONUtil.toJsonStr(goodsIds))); + } + /** * 添加商品默认图片 * @@ -322,25 +582,69 @@ public class GoodsServiceImpl extends ServiceImpl implements } /** - * 商品是否需要审核 + * 检查商品信息 + * 如果商品是虚拟商品则无需配置配送模板 + * 如果商品是实物商品需要配置配送模板 + * 判断商品是否存在 + * 判断商品是否需要审核 + * 判断当前用户是否为店铺 * * @param goods 商品 */ - private void checkNeedAuth(Goods goods) { + private void checkGoods(Goods goods) { + //判断商品类型 + switch (goods.getGoodsType()) { + case "PHYSICAL_GOODS": + if ("0".equals(goods.getTemplateId())) { + throw new ServiceException(ResultCode.PHYSICAL_GOODS_NEED_TEMP); + } + break; + case "VIRTUAL_GOODS": + if (!"0".equals(goods.getTemplateId())) { + goods.setTemplateId("0"); + } + break; + default: + throw new ServiceException(ResultCode.GOODS_TYPE_ERROR); + } + //检查商品是否存在--修改商品时使用 + if (goods.getId() != null) { + this.checkExist(goods.getId()); + } else { + //评论次数 + goods.setCommentNum(0); + //购买次数 + goods.setBuyCount(0); + //购买次数 + goods.setQuantity(0); + //商品评分 + goods.setGrade(100.0); + } + //获取商品系统配置决定是否审核 Setting setting = settingService.get(SettingEnum.GOODS_SETTING.name()); GoodsSetting goodsSetting = JSONUtil.toBean(setting.getSettingValue(), GoodsSetting.class); //是否需要审核 - goods.setIsAuth(Boolean.TRUE.equals(goodsSetting.getGoodsCheck()) ? GoodsAuthEnum.TOBEAUDITED.name() : GoodsAuthEnum.PASS.name()); - //自动下架 - goods.setMarketEnable(Boolean.TRUE.equals(goodsSetting.getGoodsCheck()) ? GoodsStatusEnum.DOWN.name() : GoodsStatusEnum.UPPER.name()); + goods.setAuthFlag(Boolean.TRUE.equals(goodsSetting.getGoodsCheck()) ? GoodsAuthEnum.TOBEAUDITED.name() : GoodsAuthEnum.PASS.name()); + //判断当前用户是否为店铺 + if (Objects.requireNonNull(UserContext.getCurrentUser()).getRole().equals(UserEnums.STORE)) { + StoreVO storeDetail = this.storeService.getStoreDetail(); + if (storeDetail.getSelfOperated() != null) { + goods.setSelfOperated(storeDetail.getSelfOperated()); + } + goods.setStoreId(storeDetail.getId()); + goods.setStoreName(storeDetail.getStoreName()); + goods.setSelfOperated(storeDetail.getSelfOperated()); + } else { + throw new ServiceException(ResultCode.STORE_NOT_LOGIN_ERROR); + } } /** * 判断商品是否存在 * - * @param goodsId - * @return + * @param goodsId 商品id + * @return 商品信息 */ private Goods checkExist(String goodsId) { Goods goods = getById(goodsId); @@ -351,13 +655,63 @@ public class GoodsServiceImpl extends ServiceImpl implements return goods; } - @Autowired - public void setGoodsSkuService(GoodsSkuService goodsSkuService) { - this.goodsSkuService = goodsSkuService; + + /** + * 获取UpdateWrapper(检查用户越权) + * + * @return updateWrapper + */ + private LambdaUpdateWrapper getUpdateWrapperByStoreAuthority() { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + AuthUser authUser = this.checkStoreAuthority(); + if (authUser != null) { + updateWrapper.eq(Goods::getStoreId, authUser.getStoreId()); + } + return updateWrapper; } - @Autowired - public void setStoreService(StoreService storeService) { - this.storeService = storeService; + + /** + * 检查当前登录的店铺 + * + * @return 当前登录的店铺 + */ + private AuthUser checkStoreAuthority() { + AuthUser currentUser = UserContext.getCurrentUser(); + //如果当前会员不为空,且为店铺角色 + if (currentUser != null && (currentUser.getRole().equals(UserEnums.STORE) && currentUser.getStoreId() != null)) { + return currentUser; + } + return null; } -} \ No newline at end of file + + /** + * 检查当前登录的店铺 + * + * @return 当前登录的店铺 + */ + private AuthUser checkManagerAuthority() { + AuthUser currentUser = UserContext.getCurrentUser(); + //如果当前会员不为空,且为店铺角色 + if (currentUser != null && (currentUser.getRole().equals(UserEnums.MANAGER))) { + return currentUser; + } else { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + } + + /** + * 获取QueryWrapper(检查用户越权) + * + * @return queryWrapper + */ + private LambdaQueryWrapper getQueryWrapperByStoreAuthority() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + AuthUser authUser = this.checkStoreAuthority(); + if (authUser != null) { + queryWrapper.eq(Goods::getStoreId, authUser.getStoreId()); + } + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java index 762dbbc4..1c9c134f 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java @@ -1,42 +1,69 @@ package cn.lili.modules.goods.serviceimpl; -import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.GoodsTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; -import cn.lili.config.rocketmq.RocketmqCustomProperties; +import cn.lili.common.utils.SnowFlake; import cn.lili.modules.goods.entity.dos.Goods; +import cn.lili.modules.goods.entity.dos.GoodsGallery; import cn.lili.modules.goods.entity.dos.GoodsSku; -import cn.lili.modules.goods.entity.dos.SpecValues; -import cn.lili.modules.goods.entity.dos.Specification; +import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; import cn.lili.modules.goods.entity.dto.GoodsSearchParams; +import cn.lili.modules.goods.entity.dto.GoodsSkuDTO; import cn.lili.modules.goods.entity.dto.GoodsSkuStockDTO; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; -import cn.lili.modules.goods.entity.vos.*; +import cn.lili.modules.goods.entity.vos.GoodsSkuSpecVO; +import cn.lili.modules.goods.entity.vos.GoodsSkuVO; +import cn.lili.modules.goods.entity.vos.GoodsVO; +import cn.lili.modules.goods.entity.vos.SpecValueVO; import cn.lili.modules.goods.mapper.GoodsSkuMapper; -import cn.lili.modules.goods.service.*; +import cn.lili.modules.goods.service.GoodsGalleryService; +import cn.lili.modules.goods.service.GoodsService; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.goods.service.WholesaleService; +import cn.lili.modules.goods.sku.GoodsSkuBuilder; +import cn.lili.modules.goods.sku.render.SalesModelRender; import cn.lili.modules.member.entity.dos.FootPrint; -import cn.lili.modules.member.entity.dos.MemberEvaluation; +import cn.lili.modules.member.entity.dto.EvaluationQueryParams; import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; import cn.lili.modules.member.service.MemberEvaluationService; -import cn.lili.modules.search.entity.dos.EsGoodsAttribute; +import cn.lili.modules.promotion.entity.dos.Coupon; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.CouponGetEnum; +import cn.lili.modules.promotion.service.CouponService; +import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.modules.search.utils.EsIndexUtil; +import cn.lili.mybatis.BaseEntity; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; +import com.baomidou.mybatisplus.core.conditions.Wrapper; 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.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,93 +74,133 @@ import java.util.stream.Collectors; * 商品sku业务层实现 * * @author pikachu - * @date 2020-02-23 15:18:56 + * @since 2020-02-23 15:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsSkuServiceImpl extends ServiceImpl implements GoodsSkuService { - //缓存 - private final Cache cache; - //分类 - private final CategoryService categoryService; - //商品相册 - private final GoodsGalleryService goodsGalleryService; - //规格 - private final SpecificationService specificationService; - //规格项 - private final SpecValuesService specValuesService; - //缓存 - private final StringRedisTemplate stringRedisTemplate; - //rocketMq - private final RocketMQTemplate rocketMQTemplate; - //rocketMq配置 - private final RocketmqCustomProperties rocketmqCustomProperties; - //会员评价 + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 分类 + */ + @Autowired + private MemberCouponService memberCouponService; + /** + * 商品相册 + */ + @Autowired + private GoodsGalleryService goodsGalleryService; + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * rocketMq配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + /** + * 会员评价 + */ @Autowired private MemberEvaluationService memberEvaluationService; - //商品 + /** + * 商品 + */ + @Autowired private GoodsService goodsService; - //商品索引 + /** + * 商品索引 + */ + @Autowired private EsGoodsIndexService goodsIndexService; - @Override - public void add(List> skuList, Goods goods) { - List newSkuList; - // 如果有规格 - if (skuList != null && !skuList.isEmpty()) { - // 添加商品sku - newSkuList = this.addGoodsSku(skuList, goods); - } else { - throw new ServiceException("规格必须要有一个!"); - } + @Autowired + private PromotionGoodsService promotionGoodsService; - this.updateStock(newSkuList); - generateEsCheck(goods); + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + + @Autowired + private WholesaleService wholesaleService; + + @Autowired + private CouponService couponService; + + @Autowired + private List salesModelRenders; + + @Override + @Transactional(rollbackFor = Exception.class) + public void add(Goods goods, GoodsOperationDTO goodsOperationDTO) { + // 是否存在规格 + if (goodsOperationDTO.getSkuList() == null || goodsOperationDTO.getSkuList().isEmpty()) { + throw new ServiceException(ResultCode.MUST_HAVE_GOODS_SKU); + } + // 检查是否需要生成索引 + List goodsSkus = GoodsSkuBuilder.buildBatch(goods, goodsOperationDTO.getSkuList()); + renderGoodsSkuList(goodsSkus, goodsOperationDTO); + + if (!goodsSkus.isEmpty()) { + this.saveOrUpdateBatch(goodsSkus); + this.updateStock(goodsSkus); + } } @Override - public void update(List> skuList, Goods goods, Boolean regeneratorSkuFlag) { + @Transactional(rollbackFor = Exception.class) + public void update(Goods goods, GoodsOperationDTO goodsOperationDTO) { // 是否存在规格 - if (skuList == null || skuList.isEmpty()) { - throw new ServiceException("规格必须要有一个!"); + if (goodsOperationDTO.getSkuList() == null || goodsOperationDTO.getSkuList().isEmpty()) { + throw new ServiceException(ResultCode.MUST_HAVE_GOODS_SKU); } - List newSkuList; + List skuList; //删除旧的sku信息 - if (Boolean.TRUE.equals(regeneratorSkuFlag)) { + if (Boolean.TRUE.equals(goodsOperationDTO.getRegeneratorSkuFlag())) { + skuList = GoodsSkuBuilder.buildBatch(goods, goodsOperationDTO.getSkuList()); + renderGoodsSkuList(skuList, goodsOperationDTO); List goodsListByGoodsId = getGoodsListByGoodsId(goods.getId()); List oldSkuIds = new ArrayList<>(); + //删除旧索引 for (GoodsSkuVO goodsSkuVO : goodsListByGoodsId) { oldSkuIds.add(goodsSkuVO.getId()); - goodsIndexService.deleteIndexById(goodsSkuVO.getId()); cache.remove(GoodsSkuService.getCacheKeys(goodsSkuVO.getId())); } - this.removeByIds(oldSkuIds); + //删除sku相册 - goodsGalleryService.removeByIds(oldSkuIds); - // 添加商品sku - newSkuList = this.addGoodsSku(skuList, goods); + goodsGalleryService.removeByGoodsId(goods.getId()); //发送mq消息 String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.SKU_DELETE.name(); - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(oldSkuIds), RocketmqSendCallbackBuilder.commonCallback()); + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(oldSkuIds), + RocketmqSendCallbackBuilder.commonCallback()); } else { - newSkuList = new ArrayList<>(); - for (Map map : skuList) { - GoodsSku sku = new GoodsSku(); - //设置商品信息 - goodsInfo(sku, goods); - //设置商品规格信息 - skuInfo(sku, goods, map, null); - newSkuList.add(sku); + skuList = new ArrayList<>(); + for (Map map : goodsOperationDTO.getSkuList()) { + GoodsSku sku = GoodsSkuBuilder.build(goods, map); + renderGoodsSku(sku, goodsOperationDTO); + skuList.add(sku); + //如果商品状态值不对,则es索引移除 + if (goods.getAuthFlag().equals(GoodsAuthEnum.PASS.name()) && goods.getMarketEnable().equals(GoodsStatusEnum.UPPER.name())) { + goodsIndexService.deleteIndexById(sku.getId()); + } + this.clearCache(sku.getId()); } - this.updateBatchById(newSkuList); } - - - this.updateStock(newSkuList); - generateEsCheck(goods); + if (!skuList.isEmpty()) { + LambdaQueryWrapper unnecessarySkuIdsQuery = new LambdaQueryWrapper<>(); + unnecessarySkuIdsQuery.eq(GoodsSku::getGoodsId, goods.getId()); + unnecessarySkuIdsQuery.notIn(GoodsSku::getId, + skuList.stream().map(BaseEntity::getId).collect(Collectors.toList())); + this.remove(unnecessarySkuIdsQuery); + this.saveOrUpdateBatch(skuList); + this.updateStock(skuList); + } } /** @@ -142,15 +209,29 @@ public class GoodsSkuServiceImpl extends ServiceImpl i * @param goodsSku sku信息 */ @Override + @Transactional(rollbackFor = Exception.class) public void update(GoodsSku goodsSku) { this.updateById(goodsSku); cache.remove(GoodsSkuService.getCacheKeys(goodsSku.getId())); cache.put(GoodsSkuService.getCacheKeys(goodsSku.getId()), goodsSku); } + + /** + * 清除sku缓存 + * + * @param skuId skuID + */ + @Override + public void clearCache(String skuId) { + cache.remove(GoodsSkuService.getCacheKeys(skuId)); + } + @Override public GoodsSku getGoodsSkuByIdFromCache(String id) { - GoodsSku goodsSku = cache.get(GoodsSkuService.getCacheKeys(id)); + //获取缓存中的sku + GoodsSku goodsSku = (GoodsSku) cache.get(GoodsSkuService.getCacheKeys(id)); + //如果缓存中没有信息,则查询数据库,然后写入缓存 if (goodsSku == null) { goodsSku = this.getById(id); if (goodsSku == null) { @@ -158,94 +239,183 @@ public class GoodsSkuServiceImpl extends ServiceImpl i } cache.put(GoodsSkuService.getCacheKeys(id), goodsSku); } - String quantity = stringRedisTemplate.opsForValue().get(GoodsSkuService.getStockCacheKey(id)); - if (quantity != null) { - if (goodsSku.getQuantity() != Integer.parseInt(quantity)) { - goodsSku.setQuantity(Integer.parseInt(quantity)); - this.updateById(goodsSku); - } - } else { - stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(id), goodsSku.getQuantity().toString()); - } + //获取商品库存 + Integer integer = (Integer) cache.get(GoodsSkuService.getStockCacheKey(id)); + + //库存不为空,库存与缓存中不一致 + if (integer != null && !goodsSku.getQuantity().equals(integer)) { + //写入最新的库存信息 + goodsSku.setQuantity(integer); + cache.put(GoodsSkuService.getCacheKeys(goodsSku.getId()), goodsSku); + } + return goodsSku; + } + + @Override + public GoodsSku getCanPromotionGoodsSkuByIdFromCache(String skuId) { + GoodsSku goodsSku = this.getGoodsSkuByIdFromCache(skuId); + if (goodsSku != null && GoodsSalesModeEnum.WHOLESALE.name().equals(goodsSku.getSalesModel())) { + throw new ServiceException(ResultCode.PROMOTION_GOODS_DO_NOT_JOIN_WHOLESALE, goodsSku.getGoodsName()); + } return goodsSku; } @Override public Map getGoodsSkuDetail(String goodsId, String skuId) { - Map map = new HashMap<>(); - GoodsSku goodsSku = this.getGoodsSkuByIdFromCache(skuId); - - //如果规格为空则使用商品ID进行查询 - if (goodsSku == null) { - GoodsVO goodsVO = goodsService.getGoodsVO(goodsId); + Map map = new HashMap<>(16); + //获取商品VO + GoodsVO goodsVO = goodsService.getGoodsVO(goodsId); + //如果skuid为空,则使用商品VO中sku信息获取 + if (CharSequenceUtil.isEmpty(skuId) || "undefined".equals(skuId)) { skuId = goodsVO.getSkuList().get(0).getId(); - goodsSku = this.getGoodsSkuByIdFromCache(skuId); - //如果使用商品ID无法查询SKU则返回错误 - if (goodsSku == null) { - throw new ServiceException("商品已下架"); - } - + } + //从缓存拿商品Sku + GoodsSku goodsSku = this.getGoodsSkuByIdFromCache(skuId); + //如果使用商品ID无法查询SKU则返回错误 + if (goodsVO == null || goodsSku == null) { + //发送mq消息 + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GOODS_DELETE.name(); + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(Collections.singletonList(goodsId)), + RocketmqSendCallbackBuilder.commonCallback()); + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); } - // 获取当前商品的索引信息 + //商品下架||商品未审核通过||商品删除,则提示:商品已下架 + if (GoodsStatusEnum.DOWN.name().equals(goodsVO.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goodsVO.getAuthFlag()) || Boolean.TRUE.equals(goodsVO.getDeleteFlag())) { + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GOODS_DELETE.name(); + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(Collections.singletonList(goodsId)), + RocketmqSendCallbackBuilder.commonCallback()); + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); + } + + //获取当前商品的索引信息 EsGoodsIndex goodsIndex = goodsIndexService.findById(skuId); if (goodsIndex == null) { - goodsIndex = goodsIndexService.resetEsGoodsIndex(goodsSku); + goodsIndex = goodsIndexService.getResetEsGoodsIndex(goodsSku, goodsVO.getGoodsParamsDTOList()); } + //商品规格 GoodsSkuVO goodsSkuDetail = this.getGoodsSkuVO(goodsSku); - // 设置当前商品的促销价格 - if (goodsIndex.getPromotionMap() != null && !goodsIndex.getPromotionMap().isEmpty() && goodsIndex.getPromotionPrice() != null) { - goodsSkuDetail.setPromotionPrice(goodsIndex.getPromotionPrice()); + Map promotionMap = goodsIndex.getPromotionMap(); + AuthUser currentUser = UserContext.getCurrentUser(); + //设置当前商品的促销价格 + if (promotionMap != null && !promotionMap.isEmpty()) { + promotionMap = promotionMap.entrySet().stream().parallel().filter(i -> { + JSONObject jsonObject = JSONUtil.parseObj(i.getValue()); + if (i.getKey().contains(PromotionTypeEnum.COUPON.name()) && currentUser != null) { + Integer couponLimitNum = jsonObject.getInt("couponLimitNum"); + Coupon coupon = couponService.getById(jsonObject.getStr("id")); + if (coupon == null || (coupon.getPublishNum() != 0 && coupon.getReceivedNum() >= coupon.getPublishNum())) { + return false; + } + if (couponLimitNum > 0) { + Long count = memberCouponService.getMemberCouponNum(currentUser.getId(), jsonObject.getStr( + "id")); + if (count >= couponLimitNum) { + return false; + } + } + } + // 过滤活动赠送优惠券和无效时间的活动 + return (jsonObject.get("getType") == null || jsonObject.get("getType", String.class).equals(CouponGetEnum.FREE.name())) && (jsonObject.get("startTime") != null && jsonObject.get("startTime", Date.class).getTime() <= System.currentTimeMillis()) && (jsonObject.get("endTime") == null || jsonObject.get("endTime", Date.class).getTime() >= System.currentTimeMillis()); + }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + Optional> containsPromotion = + promotionMap.entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.SECKILL.name()) || i.getKey().contains(PromotionTypeEnum.PINTUAN.name())).findFirst(); + if (containsPromotion.isPresent()) { + JSONObject jsonObject = JSONUtil.parseObj(containsPromotion.get().getValue()); + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setSkuId(skuId); + searchParams.setPromotionId(jsonObject.get("id").toString()); + PromotionGoods promotionsGoods = promotionGoodsService.getPromotionsGoods(searchParams); + if (promotionsGoods != null && promotionsGoods.getPrice() != null) { + goodsSkuDetail.setPromotionFlag(true); + goodsSkuDetail.setPromotionPrice(promotionsGoods.getPrice()); + } + } else { + goodsSkuDetail.setPromotionFlag(false); + goodsSkuDetail.setPromotionPrice(null); + } + } map.put("data", goodsSkuDetail); //获取分类 - String[] split = goodsSkuDetail.getCategoryPath().split(","); - map.put("categoryName", categoryService.getCategoryNameByIds(Arrays.asList(split))); + map.put("wholesaleList", GoodsSalesModeEnum.WHOLESALE.name().equals(goodsVO.getSalesModel()) ? + wholesaleService.findByGoodsId(goodsSkuDetail.getGoodsId()) : Collections.emptyList()); + map.put("categoryName", CharSequenceUtil.isNotEmpty(goodsIndex.getCategoryNamePath()) ? + goodsIndex.getCategoryNamePath().split(",") : null); //获取规格信息 - map.put("specs", this.groupBySkuAndSpec(goodsSkuDetail.getGoodsId())); - map.put("promotionMap", goodsIndex.getPromotionMap()); + map.put("specs", this.groupBySkuAndSpec(goodsVO.getSkuList())); + map.put("promotionMap", promotionMap); + + //获取参数信息 + if (goodsVO.getGoodsParamsDTOList() != null && !goodsVO.getGoodsParamsDTOList().isEmpty()) { + map.put("goodsParamsDTOList", goodsVO.getGoodsParamsDTOList()); + } //记录用户足迹 - if (UserContext.getCurrentUser() != null) { - FootPrint footPrint = new FootPrint(UserContext.getCurrentUser().getId(), goodsId, skuId); + if (currentUser != null) { + FootPrint footPrint = new FootPrint(currentUser.getId(), goodsIndex.getStoreId(), goodsId, skuId); String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.VIEW_GOODS.name(); rocketMQTemplate.asyncSend(destination, footPrint, RocketmqSendCallbackBuilder.commonCallback()); } return map; } - @Override - public List groupBySkuAndSpec(String goodsId) { - List goodsListByGoodsId = this.getGoodsListByGoodsId(goodsId); - List skuSpecVOList = new ArrayList<>(); - for (GoodsSkuVO goodsSkuVO : goodsListByGoodsId) { - GoodsSkuSpecVO specVO = new GoodsSkuSpecVO(); - specVO.setSkuId(goodsSkuVO.getId()); - specVO.setSpecValues(goodsSkuVO.getSpecList()); - specVO.setQuantity(goodsSkuVO.getQuantity()); - skuSpecVOList.add(specVO); - } - return skuSpecVOList; - } - /** * 更新商品sku状态 * - * @param goods 商品信息(Id,MarketEnable/IsAuth) + * @param goods 商品信息(Id,MarketEnable/AuthFlag) */ @Override + @Transactional(rollbackFor = Exception.class) public void updateGoodsSkuStatus(Goods goods) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(GoodsSku::getGoodsId, goods.getId()); + updateWrapper.eq(CharSequenceUtil.isNotEmpty(goods.getId()), GoodsSku::getGoodsId, goods.getId()); + updateWrapper.eq(CharSequenceUtil.isNotEmpty(goods.getStoreId()), GoodsSku::getStoreId, goods.getStoreId()); updateWrapper.set(GoodsSku::getMarketEnable, goods.getMarketEnable()); - updateWrapper.set(GoodsSku::getIsAuth, goods.getIsAuth()); - this.update(updateWrapper); - generateEsCheck(goods); + updateWrapper.set(GoodsSku::getAuthFlag, goods.getAuthFlag()); + updateWrapper.set(GoodsSku::getDeleteFlag, goods.getDeleteFlag()); + boolean update = this.update(updateWrapper); + if (Boolean.TRUE.equals(update)) { + List goodsSkus = this.getGoodsSkuListByGoodsId(goods.getId()); + for (GoodsSku sku : goodsSkus) { + cache.remove(GoodsSkuService.getCacheKeys(sku.getId())); + cache.put(GoodsSkuService.getCacheKeys(sku.getId()), sku); + } + } + } + + /** + * 更新商品sku状态根据店铺id + * + * @param storeId 店铺id + * @param marketEnable 市场启用状态 + * @param authFlag 审核状态 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateGoodsSkuStatusByStoreId(String storeId, String marketEnable, String authFlag) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(GoodsSku::getStoreId, storeId); + updateWrapper.set(CharSequenceUtil.isNotEmpty(marketEnable), GoodsSku::getMarketEnable, marketEnable); + updateWrapper.set(CharSequenceUtil.isNotEmpty(authFlag), GoodsSku::getAuthFlag, authFlag); + boolean update = this.update(updateWrapper); + if (Boolean.TRUE.equals(update)) { + if (GoodsStatusEnum.UPPER.name().equals(marketEnable)) { + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("生成店铺商品", + rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.GENERATOR_STORE_GOODS_INDEX.name(), + storeId)); + } else if (GoodsStatusEnum.DOWN.name().equals(marketEnable)) { + cache.vagueDel(CachePrefix.GOODS_SKU.getPrefix()); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("删除店铺商品", + rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.STORE_GOODS_DELETE.name(), storeId)); + } + } } @Override @@ -272,6 +442,17 @@ public class GoodsSkuServiceImpl extends ServiceImpl i return this.getGoodsSkuVOList(list); } + /** + * 获取goodsId下所有的goodsSku + * + * @param goodsId 商品id + * @return goodsSku列表 + */ + @Override + public List getGoodsSkuListByGoodsId(String goodsId) { + return this.list(new LambdaQueryWrapper().eq(GoodsSku::getGoodsId, goodsId)); + } + @Override public List getGoodsSkuVOList(List list) { List goodsSkuVOS = new ArrayList<>(); @@ -284,32 +465,31 @@ public class GoodsSkuServiceImpl extends ServiceImpl i @Override public GoodsSkuVO getGoodsSkuVO(GoodsSku goodsSku) { + //初始化商品 GoodsSkuVO goodsSkuVO = new GoodsSkuVO(goodsSku); + //获取sku信息 JSONObject jsonObject = JSONUtil.parseObj(goodsSku.getSpecs()); + //用于接受sku信息 List specValueVOS = new ArrayList<>(); + //用于接受sku相册 List goodsGalleryList = new ArrayList<>(); + //循环提交的sku表单 for (Map.Entry entry : jsonObject.entrySet()) { - SpecValueVO s = new SpecValueVO(); - if (entry.getKey().equals("images")) { - s.setSpecName(entry.getKey()); + SpecValueVO specValueVO = new SpecValueVO(); + if ("images".equals(entry.getKey())) { + specValueVO.setSpecName(entry.getKey()); if (entry.getValue().toString().contains("url")) { - List specImages = JSONUtil.toList(JSONUtil.parseArray(entry.getValue()), SpecValueVO.SpecImages.class); - s.setSpecImage(specImages); - goodsGalleryList = specImages.stream().map(SpecValueVO.SpecImages::getUrl).collect(Collectors.toList()); + List specImages = JSONUtil.toList(JSONUtil.parseArray(entry.getValue()), + SpecValueVO.SpecImages.class); + specValueVO.setSpecImage(specImages); + goodsGalleryList = + specImages.stream().map(SpecValueVO.SpecImages::getUrl).collect(Collectors.toList()); } } else { - SpecificationVO specificationVO = new SpecificationVO(); - specificationVO.setSpecName(entry.getKey()); - specificationVO.setStoreId(goodsSku.getStoreId()); - specificationVO.setCategoryPath(goodsSku.getCategoryPath()); - Specification specification = specificationService.addSpecification(specificationVO); - s.setSpecNameId(specification.getId()); - SpecValues specValues = specValuesService.getSpecValues(entry.getValue().toString(), specification.getId()); - s.setSpecValueId(specValues.getId()); - s.setSpecName(entry.getKey()); - s.setSpecValue(entry.getValue().toString()); + specValueVO.setSpecName(entry.getKey()); + specValueVO.setSpecValue(entry.getValue().toString()); } - specValueVOS.add(s); + specValueVOS.add(specValueVO); } goodsSkuVO.setGoodsGalleryList(goodsGalleryList); goodsSkuVO.setSpecList(specValueVOS); @@ -322,6 +502,23 @@ public class GoodsSkuServiceImpl extends ServiceImpl i } @Override + public IPage getGoodsSkuDTOByPage(Page page, Wrapper queryWrapper) { + return this.baseMapper.queryByParams(page, queryWrapper); + } + + /** + * 列表查询商品sku信息 + * + * @param searchParams 查询参数 + * @return 商品sku信息 + */ + @Override + public List getGoodsSkuByList(GoodsSearchParams searchParams) { + return this.list(searchParams.queryWrapper()); + } + + @Override + @Transactional(rollbackFor = Exception.class) public void updateStocks(List goodsSkuStockDTOS) { for (GoodsSkuStockDTO goodsSkuStockDTO : goodsSkuStockDTOS) { this.updateStock(goodsSkuStockDTO.getSkuId(), goodsSkuStockDTO.getQuantity()); @@ -329,51 +526,65 @@ public class GoodsSkuServiceImpl extends ServiceImpl i } @Override + @Transactional(rollbackFor = Exception.class) public void updateStock(String skuId, Integer quantity) { GoodsSku goodsSku = getGoodsSkuByIdFromCache(skuId); if (goodsSku != null) { - if (quantity <= 0) { - goodsIndexService.deleteIndexById(goodsSku.getId()); - } + //判断商品sku是否已经下架(修改商品库存为0时 会自动下架商品),再次更新商品库存时 需更新商品索引 + Boolean isFlag = goodsSku.getQuantity()<= 0; + goodsSku.setQuantity(quantity); - this.update(new LambdaUpdateWrapper().eq(GoodsSku::getId, skuId).set(GoodsSku::getQuantity, quantity)); + boolean update = + this.update(new LambdaUpdateWrapper().eq(GoodsSku::getId, skuId).set(GoodsSku::getQuantity, quantity)); + if (update) { + cache.remove(CachePrefix.GOODS.getPrefix() + goodsSku.getGoodsId()); + } cache.put(GoodsSkuService.getCacheKeys(skuId), goodsSku); - stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(skuId), quantity.toString()); + cache.put(GoodsSkuService.getStockCacheKey(skuId), quantity); //更新商品库存 List goodsSkus = new ArrayList<>(); goodsSkus.add(goodsSku); this.updateGoodsStuck(goodsSkus); + this.promotionGoodsService.updatePromotionGoodsStock(goodsSku.getId(), quantity); + //商品库存为0是删除商品索引 + if (quantity <= 0) { + goodsIndexService.deleteIndexById(goodsSku.getId()); + } + //商品SKU库存为0并且商品sku状态为上架时更新商品库存 + if(isFlag && StrUtil.equals(goodsSku.getMarketEnable(),GoodsStatusEnum.UPPER.name())) { + List goodsIds = new ArrayList<>(); + goodsIds.add(goodsSku.getGoodsId()); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("更新商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.UPDATE_GOODS_INDEX.name(), goodsIds)); + } } } @Override public Integer getStock(String skuId) { String cacheKeys = GoodsSkuService.getStockCacheKey(skuId); - String stockStr = stringRedisTemplate.opsForValue().get(cacheKeys); - if (stockStr != null) { - return Integer.parseInt(stockStr); + Integer stock = (Integer) cache.get(cacheKeys); + if (stock != null) { + return stock; } else { GoodsSku goodsSku = getGoodsSkuByIdFromCache(skuId); - stringRedisTemplate.opsForValue().set(cacheKeys, goodsSku.getQuantity().toString()); + cache.put(cacheKeys, goodsSku.getQuantity()); return goodsSku.getQuantity(); } } @Override + @Transactional(rollbackFor = Exception.class) public void updateGoodsStuck(List goodsSkus) { - //商品id集合 hashset 去重复 - Set goodsIds = new HashSet<>(); - for (GoodsSku sku : goodsSkus) { - goodsIds.add(sku.getGoodsId()); - } + Map> groupByGoodsIds = + goodsSkus.stream().collect(Collectors.groupingBy(GoodsSku::getGoodsId)); //获取相关的sku集合 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.in(GoodsSku::getGoodsId, goodsIds); + lambdaQueryWrapper.in(GoodsSku::getGoodsId, groupByGoodsIds.keySet()); List goodsSkuList = this.list(lambdaQueryWrapper); //统计每个商品的库存 - for (String goodsId : goodsIds) { + for (String goodsId : groupByGoodsIds.keySet()) { //库存 Integer quantity = 0; for (GoodsSku goodsSku : goodsSkuList) { @@ -381,7 +592,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i quantity += goodsSku.getQuantity(); } } - //保存商品库存结果 这里在for循环中调用数据库保存不太好,需要优化 + //保存商品库存结果 goodsService.updateStock(goodsId, quantity); } @@ -389,51 +600,71 @@ public class GoodsSkuServiceImpl extends ServiceImpl i } @Override + @Transactional(rollbackFor = Exception.class) public void updateGoodsSkuCommentNum(String skuId) { //获取商品信息 GoodsSku goodsSku = this.getGoodsSkuByIdFromCache(skuId); - LambdaQueryWrapper goodEvaluationQueryWrapper = new LambdaQueryWrapper<>(); - goodEvaluationQueryWrapper.eq(MemberEvaluation::getSkuId, goodsSku.getId()); - goodEvaluationQueryWrapper.eq(MemberEvaluation::getGrade, EvaluationGradeEnum.GOOD.name()); + EvaluationQueryParams queryParams = new EvaluationQueryParams(); + queryParams.setGrade(EvaluationGradeEnum.GOOD.name()); + queryParams.setSkuId(goodsSku.getId()); + //好评数量 + long highPraiseNum = memberEvaluationService.getEvaluationCount(queryParams); - // 好评数量 - double highPraiseNum = memberEvaluationService.count(goodEvaluationQueryWrapper); + //更新商品评价数量 + goodsSku.setCommentNum(goodsSku.getCommentNum() != null ? goodsSku.getCommentNum() + 1 : 1); - // 更新商品评价数量 - goodsSku.setCommentNum(goodsSku.getCommentNum() + 1); - - // 好评率 - double grade = NumberUtil.div(highPraiseNum, goodsSku.getCommentNum().doubleValue(), 2) * 100; + //好评率 + double grade = NumberUtil.mul(NumberUtil.div(highPraiseNum, goodsSku.getCommentNum().doubleValue(), 2), 100); goodsSku.setGrade(grade); //修改规格 this.update(goodsSku); - //修改规格索引 - goodsIndexService.updateIndexCommentNum(goodsSku.getId(), goodsSku.getCommentNum(), (int) highPraiseNum, grade); + + + //修改规格索引,发送mq消息 + Map updateIndexFieldsMap = + EsIndexUtil.getUpdateIndexFieldsMap(MapUtil.builder(new HashMap()).put("id", + goodsSku.getId()).build(), MapUtil.builder(new HashMap()).put("commentNum", + goodsSku.getCommentNum()).put("highPraiseNum", highPraiseNum).put("grade", grade).build()); + String destination = + rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name(); + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), + RocketmqSendCallbackBuilder.commonCallback()); + + //修改商品的评价数量 + goodsService.updateGoodsCommentNum(goodsSku.getGoodsId()); } /** - * 生成ES商品索引 + * 根据商品id获取全部skuId的集合 * - * @param goods 商品信息 + * @param goodsId goodsId + * @return 全部skuId的集合 */ - private void generateEsCheck(Goods goods) { - //如果商品通过审核&&并且已上架 - if (goods.getIsAuth().equals(GoodsAuthEnum.PASS.name()) && goods.getMarketEnable().equals(GoodsStatusEnum.UPPER.name())) { - List goodsSkuList = this.list(new LambdaQueryWrapper().eq(GoodsSku::getGoodsId, goods.getId())); - for (GoodsSku goodsSku : goodsSkuList) { - EsGoodsIndex byId = goodsIndexService.findById(goodsSku.getId()); - EsGoodsIndex goodsIndex = new EsGoodsIndex(goodsSku); - if (goodsSku.getQuantity() > 0 && byId == null) { - goodsIndexService.addIndex(goodsIndex); - } else if (goodsSku.getQuantity() > 0 && byId != null) { - goodsIndexService.updateIndex(goodsIndex); - } else if (goodsSku.getQuantity() <= 0 && byId != null) { - goodsIndexService.deleteIndexById(goodsSku.getId()); - } - cache.remove(GoodsSkuService.getCacheKeys(goodsSku.getId())); + @Override + public List getSkuIdsByGoodsId(String goodsId) { + return this.baseMapper.getGoodsSkuIdByGoodsId(goodsId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteAndInsertGoodsSkus(List goodsSkus) { + int count = 0; + for (GoodsSku skus : goodsSkus) { + if (CharSequenceUtil.isEmpty(skus.getId())) { + skus.setId(SnowFlake.getIdStr()); } + count = this.baseMapper.replaceGoodsSku(skus); } + return count > 0; + } + + @Override + public Long countSkuNum(String storeId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + queryWrapper.eq(GoodsSku::getStoreId, storeId).eq(GoodsSku::getDeleteFlag, Boolean.FALSE).eq(GoodsSku::getAuthFlag, GoodsAuthEnum.PASS.name()).eq(GoodsSku::getMarketEnable, GoodsStatusEnum.UPPER.name()); + return this.count(queryWrapper); } /** @@ -454,170 +685,85 @@ public class GoodsSkuServiceImpl extends ServiceImpl i /** - * 增加sku集合 + * 批量渲染商品sku * - * @param skuList sku列表 - * @param goods 商品信息 + * @param goodsSkuList sku集合 + * @param goodsOperationDTO 商品操作DTO */ - private List addGoodsSku(List> skuList, Goods goods) { - List skus = new ArrayList<>(); - List goodsIndices = new ArrayList<>(); - for (Map skuVO : skuList) { - Map resultMap = this.add(skuVO, goods); - GoodsSku goodsSku = (GoodsSku) resultMap.get("goodsSku"); - if (goods.getSelfOperated() != null) { - goodsSku.setSelfOperated(goods.getSelfOperated()); - } - EsGoodsIndex goodsIndex = (EsGoodsIndex) resultMap.get("goodsIndex"); - skus.add(goodsSku); - goodsIndices.add(goodsIndex); - stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity().toString()); + @Override + public void renderGoodsSkuList(List goodsSkuList, GoodsOperationDTO goodsOperationDTO) { + // 商品销售模式渲染器 + salesModelRenders.stream().filter(i -> i.getSalesMode().equals(goodsOperationDTO.getSalesModel())).findFirst().ifPresent(i -> i.renderBatch(goodsSkuList, goodsOperationDTO)); + for (GoodsSku goodsSku : goodsSkuList) { + extendOldSkuValue(goodsSku); + this.renderImages(goodsSku); } - this.saveBatch(skus); - String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(); - //发送mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsIndices), RocketmqSendCallbackBuilder.commonCallback()); - return skus; } /** - * 添加商品规格 + * 渲染商品sku * - * @param map 规格属性 - * @param goods 商品 - * @return 规格商品 + * @param goodsSku sku + * @param goodsOperationDTO 商品操作DTO */ - private Map add(Map map, Goods goods) { - Map resultMap = new HashMap<>(); - GoodsSku sku = new GoodsSku(); - - //商品索引 - EsGoodsIndex esGoodsIndex = new EsGoodsIndex(); - - //设置商品信息 - goodsInfo(sku, goods); - //设置商品规格信息 - skuInfo(sku, goods, map, esGoodsIndex); - - esGoodsIndex.setGoodsSku(sku); - resultMap.put("goodsSku", sku); - resultMap.put("goodsIndex", esGoodsIndex); - return resultMap; + void renderGoodsSku(GoodsSku goodsSku, GoodsOperationDTO goodsOperationDTO) { + extendOldSkuValue(goodsSku); + // 商品销售模式渲染器 + salesModelRenders.stream().filter(i -> i.getSalesMode().equals(goodsOperationDTO.getSalesModel())).findFirst().ifPresent(i -> i.renderSingle(goodsSku, goodsOperationDTO)); + this.renderImages(goodsSku); } /** - * 设置规格商品的商品信息 + * 将原sku的一些不会直接传递的值放到新的sku中 * - * @param sku 规格 - * @param goods 商品 + * @param goodsSku 商品sku */ - private void goodsInfo(GoodsSku sku, Goods goods) { - //商品基本信息 - sku.setGoodsId(goods.getId()); - - sku.setSellingPoint(goods.getSellingPoint()); - sku.setCategoryPath(goods.getCategoryPath()); - sku.setBrandId(goods.getBrandId()); - sku.setMarketEnable(goods.getMarketEnable()); - sku.setIntro(goods.getIntro()); - sku.setMobileIntro(goods.getMobileIntro()); - sku.setGoodsUnit(goods.getGoodsUnit()); - //运费 - sku.setFreightPayer(goods.getFreightPayer()); - //商品状态 - sku.setIsAuth(goods.getIsAuth()); - sku.setSalesModel(goods.getSalesModel()); - //卖家信息 - sku.setStoreId(goods.getStoreId()); - sku.setStoreName(goods.getStoreName()); - sku.setStoreCategoryPath(goods.getStoreCategoryPath()); - sku.setFreightTemplateId(goods.getTemplateId()); - } - - /** - * 设置商品规格信息 - * - * @param sku 规格商品 - * @param goods 商品 - * @param map 规格信息 - * @param esGoodsIndex 商品索引 - */ - private void skuInfo(GoodsSku sku, Goods goods, Map map, EsGoodsIndex esGoodsIndex) { - - //规格简短信息 - StringBuilder simpleSpecs = new StringBuilder(); - //商品名称 - StringBuilder goodsName = new StringBuilder(goods.getGoodsName()); - //规格商品缩略图 - String thumbnail = ""; - //规格值 - Map specMap = new HashMap<>(); - //商品属性 - List attributes = new ArrayList<>(); - - //获取规格信息 - for (Map.Entry m : map.entrySet()) { - //保存规格信息 - if (m.getKey().equals("id") || m.getKey().equals("sn") || m.getKey().equals("cost") || m.getKey().equals("price") || m.getKey().equals("quantity") || m.getKey().equals("weight")) { - continue; - } else { - specMap.put(m.getKey(), m.getValue()); - if (m.getKey().equals("images")) { - //设置规格商品缩略图 - List> images = (List>) m.getValue(); - if (images == null || images.isEmpty()) { - throw new ServiceException("sku图片至少为一个"); - } - thumbnail = goodsGalleryService.getGoodsGallery(images.get(0).get("url")).getThumbnail(); - } else { - //设置商品名称 - goodsName.append(" ").append(m.getValue()); - - //规格简短信息 - simpleSpecs.append(" ").append(m.getValue()); - - //保存规格项 - SpecificationVO specificationVO = new SpecificationVO(m.getKey(), goods.getStoreId(), goods.getCategoryPath()); - Specification specification = specificationService.addSpecification(specificationVO); - - //保存规格值 - SpecValues specValues = specValuesService.getSpecValues(m.getValue().toString(), specification.getId()); - - //添加属性索引 - EsGoodsAttribute attribute = new EsGoodsAttribute(0, specification.getId(), m.getKey(), specValues.getId(), m.getValue().toString()); - attributes.add(attribute); - } + private void extendOldSkuValue(GoodsSku goodsSku) { + if (CharSequenceUtil.isNotEmpty(goodsSku.getGoodsId())) { + GoodsSku oldSku = this.getGoodsSkuByIdFromCache(goodsSku.getId()); + if (oldSku != null) { + goodsSku.setCommentNum(oldSku.getCommentNum()); + goodsSku.setViewCount(oldSku.getViewCount()); + goodsSku.setBuyCount(oldSku.getBuyCount()); + goodsSku.setGrade(oldSku.getGrade()); } } + } - //设置规格信息 - sku.setGoodsName(goodsName.toString()); - sku.setThumbnail(thumbnail); - - //规格信息 - sku.setId(map.getOrDefault("id", "").toString()); - sku.setSn(Convert.toStr(map.get("sn"))); - sku.setWeight(Convert.toDouble(map.get("weight"), 0D)); - sku.setPrice(Convert.toDouble(map.get("price"), 0D)); - sku.setCost(Convert.toDouble(map.get("cost"), 0D)); - sku.setQuantity(Convert.toInt(map.get("quantity"), 0)); - sku.setSpecs(JSONUtil.toJsonStr(specMap)); - sku.setSimpleSpecs(simpleSpecs.toString()); - - if (esGoodsIndex != null) { - //商品索引 - esGoodsIndex.setAttrList(attributes); + /** + * 渲染sku图片 + * + * @param goodsSku sku + */ + void renderImages(GoodsSku goodsSku) { + JSONObject jsonObject = JSONUtil.parseObj(goodsSku.getSpecs()); + List> images = jsonObject.get("images", List.class); + if (images != null && !images.isEmpty()) { + GoodsGallery goodsGallery = goodsGalleryService.getGoodsGallery(images.get(0).get("url")); + goodsSku.setBig(goodsGallery.getOriginal()); + goodsSku.setOriginal(goodsGallery.getOriginal()); + goodsSku.setThumbnail(goodsGallery.getThumbnail()); + goodsSku.setSmall(goodsGallery.getSmall()); } } + /** + * 根据商品分组商品sku及其规格信息 + * + * @param goodsSkuVOList 商品VO列表 + * @return 分组后的商品sku及其规格信息 + */ + private List groupBySkuAndSpec(List goodsSkuVOList) { - @Autowired - public void setGoodsService(GoodsService goodsService) { - this.goodsService = goodsService; + List skuSpecVOList = new ArrayList<>(); + for (GoodsSkuVO goodsSkuVO : goodsSkuVOList) { + GoodsSkuSpecVO specVO = new GoodsSkuSpecVO(); + specVO.setSkuId(goodsSkuVO.getId()); + specVO.setSpecValues(goodsSkuVO.getSpecList()); + specVO.setQuantity(goodsSkuVO.getQuantity()); + skuSpecVOList.add(specVO); + } + return skuSpecVOList; } - @Autowired - public void setGoodsIndexService(EsGoodsIndexService goodsIndexService) { - this.goodsIndexService = goodsIndexService; - } -} \ No newline at end of file +} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsUnitServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsUnitServiceImpl.java index 499638fb..f7c689c4 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsUnitServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsUnitServiceImpl.java @@ -14,11 +14,9 @@ import org.springframework.transaction.annotation.Transactional; * 计量单位业务层实现 * * @author Bulbasaur - * @date 2020/11/26 16:13 + * @since 2020/11/26 16:13 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsUnitServiceImpl extends ServiceImpl implements GoodsUnitService { } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsWordsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsWordsServiceImpl.java index 09dd8815..888fded8 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsWordsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsWordsServiceImpl.java @@ -5,7 +5,6 @@ import cn.lili.modules.goods.mapper.GoodsWordsMapper; import cn.lili.modules.goods.service.GoodsWordsService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 商品关键字业务层实现 @@ -14,6 +13,5 @@ import org.springframework.transaction.annotation.Transactional; * @since 2020/10/15 **/ @Service -@Transactional(rollbackFor = Exception.class) public class GoodsWordsServiceImpl extends ServiceImpl implements GoodsWordsService { } diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/ParametersServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/ParametersServiceImpl.java index 27ee4e58..13fa9704 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/ParametersServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/ParametersServiceImpl.java @@ -1,22 +1,123 @@ package cn.lili.modules.goods.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dos.Parameters; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; +import cn.lili.modules.goods.entity.dto.GoodsParamsItemDTO; import cn.lili.modules.goods.mapper.ParametersMapper; +import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.goods.service.ParametersService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * 商品参数业务层实现 * * @author pikachu - * @date 2020-03-02 16:18:56 + * @since 2020-03-02 16:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ParametersServiceImpl extends ServiceImpl implements ParametersService { + + + @Autowired + private GoodsService goodsService; + + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + /** + * 更新参数组信息 + * + * @param parameters 参数组信息 + * @return 是否更新成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateParameter(Parameters parameters) { + Parameters origin = this.getById(parameters.getId()); + if (origin == null) { + throw new ServiceException(ResultCode.CATEGORY_NOT_EXIST); + } + + List goodsIds = new ArrayList<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(Goods::getId, Goods::getParams); + queryWrapper.like(Goods::getParams, parameters.getGroupId()); + List> goodsList = this.goodsService.listMaps(queryWrapper); + + if (!goodsList.isEmpty()) { + for (Map goods : goodsList) { + String params = (String) goods.get("params"); + List goodsParamsDTOS = JSONUtil.toList(params, GoodsParamsDTO.class); + List goodsParamsDTOList = goodsParamsDTOS.stream().filter(i -> i.getGroupId() != null && i.getGroupId().equals(parameters.getGroupId())).collect(Collectors.toList()); + this.setGoodsItemDTOList(goodsParamsDTOList, parameters); + this.goodsService.updateGoodsParams(goods.get("id").toString(), JSONUtil.toJsonStr(goodsParamsDTOS)); + goodsIds.add(goods.get("id").toString()); + } + + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX.name(); + //发送mq消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsIds), RocketmqSendCallbackBuilder.commonCallback()); + } + return this.updateById(parameters); + } + + /** + * 更新商品参数信息 + * + * @param goodsParamsDTOList 商品参数项列表 + * @param parameters 参数信息 + */ + private void setGoodsItemDTOList(List goodsParamsDTOList, Parameters parameters) { + for (GoodsParamsDTO goodsParamsDTO : goodsParamsDTOList) { + List goodsParamsItemDTOList = goodsParamsDTO.getGoodsParamsItemDTOList().stream().filter(i -> i.getParamId() != null && i.getParamId().equals(parameters.getId())).collect(Collectors.toList()); + for (GoodsParamsItemDTO goodsParamsItemDTO : goodsParamsItemDTOList) { + this.setGoodsItemDTO(goodsParamsItemDTO, parameters); + } + } + } + + /** + * 更新商品参数详细信息 + * + * @param goodsParamsItemDTO 商品参数项信息 + * @param parameters 参数信息 + */ + private void setGoodsItemDTO(GoodsParamsItemDTO goodsParamsItemDTO, Parameters parameters) { + if (goodsParamsItemDTO.getParamId().equals(parameters.getId())) { + goodsParamsItemDTO.setParamId(parameters.getId()); + goodsParamsItemDTO.setParamName(parameters.getParamName()); + goodsParamsItemDTO.setRequired(parameters.getRequired()); + goodsParamsItemDTO.setIsIndex(parameters.getIsIndex()); + goodsParamsItemDTO.setSort(parameters.getSort()); + if (CharSequenceUtil.isNotEmpty(parameters.getOptions()) && CharSequenceUtil.isNotEmpty(goodsParamsItemDTO.getParamValue()) && !parameters.getOptions().contains(goodsParamsItemDTO.getParamValue())) { + if (parameters.getOptions().contains(",")) { + goodsParamsItemDTO.setParamValue(parameters.getOptions().substring(0, parameters.getOptions().indexOf(","))); + } else { + goodsParamsItemDTO.setParamValue(parameters.getOptions()); + } + } + } + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/SpecValuesServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/SpecValuesServiceImpl.java deleted file mode 100644 index aceaf4c5..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/SpecValuesServiceImpl.java +++ /dev/null @@ -1,118 +0,0 @@ -package cn.lili.modules.goods.serviceimpl; - -import cn.hutool.core.util.StrUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.modules.goods.entity.dos.SpecValues; -import cn.lili.modules.goods.entity.dos.Specification; -import cn.lili.modules.goods.mapper.SpecValuesMapper; -import cn.lili.modules.goods.service.SpecValuesService; -import cn.lili.modules.goods.service.SpecificationService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 规格项接口实现 - * - * @author pikachu - * @date 2020-02-18 16:18:56 - */ - -@Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SpecValuesServiceImpl extends ServiceImpl implements SpecValuesService { - - //规格 - private SpecificationService specificationService; - - @Override - public List saveSpecValue(String specId, String[] valueList) { - //校验是否存在 - Specification specification = specificationService.getById(specId); - List res = new ArrayList<>(); - if (specification != null) { - //先删除原有规格值 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("spec_id", specId); - this.remove(queryWrapper); - //添加新的规格值 - for (String value : valueList) { - SpecValues specValues = new SpecValues(); - specValues.setSpecValue(value); - specValues.setSpecId(specification.getId()); - this.save(specValues); - res.add(specValues); - } - return res; - } - return res; - } - - @Override - public List addSpecValue(String specId, String[] valueList) { - List specValuesList = new ArrayList<>(); - for (String value : valueList) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("spec_id", specId); - queryWrapper.eq("spec_value", value); - if (this.getOne(queryWrapper) == null) { - SpecValues specValues = new SpecValues(); - specValues.setSpecValue(value); - specValues.setSpecId(specId); - this.save(specValues); - specValuesList.add(specValues); - } - } - return specValuesList; - } - - @Override - public List getSpecValues(List specIds) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SpecValues::getSpecValue, specIds); - return this.list(queryWrapper); - } - - @Override - public SpecValues getSpecValues(String specValue, String specId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SpecValues::getSpecValue, specValue); - queryWrapper.eq(SpecValues::getSpecId, specId); - - SpecValues specValues = this.getOne(queryWrapper); - if (specValues == null) { - specValues = new SpecValues(); - specValues.setSpecValue(specValue); - specValues.setSpecId(specId); - this.save(specValues); - } - return specValues; - } - - @Override - public IPage queryByParams(String specId, String specVal, PageVO pageVo) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (StrUtil.isNotEmpty(specId)) { - queryWrapper.eq(SpecValues::getSpecId, specId); - } - if (StrUtil.isNotEmpty(specVal)) { - queryWrapper.like(SpecValues::getSpecValue, specVal); - } - return this.page(PageUtil.initPage(pageVo), queryWrapper); - } - - @Autowired - public void setSpecificationService(SpecificationService specificationService) { - this.specificationService = specificationService; - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/SpecificationServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/SpecificationServiceImpl.java index 9793fade..ae5e1919 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/SpecificationServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/SpecificationServiceImpl.java @@ -1,169 +1,58 @@ package cn.lili.modules.goods.serviceimpl; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.CategorySpecification; -import cn.lili.modules.goods.entity.dos.SpecValues; import cn.lili.modules.goods.entity.dos.Specification; -import cn.lili.modules.goods.entity.dto.SpecificationSearchParams; -import cn.lili.modules.goods.entity.vos.CategorySpecificationVO; -import cn.lili.modules.goods.entity.vos.GoodsSpecValueVO; -import cn.lili.modules.goods.entity.vos.SpecificationVO; import cn.lili.modules.goods.mapper.SpecificationMapper; import cn.lili.modules.goods.service.CategorySpecificationService; -import cn.lili.modules.goods.service.SpecValuesService; import cn.lili.modules.goods.service.SpecificationService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 商品规格业务层实现 * * @author pikachu - * @date 2020-02-18 16:18:56 + * @since 2020-02-18 16:18:56 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SpecificationServiceImpl extends ServiceImpl implements SpecificationService { - //分类-规格绑定 - private final CategorySpecificationService categorySpecificationService; - //规格值 - private SpecValuesService specValuesService; - @Override - public List getSpecList(Map param) { - return this.baseMapper.findSpecList(param); - } + /** + * 分类-规格绑定 + */ + @Autowired + private CategorySpecificationService categorySpecificationService; + /** + * 分类 + */ + @Autowired + private CategoryServiceImpl categoryService; - @Override - public List getGoodsSpecValue(String categoryId) { - List categorySpecificationVOS = categorySpecificationService.getCategorySpecList(categoryId); - Map map = new HashMap<>(); - if (!categorySpecificationVOS.isEmpty()) { - //循环组织查询规格值数据 - List valueId = new ArrayList<>(); - for (CategorySpecificationVO categorySpecification : categorySpecificationVOS) { - map.put(categorySpecification.getId(), categorySpecification.getName()); - valueId.add(categorySpecification.getId()); - } - //使用valueId去查询规格值 - List specValues = specValuesService.getSpecValues(valueId); - //循环组织数据 - List goodsSpecValueVOS = new ArrayList<>(); - for (Map.Entry m : map.entrySet()) { - GoodsSpecValueVO goodsSpecValueVO = new GoodsSpecValueVO(); - goodsSpecValueVO.setName(m.getValue().toString()); - List list = new ArrayList<>(); - for (SpecValues spec : specValues) { - if (spec.getSpecId().equals(m.getKey())) { - list.add(spec.getSpecValue()); - } - } - goodsSpecValueVO.setValue(list); - goodsSpecValueVOS.add(goodsSpecValueVO); - } - return goodsSpecValueVOS; - } - return new ArrayList<>(); - } - - @Override - public Specification getSpecification(String id) { - Specification specification = this.getById(id); - if (specification == null) { - throw new ServiceException("当前商品已下架"); - } - return specification; - } - - @Override - public IPage getSpecificationPage(SpecificationSearchParams searchParams, PageVO pageVo) { - Map param = new HashMap<>(); - param.put("specName", searchParams.getSpecName()); - List specList = this.getSpecList(param); - IPage page = new Page<>(pageVo.getPageNumber(), pageVo.getPageSize(), specList.size()); - page.setRecords(PageUtil.listToPage(pageVo, specList)); - return page; - } - - @Override - public IPage getSpecificationByPage(SpecificationSearchParams searchParams, PageVO pageVo) { - List specIds = new ArrayList<>(); - if (StrUtil.isNotEmpty(searchParams.getCategoryPath())) { - String categoryPath = searchParams.getCategoryPath(); - List categorySpecList = categorySpecificationService.getCategorySpecList(categoryPath.split(",")); - categorySpecList.forEach(i -> specIds.add(i.getSpecificationId())); - } - QueryWrapper queryWrapper = searchParams.queryWrapper(); - queryWrapper.in("id", specIds); - return this.page(PageUtil.initPage(pageVo), queryWrapper); - } - - @Override - public Specification addSpecification(SpecificationVO specificationVO) { - Specification specification = this.getOne(new LambdaQueryWrapper().eq(Specification::getSpecName, specificationVO.getSpecName())); - if (specification == null) { - this.save(specificationVO); - specification = specificationVO; - } - - CategorySpecification categorySpecification = categorySpecificationService.getOne(new LambdaQueryWrapper().eq(CategorySpecification::getSpecificationId, specification.getId())); - if (categorySpecification == null) { - categorySpecification = new CategorySpecification(); - categorySpecification.setSpecificationId(specification.getId()); - String categoryPath = specificationVO.getCategoryPath(); - if (CharSequenceUtil.isNotEmpty(categoryPath)) { - categorySpecification.setCategoryId(categoryPath.substring(categoryPath.lastIndexOf(",") + 1)); - categorySpecificationService.save(categorySpecification); - } - } - if (CharSequenceUtil.isNotEmpty(specificationVO.getSpecValue())) { - specValuesService.saveSpecValue(specificationVO.getId(), new String[]{specificationVO.getSpecValue()}); - } - return specification; - } - - @Override - public boolean updateSpecification(SpecificationVO specificationVO) { - this.getSpecification(specificationVO.getId()); - return this.updateById(specificationVO); - } @Override public boolean deleteSpecification(List ids) { + boolean result = false; for (String id : ids) { //如果此规格绑定分类则不允许删除 List list = categorySpecificationService.list(new QueryWrapper().eq("specification_id", id)); if (!list.isEmpty()) { - throw new ServiceException(ResultCode.SPEC_DELETE_ERROR); + List categoryIds = new ArrayList<>(); + list.forEach(item -> categoryIds.add(item.getCategoryId())); + throw new ServiceException(ResultCode.SPEC_DELETE_ERROR, + JSONUtil.toJsonStr(categoryService.getCategoryNameByIds(categoryIds))); } //删除规格 - this.removeById(id); - //删除规格值 - specValuesService.remove(new QueryWrapper().eq("spec_id", id)); + result = this.removeById(id); } - return true; + return result; } - @Autowired - public void setSpecValuesService(SpecValuesService specValuesService) { - this.specValuesService = specValuesService; - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreGoodsLabelServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StoreGoodsLabelServiceImpl.java similarity index 50% rename from framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreGoodsLabelServiceImpl.java rename to framework/src/main/java/cn/lili/modules/goods/serviceimpl/StoreGoodsLabelServiceImpl.java index 7b5398d4..39e0d628 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreGoodsLabelServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StoreGoodsLabelServiceImpl.java @@ -1,41 +1,56 @@ -package cn.lili.modules.store.serviceimpl; +package cn.lili.modules.goods.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.modules.store.entity.dos.StoreGoodsLabel; -import cn.lili.modules.store.entity.vos.StoreGoodsLabelVO; -import cn.lili.modules.store.mapper.StoreGoodsLabelMapper; -import cn.lili.modules.store.service.StoreGoodsLabelService; +import cn.lili.modules.goods.entity.dos.StoreGoodsLabel; +import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO; +import cn.lili.modules.goods.mapper.StoreGoodsLabelMapper; +import cn.lili.modules.goods.service.StoreGoodsLabelService; 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.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Map; /** * 店铺商品分类业务层实现 * * @author Bulbasaur - * @date 2020-03-07 16:18:56 + * @since 2020-03-07 16:18:56 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreGoodsLabelServiceImpl extends ServiceImpl implements StoreGoodsLabelService { - private final StoreGoodsLabelMapper storeGoodsLabelMapper; + /** + * 缓存 + */ + @Autowired + private Cache cache; @Override public List listByStoreId(String storeId) { - //TODO 从缓存获取店铺商品分类列表 + + //从缓存中获取店铺分类 + if (cache.hasKey(CachePrefix.STORE_CATEGORY.getPrefix() + storeId)) { + return (List) cache.get(CachePrefix.STORE_CATEGORY.getPrefix() + storeId); + } + List list = list(storeId); List storeGoodsLabelVOList = new ArrayList<>(); + //循环列表判断是否为顶级,如果为顶级获取下级数据 list.stream() .filter(storeGoodsLabel -> storeGoodsLabel.getLevel() == 0) @@ -43,20 +58,86 @@ public class StoreGoodsLabelServiceImpl extends ServiceImpl storeGoodsLabelVOChildList = new ArrayList<>(); list.stream() - .filter(label -> label.getParentId().equals(storeGoodsLabel.getId())) + .filter(label -> label.getParentId() != null && label.getParentId().equals(storeGoodsLabel.getId())) .forEach(storeGoodsLabelChild -> storeGoodsLabelVOChildList.add(new StoreGoodsLabelVO(storeGoodsLabelChild.getId(), storeGoodsLabelChild.getLabelName(), storeGoodsLabelChild.getLevel(), storeGoodsLabelChild.getSortOrder()))); + storeGoodsLabelVOChildList.sort(Comparator.comparing(StoreGoodsLabelVO::getSortOrder)); storeGoodsLabelVO.setChildren(storeGoodsLabelVOChildList); storeGoodsLabelVOList.add(storeGoodsLabelVO); }); + + //调整店铺分类排序 + storeGoodsLabelVOList.sort(Comparator.comparing(StoreGoodsLabelVO::getSortOrder)); + + if (!storeGoodsLabelVOList.isEmpty()) { + cache.put(CachePrefix.CATEGORY.getPrefix() + storeId, storeGoodsLabelVOList); + } return storeGoodsLabelVOList; } + /** + * 根据分类id集合获取所有店铺分类根据层级排序 + * + * @param ids 商家ID + * @return 店铺分类列表 + */ @Override - public List listByStore() { + public List listByStoreIds(List ids) { + return this.list(new LambdaQueryWrapper().in(StoreGoodsLabel::getId, ids).orderByAsc(StoreGoodsLabel::getLevel)); + } + + @Override + public List> listMapsByStoreIds(List ids, String columns) { + QueryWrapper queryWrapper = new QueryWrapper().in("id", ids).orderByAsc("level"); + queryWrapper.select(columns); + return this.listMaps(queryWrapper); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public StoreGoodsLabel addStoreGoodsLabel(StoreGoodsLabel storeGoodsLabel) { //获取当前登录商家账号 AuthUser tokenUser = UserContext.getCurrentUser(); - //返回列表 - return list(tokenUser.getId()); + if (tokenUser == null || CharSequenceUtil.isEmpty(tokenUser.getStoreId())) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + storeGoodsLabel.setStoreId(tokenUser.getStoreId()); + //保存店铺分类 + this.save(storeGoodsLabel); + //清除缓存 + removeCache(storeGoodsLabel.getStoreId()); + return storeGoodsLabel; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public StoreGoodsLabel editStoreGoodsLabel(StoreGoodsLabel storeGoodsLabel) { + //修改当前店铺的商品分类 + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null || CharSequenceUtil.isEmpty(tokenUser.getStoreId())) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(StoreGoodsLabel::getStoreId, tokenUser.getStoreId()); + lambdaUpdateWrapper.eq(StoreGoodsLabel::getId, storeGoodsLabel.getId()); + //修改店铺分类 + this.update(storeGoodsLabel, lambdaUpdateWrapper); + //清除缓存 + removeCache(storeGoodsLabel.getStoreId()); + return storeGoodsLabel; + } + + @Override + public void removeStoreGoodsLabel(String storeLabelId) { + + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null || CharSequenceUtil.isEmpty(tokenUser.getStoreId())) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + //删除店铺分类 + this.removeById(storeLabelId); + + //清除缓存 + removeCache(tokenUser.getStoreId()); } /** @@ -68,31 +149,14 @@ public class StoreGoodsLabelServiceImpl extends ServiceImpl list(String storeId) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(StoreGoodsLabel::getStoreId, storeId); - return storeGoodsLabelMapper.selectList(queryWrapper); + queryWrapper.orderByDesc(StoreGoodsLabel::getSortOrder); + return this.baseMapper.selectList(queryWrapper); } - @Override - public StoreGoodsLabel addStoreGoodsLabel(StoreGoodsLabel storeGoodsLabel) { - //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); - storeGoodsLabel.setStoreId(tokenUser.getStoreId()); - storeGoodsLabelMapper.insert(storeGoodsLabel); - return storeGoodsLabel; - } - - @Override - public StoreGoodsLabel editStoreGoodsLabel(StoreGoodsLabel storeGoodsLabel) { - //修改当前店铺的商品分类 - AuthUser tokenUser = UserContext.getCurrentUser(); - LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); - lambdaUpdateWrapper.eq(StoreGoodsLabel::getStoreId, tokenUser.getStoreId()); - lambdaUpdateWrapper.eq(StoreGoodsLabel::getId, storeGoodsLabel.getId()); - storeGoodsLabelMapper.update(storeGoodsLabel, lambdaUpdateWrapper); - return storeGoodsLabel; - } - - @Override - public void removeStoreGoodsLabel(String storeLabelId) { - storeGoodsLabelMapper.deleteById(storeLabelId); + /** + * 清除缓存 + */ + private void removeCache(String storeId) { + cache.remove(CachePrefix.STORE_CATEGORY.getPrefix() + storeId); } } diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StudioCommodityServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StudioCommodityServiceImpl.java new file mode 100644 index 00000000..fb88dd7f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StudioCommodityServiceImpl.java @@ -0,0 +1,17 @@ +package cn.lili.modules.goods.serviceimpl; + +import cn.lili.modules.goods.entity.dos.StudioCommodity; +import cn.lili.modules.goods.mapper.StudioCommodityMapper; +import cn.lili.modules.goods.service.StudioCommodityService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 直播间-商品关联业务层实现 + * + * @author Bulbasaur + * @since 2021/5/17 3:20 下午 + */ +@Service +public class StudioCommodityServiceImpl extends ServiceImpl implements StudioCommodityService { +} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StudioServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StudioServiceImpl.java new file mode 100644 index 00000000..540a1f11 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/StudioServiceImpl.java @@ -0,0 +1,256 @@ +package cn.lili.modules.goods.serviceimpl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.DateUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.Goods; +import cn.lili.modules.goods.entity.dos.Studio; +import cn.lili.modules.goods.entity.dos.StudioCommodity; +import cn.lili.modules.goods.entity.enums.StudioStatusEnum; +import cn.lili.modules.goods.entity.vos.StudioVO; +import cn.lili.modules.goods.mapper.CommodityMapper; +import cn.lili.modules.goods.mapper.StudioMapper; +import cn.lili.modules.goods.service.GoodsService; +import cn.lili.modules.goods.service.StudioCommodityService; +import cn.lili.modules.goods.service.StudioService; +import cn.lili.modules.goods.util.WechatLivePlayerUtil; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.trigger.enums.DelayTypeEnums; +import cn.lili.trigger.interfaces.TimeTrigger; +import cn.lili.trigger.message.BroadcastMessage; +import cn.lili.trigger.model.TimeExecuteConstant; +import cn.lili.trigger.model.TimeTriggerMsg; +import cn.lili.trigger.util.DelayQueueTools; +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 小程序直播间业务层实现 + * + * @author Bulbasaur + * @since 2021/5/17 10:04 上午 + */ +@Service +public class StudioServiceImpl extends ServiceImpl implements StudioService { + + @Autowired + private WechatLivePlayerUtil wechatLivePlayerUtil; + @Autowired + private StudioCommodityService studioCommodityService; + @Resource + private CommodityMapper commodityMapper; + @Autowired + private TimeTrigger timeTrigger; + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + @Autowired + private GoodsService goodsService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean create(Studio studio) { + studio.setStoreId(Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId()); + //创建小程序直播 + Map roomMap = wechatLivePlayerUtil.create(studio); + studio.setRoomId(Convert.toInt(roomMap.get("roomId"))); + studio.setQrCodeUrl(roomMap.get("qrcodeUrl")); + studio.setStatus(StudioStatusEnum.NEW.name()); + //直播间添加成功发送直播间开启、关闭延时任务 + if (this.save(studio)) { + //直播开启延时任务 + BroadcastMessage broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.START.name()); + TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.BROADCAST_EXECUTOR, + Long.parseLong(studio.getStartTime()) * 1000L, + broadcastMessage, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + rocketmqCustomProperties.getPromotionTopic()); + + //发送促销活动开始的延时任务 + this.timeTrigger.addDelay(timeTriggerMsg); + + //直播结束延时任务 + broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.END.name()); + timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.BROADCAST_EXECUTOR, + Long.parseLong(studio.getEndTime()) * 1000L, broadcastMessage, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + rocketmqCustomProperties.getPromotionTopic()); + //发送促销活动开始的延时任务 + this.timeTrigger.addDelay(timeTriggerMsg); + } + return true; + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean edit(Studio studio) { + Studio oldStudio = this.getById(studio.getId()); + wechatLivePlayerUtil.editRoom(studio); + if (this.updateById(studio)) { + //发送更新延时任务 + //直播间开始 + BroadcastMessage broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.START.name()); + this.timeTrigger.edit( + TimeExecuteConstant.BROADCAST_EXECUTOR, + broadcastMessage, + Long.parseLong(oldStudio.getStartTime()) * 1000L, + Long.parseLong(studio.getStartTime()) * 1000L, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + DateUtil.getDelayTime(Long.parseLong(studio.getStartTime())), + rocketmqCustomProperties.getPromotionTopic()); + + //直播间结束 + broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.END.name()); + this.timeTrigger.edit( + TimeExecuteConstant.BROADCAST_EXECUTOR, + broadcastMessage, + Long.parseLong(oldStudio.getEndTime()) * 1000L, + Long.parseLong(studio.getEndTime()) * 1000L, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + DateUtil.getDelayTime(Long.parseLong(studio.getEndTime())), + rocketmqCustomProperties.getPromotionTopic()); + } + return true; + } + + @Override + public StudioVO getStudioVO(String id) { + StudioVO studioVO = new StudioVO(); + Studio studio = this.getById(id); + //获取直播间信息 + BeanUtil.copyProperties(studio, studioVO); + //获取直播间商品信息 + studioVO.setCommodityList(commodityMapper.getCommodityByRoomId(studioVO.getRoomId())); + return studioVO; + } + + @Override + public String getLiveInfo(Integer roomId) { + Studio studio = this.getByRoomId(roomId); + //获取直播间并判断回放内容是否为空,如果为空则获取直播间回放并保存 + if (studio.getMediaUrl() != null) { + return studio.getMediaUrl(); + } else { + String mediaUrl = wechatLivePlayerUtil.getLiveInfo(roomId); + studio.setMediaUrl(mediaUrl); + this.save(studio); + return mediaUrl; + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean push(Integer roomId, Integer liveGoodsId, String storeId, String goodsId) { + + //判断直播间是否已添加商品 + if (studioCommodityService.getOne( + new LambdaQueryWrapper().eq(StudioCommodity::getRoomId, roomId) + .eq(StudioCommodity::getGoodsId, liveGoodsId)) != null) { + throw new ServiceException(ResultCode.STODIO_GOODS_EXIST_ERROR); + } + + Goods goods = goodsService.getOne(new LambdaQueryWrapper().eq(Goods::getId, goodsId).eq(Goods::getStoreId, storeId)); + if (goods == null) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + + //调用微信接口添加直播间商品并进行记录 + if (Boolean.TRUE.equals(wechatLivePlayerUtil.pushGoods(roomId, liveGoodsId))) { + studioCommodityService.save(new StudioCommodity(roomId, liveGoodsId)); + //添加直播间商品数量 + Studio studio = this.getByRoomId(roomId); + studio.setRoomGoodsNum(studio.getRoomGoodsNum() != null ? studio.getRoomGoodsNum() + 1 : 1); + //设置直播间默认的商品(前台展示)只展示两个 + if (studio.getRoomGoodsNum() < 3) { + studio.setRoomGoodsList(JSONUtil.toJsonStr(commodityMapper.getSimpleCommodityByRoomId(roomId))); + } + return this.updateById(studio); + } + return false; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean goodsDeleteInRoom(Integer roomId, Integer goodsId, String storeId) { + Goods goods = goodsService.getOne(new LambdaQueryWrapper().eq(Goods::getId, goodsId).eq(Goods::getStoreId, storeId)); + if (goods == null) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + //调用微信接口删除直播间商品并进行记录 + if (Boolean.TRUE.equals(wechatLivePlayerUtil.goodsDeleteInRoom(roomId, goodsId))) { + studioCommodityService.remove(new QueryWrapper().eq("room_id", roomId).eq("goods_id", goodsId)); + //减少直播间商品数量 + Studio studio = this.getByRoomId(roomId); + studio.setRoomGoodsNum(studio.getRoomGoodsNum() - 1); + //设置直播间默认的商品(前台展示)只展示两个 + if (studio.getRoomGoodsNum() < 3) { + studio.setRoomGoodsList(JSONUtil.toJsonStr(commodityMapper.getSimpleCommodityByRoomId(roomId))); + } + return this.updateById(studio); + } + return false; + } + + @Override + public IPage studioList(PageVO pageVO, Integer recommend, String status) { + QueryWrapper queryWrapper = new QueryWrapper() + .eq(recommend != null, "recommend", true) + .eq(CharSequenceUtil.isNotEmpty(status), "status", status) + .orderByDesc("create_time"); + if (UserContext.getCurrentUser() != null && UserContext.getCurrentUser().getRole().equals(UserEnums.STORE)) { + queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); + } + Page page = this.page(PageUtil.initPage(pageVO), queryWrapper); + List records = page.getRecords(); + List studioVOS = new ArrayList<>(); + for (Studio record : records) { + StudioVO studioVO = new StudioVO(); + //获取直播间信息 + BeanUtil.copyProperties(record, studioVO); + //获取直播间商品信息 + studioVO.setCommodityList(commodityMapper.getCommodityByRoomId(studioVO.getRoomId())); + studioVOS.add(studioVO); + } + page.setRecords(studioVOS); + return page; + + } + + @Override + public void updateStudioStatus(BroadcastMessage broadcastMessage) { + this.update(new LambdaUpdateWrapper() + .eq(Studio::getId, broadcastMessage.getStudioId()) + .set(Studio::getStatus, broadcastMessage.getStatus())); + } + + /** + * 根据直播间ID获取直播间 + * + * @param roomId 直播间ID + * @return 直播间 + */ + private Studio getByRoomId(Integer roomId) { + return this.getOne(new LambdaQueryWrapper().eq(Studio::getRoomId, roomId)); + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/WholesaleServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/WholesaleServiceImpl.java new file mode 100644 index 00000000..d95edebf --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/WholesaleServiceImpl.java @@ -0,0 +1,84 @@ +package cn.lili.modules.goods.serviceimpl; + +import cn.hutool.core.collection.CollUtil; +import cn.lili.cache.Cache; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.goods.entity.dos.Wholesale; +import cn.lili.modules.goods.mapper.WholesaleMapper; +import cn.lili.modules.goods.service.WholesaleService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author paulG + * @since 2022/5/24 + **/ +@Service +@CacheConfig(cacheNames = "{wholesale}_") +public class WholesaleServiceImpl extends ServiceImpl implements WholesaleService { + + @Autowired + private Cache> cache; + + @Override + @Cacheable(key = "#goodsId") + public List findByGoodsId(String goodsId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Wholesale::getGoodsId, goodsId); + return this.list(queryWrapper).stream().sorted(Comparator.comparing(Wholesale::getNum)).collect(Collectors.toList()); + } + + @Override + @Cacheable(key = "#templateId+'_template'") + public List findByTemplateId(String templateId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Wholesale::getTemplateId, templateId); + return this.list(queryWrapper).stream().sorted(Comparator.comparing(Wholesale::getNum)).collect(Collectors.toList()); + } + + @Override + @CacheEvict(key = "#templateId+'_template'") + public Boolean removeByTemplateId(String templateId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Wholesale::getTemplateId, templateId); + cache.remove("{wholesale}_" + templateId + "_template"); + return this.remove(queryWrapper); + } + + @Override + @CacheEvict(key = "#goodsId") + public Boolean removeByGoodsId(String goodsId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Wholesale::getGoodsId, goodsId); + cache.remove("{wholesale}_" + goodsId); + return this.remove(queryWrapper); + } + + @Override + public Wholesale match(String goodsId, Integer num) { + List wholesaleList = cache.get("{wholesale}_" + goodsId); + if (wholesaleList == null) { + wholesaleList = this.findByGoodsId(goodsId); + cache.put("{wholesale}_" + goodsId, wholesaleList); + } + List matchList = wholesaleList.stream() + .filter(wholesale -> wholesale.getNum() <= num) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(matchList)) { + return matchList.get(matchList.size() - 1); + } else if (CollUtil.isNotEmpty(wholesaleList) && CollUtil.isEmpty(matchList)) { + throw new ServiceException(ResultCode.DO_NOT_MATCH_WHOLESALE); + } + return null; + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/sku/GoodsSkuBuilder.java b/framework/src/main/java/cn/lili/modules/goods/sku/GoodsSkuBuilder.java new file mode 100644 index 00000000..f7fb9771 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/sku/GoodsSkuBuilder.java @@ -0,0 +1,97 @@ +package cn.lili.modules.goods.sku; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONUtil; +import cn.lili.modules.goods.entity.dos.Goods; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * @author paulG + * @since 2022/5/20 + **/ +@Component +public class GoodsSkuBuilder { + + + private static final String IMAGES_KEY = "images"; + + + /** + * 构建商品sku + * + * @param goods 商品 + * @param skuInfo sku信息列表 + * @return 商品sku + */ + public static GoodsSku build(Goods goods, Map skuInfo) { + GoodsSku goodsSku = new GoodsSku(goods); + builderSingle(goodsSku, skuInfo); + return goodsSku; + } + + /** + * 批量构建商品sku + * + * @param goods 商品 + * @return 商品sku + */ + public static List buildBatch(Goods goods, List> skuList) { + Assert.notEmpty(skuList, "skuList不能为空"); + Assert.notNull(goods, "goods不能为空"); + List goodsSkus = new ArrayList<>(); + for (Map skuInfo : skuList) { + GoodsSku goodsSku = new GoodsSku(goods); + builderSingle(goodsSku, skuInfo); + goodsSkus.add(goodsSku); + } + return goodsSkus; + } + + + private static void builderSingle(GoodsSku goodsSku, Map skuInfo) { + Assert.notNull(goodsSku, "goodsSku不能为空"); + Assert.notEmpty(skuInfo, "skuInfo不能为空"); + //规格简短信息 + StringBuilder simpleSpecs = new StringBuilder(); + //商品名称 + StringBuilder goodsName = new StringBuilder(goodsSku.getGoodsName()); + //规格值 + Map specMap = new LinkedHashMap<>(); + + // 原始规格项 + String[] ignoreOriginKeys = {"id", "sn", "cost", "price", "quantity", "weight"}; + //获取规格信息 + for (Map.Entry spec : skuInfo.entrySet()) { + //保存新增规格信息 + if (!CollUtil.contains(Arrays.asList(ignoreOriginKeys), spec.getKey()) && spec.getValue() != null) { + specMap.put(spec.getKey(), spec.getValue()); + if (!spec.getKey().equals(IMAGES_KEY)) { + //设置商品名称 + goodsName.append(" ").append(spec.getValue()); + //规格简短信息 + simpleSpecs.append(" ").append(spec.getValue()); + } + } + } + //设置规格信息 + goodsSku.setGoodsName(goodsName.toString()); + + + //规格信息 + goodsSku.setId(Convert.toStr(skuInfo.get("id"), "")); + goodsSku.setSn(Convert.toStr(skuInfo.get("sn"))); + goodsSku.setWeight(Convert.toDouble(skuInfo.get("weight"), 0D)); + goodsSku.setPrice(Convert.toDouble(skuInfo.get("price"), 0D)); + goodsSku.setCost(Convert.toDouble(skuInfo.get("cost"), 0D)); + goodsSku.setQuantity(Convert.toInt(skuInfo.get("quantity"), 0)); + goodsSku.setSpecs(JSONUtil.toJsonStr(specMap)); + goodsSku.setSimpleSpecs(simpleSpecs.toString()); + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/sku/render/SalesModelRender.java b/framework/src/main/java/cn/lili/modules/goods/sku/render/SalesModelRender.java new file mode 100644 index 00000000..cc1f4591 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/sku/render/SalesModelRender.java @@ -0,0 +1,23 @@ +package cn.lili.modules.goods.sku.render; + +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; + +import java.util.List; + +/** + * 根据商品销售模型渲染商品sku + * + * @author paulG + * @since 2022/5/20 + **/ +public interface SalesModelRender { + + + String getSalesMode(); + + void renderSingle(GoodsSku goodsSku, GoodsOperationDTO goodsOperationDTO); + + void renderBatch(List goodsSkus, GoodsOperationDTO goodsOperationDTO); + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/sku/render/impl/WholesaleSaleModelRenderImpl.java b/framework/src/main/java/cn/lili/modules/goods/sku/render/impl/WholesaleSaleModelRenderImpl.java new file mode 100644 index 00000000..d34a4ac2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/sku/render/impl/WholesaleSaleModelRenderImpl.java @@ -0,0 +1,85 @@ +package cn.lili.modules.goods.sku.render.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dos.Wholesale; +import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; +import cn.lili.modules.goods.entity.dto.WholesaleDTO; +import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; +import cn.lili.modules.goods.service.WholesaleService; +import cn.lili.modules.goods.sku.render.SalesModelRender; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author paulG + * @since 2022/5/24 + **/ +@Component +public class WholesaleSaleModelRenderImpl implements SalesModelRender { + /** + * 批发商品 + */ + @Autowired + private WholesaleService wholesaleService; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void renderSingle(GoodsSku goodsSku, GoodsOperationDTO goodsOperationDTO) { + Assert.notEmpty(goodsOperationDTO.getWholesaleList(), "批发规则不能为空"); + this.checkWholesaleList(goodsOperationDTO.getWholesaleList(), goodsSku); + List collect = goodsOperationDTO.getWholesaleList().stream().sorted(Comparator.comparing(Wholesale::getPrice)).collect(Collectors.toList()); + wholesaleService.removeByGoodsId(goodsSku.getGoodsId()); + wholesaleService.saveOrUpdateBatch(collect); + goodsSku.setPrice(collect.get(0).getPrice()); + goodsSku.setCost(collect.get(0).getPrice()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void renderBatch(List goodsSkus, GoodsOperationDTO goodsOperationDTO) { + Assert.notEmpty(goodsOperationDTO.getWholesaleList(), "批发规则不能为空"); + this.checkWholesaleList(goodsOperationDTO.getWholesaleList(), goodsSkus.get(0)); + List collect = goodsOperationDTO.getWholesaleList().stream().sorted(Comparator.comparing(Wholesale::getPrice)).collect(Collectors.toList()); + for (GoodsSku skus : goodsSkus) { + skus.setPrice(collect.get(0).getPrice()); + skus.setCost(collect.get(0).getPrice()); + } + if (Boolean.TRUE.equals(goodsOperationDTO.getGoodsTemplateFlag())) { + wholesaleService.removeByTemplateId(goodsSkus.get(0).getGoodsId()); + } else { + wholesaleService.removeByGoodsId(goodsSkus.get(0).getGoodsId()); + } + wholesaleService.saveOrUpdateBatch(collect); + } + + private void checkWholesaleList(List wholesaleList, GoodsSku goodsSku) { + if (CollUtil.isEmpty(wholesaleList)) { + throw new ServiceException(ResultCode.MUST_HAVE_SALES_MODEL); + } + for (WholesaleDTO wholesaleDTO : wholesaleList) { + if (wholesaleDTO.getPrice() == null || wholesaleDTO.getPrice() <= 0 || wholesaleDTO.getNum() == null || wholesaleDTO.getNum() <= 0) { + throw new ServiceException(ResultCode.HAVE_INVALID_SALES_MODEL); + } + if (CharSequenceUtil.isEmpty(wholesaleDTO.getGoodsId())) { + wholesaleDTO.setGoodsId(goodsSku.getGoodsId()); + } + + } + } + + @Override + public String getSalesMode() { + return GoodsSalesModeEnum.WHOLESALE.name(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/util/WechatLivePlayerUtil.java b/framework/src/main/java/cn/lili/modules/goods/util/WechatLivePlayerUtil.java new file mode 100644 index 00000000..59a05ca4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/util/WechatLivePlayerUtil.java @@ -0,0 +1,245 @@ +package cn.lili.modules.goods.util; + +import cn.hutool.json.JSONObject; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.HttpUtils; +import cn.lili.modules.goods.entity.dos.Commodity; +import cn.lili.modules.goods.entity.dos.Studio; +import cn.lili.modules.goods.entity.dto.GoodsInfo; +import cn.lili.modules.wechat.util.WechatAccessTokenUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 微信小程序直播工具类 + * + * @author Bulbasaur + * @since 2021/5/17 10:16 上午 + */ +@Slf4j +@Component +public class WechatLivePlayerUtil { + + @Autowired + private WechatAccessTokenUtil wechatAccessTokenUtil; + @Autowired + private WechatMediaUtil wechatMediaUtil; + + /** + * 创建小程序直播间 + * + * @param studio 小程序直播 + * @return 房间ID + */ + public Map create(Studio studio) { + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token="; + //添加直播间 + Map map = this.mockRoom(studio); + JSONObject json = this.doPostWithJson(url, map); + Map roomMap = new HashMap<>(2); + roomMap.put("roomId", json.getStr("roomId")); + roomMap.put("qrcodeUrl", json.getStr("qrcode_url")); + return roomMap; + } + + /** + * 创建小程序直播间 + * + * @param studio 小程序直播 + * @return 房间ID + */ + public boolean editRoom(Studio studio) { + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/editroom?access_token="; + + //修改直播间 + Map map = this.mockRoom(studio); + map.put("id", studio.getRoomId().toString()); + this.doPostWithJson(url, map); + return true; + } + + + /** + * 获取直播间回放 + * + * @param roomId 房间ID + * @return 回放地址 + */ + public String getLiveInfo(Integer roomId) { + //发送url + String url = "https://api.weixin.qq.com/wxa/business/getliveinfo?access_token="; + Map map = new HashMap<>(16); + //获取回放 + map.put("action", "get_replay"); + //直播间ID + map.put("room_id", roomId); + //起始拉取视频,0表示从第一个视频片段开始拉取 + map.put("start", "0"); + //每次拉取的数量,建议100以内 + map.put("limit", "1"); + JSONObject json = this.doPostWithJson(url, map); + //TODO get media_url + return json.getStr("live_replay"); + } + + /** + * 推送直播间商品 + * + * @param roomId 房间ID + * @param goodsId 商品ID + * @return 操作结果 + */ + public Boolean pushGoods(Integer roomId, Integer goodsId) { + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token="; + Map map = new HashMap<>(16); + //直播间回放 + Integer[] ids = {goodsId}; + map.put("ids", ids); + //商品ID + map.put("roomId", roomId); + this.doPostWithJson(url, map); + return true; + } + + /** + * 删除直播间商品 + * + * @param roomId 房间ID + * @param goodsId 商品ID + * @return 操作结果 + */ + public Boolean goodsDeleteInRoom(Integer roomId, Integer goodsId) { + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/deleteInRoom?access_token="; + Map map = new HashMap<>(2); + //直播间回放 + map.put("goodsId", goodsId); + //商品ID + map.put("roomId", roomId); + this.doPostWithJson(url, map); + return true; + + } + + /** + * 添加直播商品 + * + * @param commodity 直播商品 + * @return 添加结果 + */ + public JSONObject addGoods(Commodity commodity) { + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token="; + + //商品名称,最长14个汉字 + if (commodity.getName().length() > 14) { + commodity.setName(commodity.getName().substring(0, 13)); + } + + //新建微信商品DTO + GoodsInfo goodsInfo = new GoodsInfo(commodity); + //上传微信临时图片 + goodsInfo.setCoverImgUrl(wechatMediaUtil.uploadMedia("image", commodity.getGoodsImage())); + Map map = new HashMap<>(2); + //调用新增直播商品接口 + map.put("goodsInfo", goodsInfo); + return this.doPostWithJson(url, map); + } + + /** + * 删除直播商品 + * + * @param goodsId 商品ID + * @return 删除结果 + */ + public JSONObject deleteGoods(String goodsId) { + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token="; + Map map = new HashMap<>(2); + map.put("goodsId", goodsId); + return this.doPostWithJson(url, map); + } + + /** + * 查询直播商品状态 + * + * @param goodsIdList 商品ID列表 + * @return 删除结果 + */ + public JSONObject getGoodsWareHouse(List goodsIdList) { + //发送url + String url = "https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token="; + Map map = new HashMap<>(2); + map.put("goods_ids", goodsIdList); + return this.doPostWithJson(url, map); + } + + /** + * 请求微信接口 + * + * @param url 链接 + * @param map 参数 + * @return 返回内容 + */ + private JSONObject doPostWithJson(String url, Map map) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //请求链接添加token + url += token; + //发起请求 + String content = HttpUtils.doPostWithJson(url, map); + //记录请求结果 + log.info("微信小程序请求结果:" + content); + //获取请求内容,如果token过期则重新获取,如果出错则抛出错误 + JSONObject jsonObject = new JSONObject(content); + if (("0").equals(jsonObject.get("errcode").toString())) { + return jsonObject; + } else if (("40001").equals(jsonObject.get("errcode"))) { + wechatAccessTokenUtil.removeAccessToken(ClientTypeEnum.WECHAT_MP); + return this.doPostWithJson(url, map); + } else { + throw new ServiceException(jsonObject.get("errmsg").toString()); + } + } + + private Map mockRoom(Studio studio) { + Map map = new HashMap<>(16); + //背景图 + map.put("coverImg", wechatMediaUtil.uploadMedia("image", studio.getCoverImg())); + //分享图 + map.put("shareImg", wechatMediaUtil.uploadMedia("image", studio.getShareImg())); + //购物直播频道封面图 + map.put("feedsImg", wechatMediaUtil.uploadMedia("image", studio.getFeedsImg())); + //直播间名字 + map.put("name", studio.getName()); + //直播计划开始时间 + map.put("startTime", studio.getStartTime()); + //直播计划结束时间 + map.put("endTime", studio.getEndTime()); + //主播昵称 + map.put("anchorName", studio.getAnchorName()); + //主播微信号 + map.put("anchorWechat", studio.getAnchorWechat()); + //直播间类型 + map.put("type", "0"); + //是否关闭点赞 + map.put("closeLike", "0"); + //是否关闭货架 + map.put("closeGoods", "0"); + //是否关闭评论 + map.put("closeComment", "0"); + //直播间名字 + map.put("closeReplay", "0"); + + return map; + } +} diff --git a/framework/src/main/java/cn/lili/modules/goods/util/WechatMediaUtil.java b/framework/src/main/java/cn/lili/modules/goods/util/WechatMediaUtil.java new file mode 100644 index 00000000..d94dcdfe --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/util/WechatMediaUtil.java @@ -0,0 +1,146 @@ +package cn.lili.modules.goods.util; + +import cn.hutool.json.JSONObject; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.wechat.util.WechatAccessTokenUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * 微信媒体工具 + * + * @author Bulbasaur + * @since 2021/5/19 8:02 下午 + */ +@Slf4j +@Component +public class WechatMediaUtil { + @Autowired + private WechatAccessTokenUtil wechatAccessTokenUtil; + + /** + * 上传多媒体数据到微信服务器 + * + * @param mediaFileUrl 来自网络上面的媒体文件地址 + * @return + */ + public String uploadMedia(String type, String mediaFileUrl) { + //获取token + String accessToken = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + /* + * 上传媒体文件到微信服务器需要请求的地址 + */ + String MEDIA_URL = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"; + + StringBuffer resultStr = null; + //拼装url地址 + String mediaStr = MEDIA_URL.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type); + URL mediaUrl; + try { + String boundary = "----WebKitFormBoundaryOYXo8heIv9pgpGjT"; + URL url = new URL(mediaStr); + HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); + //让输入输出流开启 + urlConn.setDoInput(true); + urlConn.setDoOutput(true); + //使用post方式请求的时候必须关闭缓存 + urlConn.setUseCaches(false); + //设置请求头的Content-Type属性 + urlConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); + urlConn.setRequestMethod("POST"); + //获取输出流,使用输出流拼接请求体 + OutputStream out = urlConn.getOutputStream(); + + //读取文件的数据,构建一个GET请求,然后读取指定地址中的数据 + mediaUrl = new URL(mediaFileUrl); + HttpURLConnection mediaConn = (HttpURLConnection) mediaUrl.openConnection(); + //设置请求方式 + mediaConn.setRequestMethod("GET"); + //设置可以打开输入流 + mediaConn.setDoInput(true); + //获取传输的数据类型 + String contentType = mediaConn.getHeaderField("Content-Type"); + //将获取大到的类型转换成扩展名 + String fileExt = judgeType(contentType); + //获取输入流,从mediaURL里面读取数据 + InputStream in = mediaConn.getInputStream(); + BufferedInputStream bufferedIn = new BufferedInputStream(in); + //数据读取到这个数组里面 + byte[] bytes = new byte[1024]; + int size = 0; + //使用outputStream流输出信息到请求体当中去 + out.write(("--" + boundary + "\r\n").getBytes()); + out.write(("Content-Disposition: form-data; name=\"media\";\r\n" + + "filename=\"" + (System.currentTimeMillis()) + fileExt + "\"\r\n" + + "Content-Type: " + contentType + "\r\n\r\n").getBytes()); + while ((size = bufferedIn.read(bytes)) != -1) { + out.write(bytes, 0, size); + } + //切记,这里的换行符不能少,否则将会报41005错误 + out.write(("\r\n--" + boundary + "--\r\n").getBytes()); + + bufferedIn.close(); + in.close(); + mediaConn.disconnect(); + + InputStream resultIn = urlConn.getInputStream(); + InputStreamReader reader = new InputStreamReader(resultIn); + BufferedReader bufferedReader = new BufferedReader(reader); + String tempStr = null; + resultStr = new StringBuffer(); + while ((tempStr = bufferedReader.readLine()) != null) { + resultStr.append(tempStr); + } + bufferedReader.close(); + reader.close(); + resultIn.close(); + urlConn.disconnect(); + } catch (Exception e) { + log.error("微信媒体上传失败", e); + } + assert resultStr != null; + JSONObject jsonObject = new JSONObject(resultStr.toString()); + log.info("微信媒体上传:" + jsonObject); + //判断是否传递成功,如果token过期则重新获取 + if (jsonObject.get("errcode") != null && ("40001").equals(jsonObject.get("errcode"))) { + wechatAccessTokenUtil.removeAccessToken(ClientTypeEnum.WECHAT_MP); + return this.uploadMedia(type, mediaFileUrl); + } else if (jsonObject.get("errcode") != null) { + throw new ServiceException(jsonObject.get("errmsg").toString()); + } else { + return jsonObject.get("media_id").toString(); + } + + } + + /** + * 通过传过来的contentType判断是哪一种类型 + * + * @param contentType 获取来自连接的contentType + * @return + */ + public String judgeType(String contentType) { + String fileExt = ""; + switch (contentType) { + case "image/png": + fileExt = ".png"; + break; + case "image/jpeg": + fileExt = ".jpeg"; + break; + case "image/jpg": + fileExt = ".jpg"; + break; + default: + throw new ServiceException(ResultCode.IMAGE_FILE_EXT_ERROR); + } + return fileExt; + } +} diff --git a/framework/src/main/java/cn/lili/modules/im/config/CustomSpringConfigurator.java b/framework/src/main/java/cn/lili/modules/im/config/CustomSpringConfigurator.java new file mode 100644 index 00000000..d9f825c0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/config/CustomSpringConfigurator.java @@ -0,0 +1,34 @@ +package cn.lili.modules.im.config; + + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import javax.websocket.server.ServerEndpointConfig; + +/** + * CustomSpringConfigurator + * + * @author Chopper + * @version v1.0 + * 2021-12-31 11:53 + */ +public class CustomSpringConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware { + + /** + * Spring application context. + */ + private static volatile BeanFactory context; + + @Override + public T getEndpointInstance(Class clazz) throws InstantiationException { + return context.getBean(clazz); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + CustomSpringConfigurator.context = applicationContext; + } +} diff --git a/framework/src/main/java/cn/lili/modules/im/config/WebSocketConfigurator.java b/framework/src/main/java/cn/lili/modules/im/config/WebSocketConfigurator.java new file mode 100644 index 00000000..c6de471b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/config/WebSocketConfigurator.java @@ -0,0 +1,24 @@ +package cn.lili.modules.im.config; + + +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * WebSocketConfigurator + * + * @author Chopper + * @version v1.0 + * 2021-12-31 11:53 + */ +@ConditionalOnWebApplication +@Configuration +public class WebSocketConfigurator { + + @Bean + public CustomSpringConfigurator customSpringConfigurator() { + // This is just to get context + return new CustomSpringConfigurator(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/dos/ImMessage.java b/framework/src/main/java/cn/lili/modules/im/entity/dos/ImMessage.java new file mode 100644 index 00000000..f381faca --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/dos/ImMessage.java @@ -0,0 +1,69 @@ +package cn.lili.modules.im.entity.dos; + +import cn.lili.common.utils.SnowFlake; +import cn.lili.modules.im.entity.enums.MessageTypeEnum; +import cn.lili.modules.im.entity.vo.MessageOperation; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author Chopper + */ +@Data +@TableName("li_im_message") +@ApiModel(value = "Im消息") +@NoArgsConstructor +@AllArgsConstructor +public class ImMessage extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 发送者 + */ + private String fromUser; + + /** + * 接收者 + */ + private String toUser; + + /** + * 已阅 + */ + private Boolean isRead; + + /** + * 消息类型 + */ + private MessageTypeEnum messageType; + + /** + * 聊天id + */ + private String talkId; + + /** + * 消息实体 + */ + private String text; + + + public ImMessage(MessageOperation messageOperation){ + this.setFromUser(messageOperation.getFrom()); + this.setMessageType(messageOperation.getMessageType()); + this.setIsRead(false); + this.setText(messageOperation.getContext()); + this.setTalkId(messageOperation.getTalkId()); + this.setCreateTime(new Date()); + this.setToUser(messageOperation.getTo()); + this.setId(SnowFlake.getIdStr()); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/entity/dos/ImTalk.java b/framework/src/main/java/cn/lili/modules/im/entity/dos/ImTalk.java new file mode 100644 index 00000000..7452756a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/dos/ImTalk.java @@ -0,0 +1,171 @@ +package cn.lili.modules.im.entity.dos; + + +import cn.lili.common.utils.SnowFlake; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.mybatis.BaseTenantEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author Chopper + */ +@Data +@TableName("li_im_talk") +@ApiModel(value = "聊天") +@NoArgsConstructor +@AllArgsConstructor +public class ImTalk extends BaseTenantEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("用户1 id") + private String userId1; + + @ApiModelProperty("用户2 id") + private String userId2; + + @ApiModelProperty("用户1置顶") + private Boolean top1; + + @ApiModelProperty("用户2置顶") + private Boolean top2; + + @ApiModelProperty("用户1 不可见") + private Boolean disable1; + + @ApiModelProperty("用户2 不可见") + private Boolean disable2; + + @ApiModelProperty("用户1名字") + private String name1; + + @ApiModelProperty("用户2名字") + private String name2; + + @ApiModelProperty("用户1头像") + private String face1; + + @ApiModelProperty("用户2头像") + private String face2; + + @ApiModelProperty("用户1的店铺标识") + private Boolean storeFlag1; + + @ApiModelProperty("用户2的店铺标识") + private Boolean storeFlag2; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "最后聊天时间", hidden = true) + private Date lastTalkTime; + + @ApiModelProperty(value = "最后聊天内容") + private String lastTalkMessage; + + @ApiModelProperty(value = "最后发送消息类型") + private String lastMessageType; + + @ApiModelProperty(value = "坐席Id") + private String tenantId; + + @ApiModelProperty(value = "坐席名称") + private String tenantName; + + + public ImTalk(String userId1, String userId2, + String face1, String face2, + String name1, String name2 + ) { + this.userId1 = userId1; + this.userId2 = userId2; + this.top1 = false; + this.top2 = false; + this.disable1 = false; + this.disable2 = false; + this.storeFlag1 = false; + this.storeFlag2 = false; + this.setId(SnowFlake.getIdStr()); + this.lastTalkTime = new Date(); + this.face1 = face1; + this.face2 = face2; + this.name1 = name1; + this.name2 = name2; + } + + public ImTalk(Member member1,Member member2){ + if(Long.parseLong(member1.getId()) > Long.parseLong(member2.getId())){ + this.userId1 = member2.getId(); + this.userId2 = member1.getId(); + this.top1 = false; + this.top2 = false; + this.disable1 = false; + this.disable2 = false; + this.storeFlag1 = false; + this.storeFlag2 = false; + this.setId(SnowFlake.getIdStr()); + this.lastTalkTime = new Date(); + this.face1 = member2.getFace(); + this.face2 = member1.getFace(); + this.name1 = member2.getNickName(); + this.name2 = member1.getNickName(); + }else{ + this.userId1 = member1.getId(); + this.userId2 = member2.getId(); + this.top1 = false; + this.top2 = false; + this.disable1 = false; + this.disable2 = false; + this.storeFlag1 = false; + this.storeFlag2 = false; + this.setId(SnowFlake.getIdStr()); + this.lastTalkTime = new Date(); + this.face1 = member1.getFace(); + this.face2 = member2.getFace(); + this.name1 = member1.getNickName(); + this.name2 = member2.getNickName(); + } + } + public ImTalk(Member member, Store store){ + if(Long.parseLong(member.getId()) > Long.parseLong(store.getId())){ + this.userId1 = store.getId(); + this.userId2 = member.getId(); + this.top1 = false; + this.top2 = false; + this.disable1 = false; + this.disable2 = false; + this.storeFlag1 = true; + this.storeFlag2 = false; + this.setId(SnowFlake.getIdStr()); + this.lastTalkTime = new Date(); + this.face1 = store.getStoreLogo(); + this.face2 = member.getFace(); + this.name1 = store.getStoreName(); + this.name2 = member.getNickName(); + }else{ + this.userId1 = member.getId(); + this.userId2 = store.getId(); + this.top1 = false; + this.top2 = false; + this.disable1 = false; + this.disable2 = false; + this.storeFlag1 = false; + this.storeFlag2 = true; + this.setId(SnowFlake.getIdStr()); + this.lastTalkTime = new Date(); + this.face1 = member.getFace(); + this.face2 = store.getStoreLogo(); + this.name1 = member.getNickName(); + this.name2 = store.getStoreName(); + } + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/entity/dos/QA.java b/framework/src/main/java/cn/lili/modules/im/entity/dos/QA.java new file mode 100644 index 00000000..0d6bd3f2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/dos/QA.java @@ -0,0 +1,31 @@ +package cn.lili.modules.im.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 问题答案 + * + * @author Chopper + * @version v1.0 + * 2022-02-09 17:59 + */ +@Data +@TableName("li_qa") +@ApiModel(value = "租户问答") +@NoArgsConstructor +public class QA extends BaseEntity { + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "问题") + private String question; + + @ApiModelProperty(value = "答案") + private String answer; +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/dos/Seat.java b/framework/src/main/java/cn/lili/modules/im/entity/dos/Seat.java new file mode 100644 index 00000000..40bdfd84 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/dos/Seat.java @@ -0,0 +1,47 @@ +package cn.lili.modules.im.entity.dos; + +import cn.lili.mybatis.BaseTenantEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; + +/** + * 坐席 + * + * @author Chopper + * @version v1.0 + * 2022-02-09 17:08 + */ +@Data +@TableName("li_seat") +@ApiModel(value = "坐席") +@NoArgsConstructor +public class Seat extends BaseTenantEntity { + + @ApiModelProperty(value = "租户id") + private String tenantId; + + @ApiModelProperty(value = "坐席用户名") + private String username; + + @ApiModelProperty(value = "会员头像") + private String face; + + @ApiModelProperty(value = "坐席密码") + private String password; + + @ApiModelProperty(value = "昵称") + private String nickName; + + @ApiModelProperty(value = "坐席状态") + private Boolean disabled; + + @NotEmpty(message = "手机号码不能为空") + @ApiModelProperty(value = "手机号码", required = true) + private String mobile; + +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/dos/SeatSetting.java b/framework/src/main/java/cn/lili/modules/im/entity/dos/SeatSetting.java new file mode 100644 index 00000000..a462ce7e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/dos/SeatSetting.java @@ -0,0 +1,36 @@ +package cn.lili.modules.im.entity.dos; + +import cn.lili.mybatis.BaseTenantEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 坐席设置 + * + * @author Chopper + * @version v1.0 + * 2022-02-09 17:55 + */ +@Data +@TableName("li_seat_setting") +@ApiModel(value = "坐席设置") +@NoArgsConstructor +public class SeatSetting extends BaseTenantEntity { + + @ApiModelProperty(value = "租户idid") + private String tenantId; + + @ApiModelProperty(value = "欢迎语") + private String welcome; + + @ApiModelProperty(value = "离线自动回复") + private String outLineAutoReply; + + @ApiModelProperty(value = "长时间自动回复") + private String longTermAutoReply; + + +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/dto/ImQueryParams.java b/framework/src/main/java/cn/lili/modules/im/entity/dto/ImQueryParams.java new file mode 100644 index 00000000..8dc1f0fa --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/dto/ImQueryParams.java @@ -0,0 +1,36 @@ +package cn.lili.modules.im.entity.dto; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.vo.PageVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author chc + * @since 2022/6/2114:46 + */ +@Data +@ApiModel +public class ImQueryParams extends PageVO { + + @ApiModelProperty("用户Id") + private String memberId; + + @ApiModelProperty("店铺Id") + private String storeId; + + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (CharSequenceUtil.isNotEmpty(memberId)) { + queryWrapper.eq("member_id", memberId); + } + if (CharSequenceUtil.isNotEmpty(storeId)) { + queryWrapper.eq("store_id", storeId); + } + queryWrapper.eq("delete_flag",false); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/dto/MessageQueryParams.java b/framework/src/main/java/cn/lili/modules/im/entity/dto/MessageQueryParams.java new file mode 100644 index 00000000..372522c1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/dto/MessageQueryParams.java @@ -0,0 +1,50 @@ +package cn.lili.modules.im.entity.dto; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.StringUtils; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.im.entity.dos.ImMessage; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.Data; + +/** + * MessageQueryParams + * + * @author Chopper + * @version v1.0 + * 2022-01-20 17:16 + */ +@Data +public class MessageQueryParams extends PageVO { + /** + * 聊天窗口 + */ + private String talkId; + /** + * 最后一个消息 + */ + private String lastMessageId; + /** + * 获取消息数量 + */ + private Integer num; + + public LambdaQueryWrapper initQueryWrapper() { + if (StringUtils.isEmpty(talkId)) { + throw new ServiceException(ResultCode.ERROR); + } + if (num == null || num > 50) { + num = 50; + } + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ImMessage::getTalkId, talkId); + if (StringUtils.isNotEmpty(lastMessageId)) { + lambdaQueryWrapper.lt(ImMessage::getId, lastMessageId); + } + lambdaQueryWrapper.orderByDesc(ImMessage::getCreateTime); +// lambdaQueryWrapper.last("limit " + num); + return lambdaQueryWrapper; + } +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageResultType.java b/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageResultType.java new file mode 100644 index 00000000..c557a45e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageResultType.java @@ -0,0 +1,30 @@ +package cn.lili.modules.im.entity.enums; + +/** + * 返回消息类型枚举 + * + * @author liushuai + */ +public enum MessageResultType { + /** + * 返回消息类型枚举 + *

+ * 好友列表 + * 增加好友 + * 消息 + * 阅读消息 + * 未读消息 + * 历史消息 + * 系统提示 + * 下线提醒 + */ + FRIENDS, + ADD_FRIENDS, + MESSAGE, + READ_MESSAGE, + UN_READ, + HISTORY, + SYSTEM_TIPS, + OFFLINE + +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageStatusEnum.java b/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageStatusEnum.java new file mode 100644 index 00000000..687c814c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageStatusEnum.java @@ -0,0 +1,31 @@ +package cn.lili.modules.im.entity.enums; + +/** + * 消息的类型 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2022/2/10 16:36 + */ +public enum MessageStatusEnum { + //socket刚打开时发送的消息,这个一般是是刚打开socket链接,进行登录,传入token用 + CONNECT, + //心跳类型的消息,此种类型的消息只有 type 、 text 两种属性 + HEARTBEAT, + //用户打开一个对话框,准备跟某人聊天时 + OPEN, + //客服进行自动回复。客户端发起这种类型请求,则是在拉取对方是否有自动回复,如果有,服务端就会给客户端发送过自动回复的信息 + AUTO_REPLY, + //正常收发消息沟通,文字、表情等沟通 + MSG, + //扩展。比如发送商品、发送订单 + EXTEND, + //系统提示,如提示 对方已离线 + SYSTEM, + //服务端发送到客户端,用于设置客户端的用户信息。会吧 com.xnx3.yunkefu.core.vo.bean.User 传过去 + SET_USER, + //结束服务 + CLOSE_SERVICE; + +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageTypeEnum.java b/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageTypeEnum.java new file mode 100644 index 00000000..6b06d3b7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/enums/MessageTypeEnum.java @@ -0,0 +1,23 @@ +package cn.lili.modules.im.entity.enums; + +/** + * 消息类型 + * + * @author liushuai + */ +public enum MessageTypeEnum { + /** + * 消息类型枚举 + *

+ * 普通消息 + * 图片 + * 语音 + * 视频 + */ + MESSAGE, + PICTURE, + VOICE, + GOODS, + ORDER, + VIDEO +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/enums/OnlineStatusEnum.java b/framework/src/main/java/cn/lili/modules/im/entity/enums/OnlineStatusEnum.java new file mode 100644 index 00000000..837a4493 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/enums/OnlineStatusEnum.java @@ -0,0 +1,14 @@ +package cn.lili.modules.im.entity.enums; + +/** + * 坐席在线状态 + * + * @author Chopper + * @version v1.0 + * 2022-02-10 16:37 + */ +public enum OnlineStatusEnum { + // 在线/下线 + ONLINE, + OUTLINE; +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/enums/OperationType.java b/framework/src/main/java/cn/lili/modules/im/entity/enums/OperationType.java new file mode 100644 index 00000000..5909222e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/enums/OperationType.java @@ -0,0 +1,26 @@ +package cn.lili.modules.im.entity.enums; + +/** + * 操作类型枚举 + * + * @author liushuai + */ +public enum OperationType { + /** + * 消息类型枚举 + *

+ * 心跳检测 + * 发起聊天 + * 发起消息 + * 查询历史消息 + * 阅读消息 + * 查询未读消息 + */ + PING, + CREATE, + MESSAGE, + HISTORY, + READ, + UNREAD, + +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/vo/ImTalkVO.java b/framework/src/main/java/cn/lili/modules/im/entity/vo/ImTalkVO.java new file mode 100644 index 00000000..6d80a8be --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/vo/ImTalkVO.java @@ -0,0 +1,82 @@ +package cn.lili.modules.im.entity.vo; + +import cn.lili.modules.im.entity.dos.ImTalk; +import cn.lili.mybatis.BaseTenantEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author Chopper + */ +@Data +@ApiModel(value = "聊天") +public class ImTalkVO extends BaseTenantEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("id") + private String id; + + @ApiModelProperty("用户 id") + private String userId; + + @ApiModelProperty("置顶") + private Boolean top; + + @ApiModelProperty("用户 不可见") + private Boolean disable; + + @ApiModelProperty("用户名字") + private String name; + + @ApiModelProperty("用户头像") + private String face; + + @ApiModelProperty("店铺标识") + private Boolean storeFlag; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "最后聊天时间", hidden = true) + private Date lastTalkTime; + + @ApiModelProperty(value = "最后聊天内容") + private String lastTalkMessage; + + @ApiModelProperty(value = "最后发送消息类型") + private String lastMessageType; + + @ApiModelProperty(value = "未读数量") + private Long unread; + + public ImTalkVO() { + + } + + public ImTalkVO(ImTalk imTalk, String currentUser) { + if (imTalk.getUserId2().equals(currentUser)) { + userId = imTalk.getUserId1(); + top = imTalk.getTop1(); + disable = imTalk.getDisable1(); + name = imTalk.getName1(); + face = imTalk.getFace1(); + storeFlag = imTalk.getStoreFlag1(); + } else { + userId = imTalk.getUserId2(); + top = imTalk.getTop2(); + disable = imTalk.getDisable2(); + name = imTalk.getName2(); + face = imTalk.getFace2(); + storeFlag = imTalk.getStoreFlag2(); + } + lastTalkMessage = imTalk.getLastTalkMessage(); + lastTalkTime = imTalk.getLastTalkTime(); + lastMessageType = imTalk.getLastMessageType(); + id = imTalk.getId(); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/entity/vo/MessageOperation.java b/framework/src/main/java/cn/lili/modules/im/entity/vo/MessageOperation.java new file mode 100644 index 00000000..b4360bc6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/vo/MessageOperation.java @@ -0,0 +1,53 @@ +package cn.lili.modules.im.entity.vo; + +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.im.entity.enums.MessageTypeEnum; +import cn.lili.modules.im.entity.enums.OperationType; +import lombok.Data; + +/** + * @author liushuai + */ +@Data +public class MessageOperation { + + /** + * 消息类型 + */ + private OperationType operationType; + /** + * 与某人聊天记录 + */ + private String to; + + /** + * 发送者 + */ + private String from; + + /** + * 聊天id + */ + private String talkId; + + /** + * 消息类型 + */ + private MessageTypeEnum messageType; + /** + * 消息内容 + */ + private String context; + + public void setOperationType(String operationType) { + if (!StringUtils.isEmpty(operationType)) { + this.operationType = OperationType.valueOf(operationType); + } + } + + public void setMessageType(String messageType) { + if (!StringUtils.isEmpty(messageType)) { + this.messageType = MessageTypeEnum.valueOf(messageType); + } + } +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/vo/MessageVO.java b/framework/src/main/java/cn/lili/modules/im/entity/vo/MessageVO.java new file mode 100644 index 00000000..120abc1a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/vo/MessageVO.java @@ -0,0 +1,28 @@ +package cn.lili.modules.im.entity.vo; + +import cn.lili.modules.im.entity.enums.MessageResultType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +/** + * MessageVO + * + * @author Chopper + * @version v1.0 + * 2021-12-30 15:51 + */ +@Data +@Builder +@AllArgsConstructor +public class MessageVO { + + /** + * 消息类型 + */ + private MessageResultType messageResultType; + /** + * 消息内容 + */ + private Object result; +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/vo/ReadMessage.java b/framework/src/main/java/cn/lili/modules/im/entity/vo/ReadMessage.java new file mode 100644 index 00000000..bbeb7d11 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/vo/ReadMessage.java @@ -0,0 +1,17 @@ +package cn.lili.modules.im.entity.vo; + +import lombok.Data; + +import java.util.List; + +/** + * ReadMessage + * + * @author Chopper + * @version v1.0 + * 2021-12-31 11:13 + */ +@Data +public class ReadMessage { + private List readMessageList; +} diff --git a/framework/src/main/java/cn/lili/modules/im/entity/vo/SeatVO.java b/framework/src/main/java/cn/lili/modules/im/entity/vo/SeatVO.java new file mode 100644 index 00000000..d1df9d1c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/entity/vo/SeatVO.java @@ -0,0 +1,22 @@ +package cn.lili.modules.im.entity.vo; + +import cn.lili.modules.im.entity.dos.Seat; +import lombok.Data; + +/** + * 客服VO + * + * @author Chopper + * @version v1.0 + * 2022-02-10 15:02 + */ +@Data +public class SeatVO extends Seat { + + /** + * 在线状态 + */ + private String onlineStatus; + + +} diff --git a/framework/src/main/java/cn/lili/modules/im/mapper/ImMessageMapper.java b/framework/src/main/java/cn/lili/modules/im/mapper/ImMessageMapper.java new file mode 100644 index 00000000..e82b0cac --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/mapper/ImMessageMapper.java @@ -0,0 +1,12 @@ +package cn.lili.modules.im.mapper; + +import cn.lili.modules.im.entity.dos.ImMessage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Im消息 Dao层 + * @author Chopper + */ +public interface ImMessageMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/mapper/ImTalkMapper.java b/framework/src/main/java/cn/lili/modules/im/mapper/ImTalkMapper.java new file mode 100644 index 00000000..d5f0d2b1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/mapper/ImTalkMapper.java @@ -0,0 +1,12 @@ +package cn.lili.modules.im.mapper; + +import cn.lili.modules.im.entity.dos.ImTalk; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 聊天 Dao层 + * @author Chopper + */ +public interface ImTalkMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/mapper/QAMapper.java b/framework/src/main/java/cn/lili/modules/im/mapper/QAMapper.java new file mode 100644 index 00000000..f5592316 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/mapper/QAMapper.java @@ -0,0 +1,16 @@ +package cn.lili.modules.im.mapper; + + +import cn.lili.modules.im.entity.dos.QA; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 问答处理层 + * + * @author pikachu + * @since 2020-02-18 15:18:56 + */ +public interface QAMapper extends BaseMapper { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/mapper/SeatMapper.java b/framework/src/main/java/cn/lili/modules/im/mapper/SeatMapper.java new file mode 100644 index 00000000..98d7b6ae --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/mapper/SeatMapper.java @@ -0,0 +1,16 @@ +package cn.lili.modules.im.mapper; + + +import cn.lili.modules.im.entity.dos.Seat; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 坐席处理层 + * + * @author pikachu + * @since 2020-02-18 15:18:56 + */ +public interface SeatMapper extends BaseMapper { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/mapper/SeatSettingMapper.java b/framework/src/main/java/cn/lili/modules/im/mapper/SeatSettingMapper.java new file mode 100644 index 00000000..9e130ef3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/mapper/SeatSettingMapper.java @@ -0,0 +1,16 @@ +package cn.lili.modules.im.mapper; + + +import cn.lili.modules.im.entity.dos.SeatSetting; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 坐席设置处理层 + * + * @author pikachu + * @since 2020-02-18 15:18:56 + */ +public interface SeatSettingMapper extends BaseMapper { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/service/ImMessageService.java b/framework/src/main/java/cn/lili/modules/im/service/ImMessageService.java new file mode 100644 index 00000000..823369c0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/service/ImMessageService.java @@ -0,0 +1,66 @@ +package cn.lili.modules.im.service; + +import cn.lili.modules.im.entity.dos.ImMessage; +import cn.lili.modules.im.entity.dto.MessageQueryParams; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * Im消息 业务层 + * + * @author Chopper + */ +public interface ImMessageService extends IService { + + /** + * 阅读消息 + * + * @param talkId 对话Id + * @param accessToken 验证token + */ + void read(String talkId, String accessToken); + + /** + * 未读消息列表 + * + * @param accessToken 验证token + * @return 未读消息列表 + */ + List unReadMessages(String accessToken); + + /** + * 历史消息 + * + * @param accessToken 验证token + * @param to 接收人 + * + * @return 历史消息列表 + */ + List historyMessage(String accessToken, String to); + + /** + * 是否有新消息 + * @param accessToken 验证token + * @return + */ + Boolean hasNewMessage(String accessToken); + + /** + * 分页获取消息列表 + * @param messageQueryParams 查询条件 + * @return 消息列表 + */ + List getList(MessageQueryParams messageQueryParams); + + /** + * 获取所有未读消息 + * @return 未读数量 + */ + Long unreadMessageCount(); + + /** + * 清空所有未读消息 + */ + void cleanUnreadMessage(); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/service/ImTalkService.java b/framework/src/main/java/cn/lili/modules/im/service/ImTalkService.java new file mode 100644 index 00000000..b648a393 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/service/ImTalkService.java @@ -0,0 +1,57 @@ +package cn.lili.modules.im.service; + +import cn.lili.modules.im.entity.dos.ImTalk; +import cn.lili.modules.im.entity.vo.ImTalkVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 聊天 业务层 + * + * @author Chopper + */ +public interface ImTalkService extends IService { + + /** + * 获取与某人的聊天框 + * + * @param userId1 + * @return + */ + ImTalk getTalkByUser(String userId1); + + /** + * 获取与某人的聊天 + * @param userId + * @return + */ + ImTalkVO getTalkByUserId(String userId); + + /** + * 置顶消息 + * + * @param id + * @param top + */ + void top(String id, Boolean top); + + /** + * 禁用(前端不做展示)聊天 + * + * @param id + */ + void disable(String id); + + /** + * 获取用户聊天列表 + * @return + */ + List getUserTalkList(); + + /** + * 获取商家聊天列表 + * @return + */ + List getStoreTalkList(); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/service/QAService.java b/framework/src/main/java/cn/lili/modules/im/service/QAService.java new file mode 100644 index 00000000..49f8572b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/service/QAService.java @@ -0,0 +1,25 @@ +package cn.lili.modules.im.service; + + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.im.entity.dos.QA; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 问答 + * + * @author pikachu + * @since 2020-02-18 16:18:56 + */ +public interface QAService extends IService { + + /** + * 查询店铺问题 + * @param word + * @param pageVO + * @return + */ + IPage getStoreQA(String word, PageVO pageVO); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/service/SeatService.java b/framework/src/main/java/cn/lili/modules/im/service/SeatService.java new file mode 100644 index 00000000..b0cf8eac --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/service/SeatService.java @@ -0,0 +1,60 @@ +package cn.lili.modules.im.service; + + +import cn.lili.common.security.token.Token; +import cn.lili.modules.im.entity.dos.Seat; +import cn.lili.modules.im.entity.vo.SeatVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 坐席业务 + * + * @author pikachu + * @since 2020-02-18 16:18:56 + */ +public interface SeatService extends IService { + + + /** + * 获取坐席列表 + * + * @param storeId 店铺id + * @return + */ + List seatVoList(String storeId); + + /** + * 坐席登录 + * + * @param username + * @param password + * @return + */ + Token usernameLogin(String username, String password); + + /** + * 快捷登录code 生成 + * + * @param username 用户名 + * @return + */ + String createQuickLoginCode(String username); + + /** + * 快捷登录 + * + * @param code + * @return + */ + Token quickLogin(String code); + + /** + * 查询坐席 + * + * @param username + * @return + */ + Seat findByUsername(String username); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/service/SeatSettingService.java b/framework/src/main/java/cn/lili/modules/im/service/SeatSettingService.java new file mode 100644 index 00000000..364ba10f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/service/SeatSettingService.java @@ -0,0 +1,30 @@ +package cn.lili.modules.im.service; + +import cn.lili.modules.im.entity.dos.SeatSetting; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 坐席设置业务 + * + * @author pikachu + * @since 2020-02-18 16:18:56 + */ +public interface SeatSettingService extends IService { + + + /** + * 根据店铺id获取坐席配置 + * + * @param storeId + * @return + */ + SeatSetting getSetting(String storeId); + + /** + * 根据店铺修改坐席设置 + * + * @param seatSetting 坐席设置 + * @return + */ + SeatSetting updateByStore(SeatSetting seatSetting); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/serviceimpl/ImMessageServiceImpl.java b/framework/src/main/java/cn/lili/modules/im/serviceimpl/ImMessageServiceImpl.java new file mode 100644 index 00000000..6e75529d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/serviceimpl/ImMessageServiceImpl.java @@ -0,0 +1,153 @@ +package cn.lili.modules.im.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.modules.im.entity.dos.ImMessage; +import cn.lili.modules.im.entity.dto.MessageQueryParams; +import cn.lili.modules.im.mapper.ImMessageMapper; +import cn.lili.modules.im.service.ImMessageService; +import cn.lili.modules.im.service.ImTalkService; +import cn.lili.mybatis.util.PageUtil; +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 lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Comparator; +import java.util.List; +import java.util.Objects; + +/** + * Im消息 业务实现 + * + * @author Chopper + */ +@Service +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ImMessageServiceImpl extends ServiceImpl implements ImMessageService { + + @Autowired + private ImTalkService imTalkService; + + @Override + public void read(String talkId, String accessToken) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + String userId = UserContext.getAuthUser(accessToken).getId(); + updateWrapper.eq(ImMessage::getTalkId, talkId); + updateWrapper.eq(ImMessage::getToUser, userId); + updateWrapper.set(ImMessage::getIsRead, true); + this.update(updateWrapper); + } + + @Override + public List unReadMessages(String accessToken) { + String userId = UserContext.getAuthUser(accessToken).getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ImMessage::getToUser, userId); + queryWrapper.eq(ImMessage::getIsRead, false); + return this.list(queryWrapper); + } + + @Override + public List historyMessage(String accessToken, String to) { + String userId = UserContext.getAuthUser(accessToken).getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.and(i -> i.eq(ImMessage::getToUser, userId).and(j -> j.eq(ImMessage::getFromUser, to))); + queryWrapper.or(i -> i.eq(ImMessage::getToUser, to).and(j -> j.eq(ImMessage::getFromUser, userId))); + queryWrapper.orderByDesc(ImMessage::getCreateTime); + return this.list(queryWrapper); + } + + @Override + public Boolean hasNewMessage(String accessToken) { + String userId = UserContext.getAuthUser(accessToken).getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ImMessage::getIsRead, false); + queryWrapper.eq(ImMessage::getToUser, userId); + return this.list(queryWrapper).size() > 0; + + } + + @Override + public List getList(MessageQueryParams messageQueryParams) { + List messageList = this.page(PageUtil.initPage(messageQueryParams), messageQueryParams.initQueryWrapper()).getRecords(); + ListSort(messageList); + readMessage(messageList); + return messageList; + } + + @Override + public Long unreadMessageCount() { + AuthUser currentUser = UserContext.getCurrentUser(); + if(currentUser == null){ + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + return this.count(new LambdaQueryWrapper().eq(ImMessage::getToUser,currentUser.getId()).eq(ImMessage::getIsRead,false)); + } + + @Override + public void cleanUnreadMessage() { + AuthUser currentUser = UserContext.getCurrentUser(); + if(currentUser == null){ + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + this.update(new LambdaUpdateWrapper().eq(ImMessage::getToUser,currentUser.getId()).set(ImMessage::getIsRead,true)); + } + + /** + * 根据时间倒叙 + * + * @param list + */ + private static void ListSort(List list) { + list.sort(new Comparator() { + @Override + public int compare(ImMessage e1, ImMessage e2) { + try { + if (e1.getCreateTime().before(e2.getCreateTime())) { + return -1; + } else { + return 1; + } + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } + }); + } + + + /** + * 阅读消息 + * + * @param messageList 消息列表 + */ + private void readMessage(List messageList) { + if (!messageList.isEmpty()) { + //判断用户类型 + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + String toUserId = ""; + if(UserEnums.MEMBER.equals(authUser.getRole())){ + toUserId = authUser.getId(); + }else if(UserEnums.STORE.equals(authUser.getRole())){ + toUserId = authUser.getStoreId(); + } + //发送给自己的未读信息进行已读操作 + for (ImMessage imMessage : messageList) { + if(Boolean.FALSE.equals(imMessage.getIsRead()) && imMessage.getToUser().equals(toUserId)){ + imMessage.setIsRead(true); + } + } + } + this.updateBatchById(messageList); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/serviceimpl/ImTalkServiceImpl.java b/framework/src/main/java/cn/lili/modules/im/serviceimpl/ImTalkServiceImpl.java new file mode 100644 index 00000000..b5a4b17f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/serviceimpl/ImTalkServiceImpl.java @@ -0,0 +1,222 @@ +package cn.lili.modules.im.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.modules.im.entity.dos.ImMessage; +import cn.lili.modules.im.entity.dos.ImTalk; +import cn.lili.modules.im.entity.vo.ImTalkVO; +import cn.lili.modules.im.mapper.ImTalkMapper; +import cn.lili.modules.im.service.ImMessageService; +import cn.lili.modules.im.service.ImTalkService; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.modules.store.service.StoreService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 聊天 业务实现 + * + * @author Chopper + */ +@Service +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ImTalkServiceImpl extends ServiceImpl implements ImTalkService { + + @Autowired + private MemberService memberService; + + @Autowired + private StoreService storeService; + + @Autowired + private ImMessageService imMessageService; + + public ImTalk getTalkByUser(String userId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + //登录用户的Id + String selfId = ""; + //查看当前用户角色对Id进行赋值 + if(UserEnums.STORE.equals(currentUser.getRole())){ + selfId = currentUser.getStoreId(); + }else if(UserEnums.MEMBER.equals(currentUser.getRole())){ + selfId = currentUser.getId(); + } + //小数在前保证永远是同一个对话 + String finalSelfId = selfId; + queryWrapper.and(wq-> wq.eq(ImTalk::getUserId2, userId).eq(ImTalk::getUserId1, finalSelfId).or().eq(ImTalk::getUserId2, finalSelfId).eq(ImTalk::getUserId1, userId)); + ImTalk imTalk = this.getOne(queryWrapper); + //如果没有聊天,则创建聊天 + if (imTalk == null) { + //当自己为店铺时 + if(UserEnums.STORE.equals(currentUser.getRole())){ + Store selfStore = storeService.getById(selfId); + //没有这个用户信息 + Member other = memberService.getById(userId); + if(other == null){ + return null; + } + //自己为店铺其他人必定为用户 + imTalk = new ImTalk(other,selfStore); + }else if(UserEnums.MEMBER.equals(currentUser.getRole())){ + //没有这个店铺信息 + Member self = memberService.getById(selfId); + Member otherMember = memberService.getById(userId); + Store otherStore = storeService.getById(userId); + if(otherStore != null){ + imTalk = new ImTalk(self, otherStore); + }else if (otherMember != null){ + imTalk = new ImTalk(self, otherMember); + } + } + this.save(imTalk); + } + return imTalk; + } + + @Override + public ImTalkVO getTalkByUserId(String userId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + //登录用户的Id + String selfId = ""; + //查看当前用户角色对Id进行赋值 + if(UserEnums.STORE.equals(currentUser.getRole())){ + selfId = currentUser.getStoreId(); + }else if(UserEnums.MEMBER.equals(currentUser.getRole())){ + selfId = currentUser.getId(); + } + //小数在前保证永远是同一个对话 + String finalSelfId = selfId; + queryWrapper.and(wq-> wq.eq(ImTalk::getUserId2, userId).eq(ImTalk::getUserId1, finalSelfId).or().eq(ImTalk::getUserId2, finalSelfId).eq(ImTalk::getUserId1, userId)); + ImTalk imTalk = this.getOne(queryWrapper); + //如果没有聊天,则创建聊天 + if (imTalk == null) { + //当自己为店铺时 + if(UserEnums.STORE.equals(currentUser.getRole())){ + Store selfStore = storeService.getById(selfId); + //没有这个用户信息 + Member other = memberService.getById(userId); + if(other == null){ + return null; + } + //自己为店铺其他人必定为用户 + imTalk = new ImTalk(other,selfStore); + }else if(UserEnums.MEMBER.equals(currentUser.getRole())){ + //没有这个店铺信息 + Member self = memberService.getById(selfId); + Member otherMember = memberService.getById(userId); + Store otherStore = storeService.getById(userId); + if(otherStore != null){ + imTalk = new ImTalk(self, otherStore); + }else if (otherMember != null){ + imTalk = new ImTalk(self, otherMember); + } + } + this.save(imTalk); + } + return new ImTalkVO(imTalk,currentUser.getId()); + } + + /** + * 发起聊天后,如果聊天不可见为true,则需要修正 + * + * @param imTalk 对话信息 + */ + private ImTalk check(ImTalk imTalk) { + if (imTalk.getDisable1() || imTalk.getDisable2()) { + imTalk.setDisable1(false); + imTalk.setDisable2(false); + this.updateById(imTalk); + + } + return imTalk; + } + + @Override + public void top(String id, Boolean top) { + ImTalk imTalk = this.getById(id); + if (imTalk.getUserId1().equals(UserContext.getCurrentUser().getId())) { + imTalk.setTop1(top); + } else if (imTalk.getUserId2().equals(UserContext.getCurrentUser().getId())) { + imTalk.setTop2(top); + } else { + throw new ServiceException(ResultCode.ERROR); + } + this.updateById(imTalk); + } + + @Override + public void disable(String id) { + ImTalk imTalk = this.getById(id); + if (imTalk.getUserId1().equals(UserContext.getCurrentUser().getId())) { + imTalk.setDisable1(true); + this.updateById(imTalk); + } else if (imTalk.getUserId2().equals(UserContext.getCurrentUser().getId())) { + imTalk.setDisable2(true); + this.updateById(imTalk); + } + } + + @Override + public List getUserTalkList() { + AuthUser authUser = UserContext.getCurrentUser(); + if(authUser == null){ + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.and(wq-> wq.eq(ImTalk::getUserId1, authUser.getId()).or().eq(ImTalk::getUserId2,authUser.getId())); + queryWrapper.orderByDesc(ImTalk::getLastTalkTime); + List imTalks = this.list(queryWrapper); + List imTalkVOList = imTalks.stream().map(imTalk -> new ImTalkVO(imTalk, authUser.getId())).collect(Collectors.toList()); + getUnread(imTalkVOList); + return imTalkVOList; + } + + @Override + public List getStoreTalkList() { + AuthUser authUser = UserContext.getCurrentUser(); + if(authUser == null){ + throw new ServiceException(ResultCode.STORE_NOT_LOGIN_ERROR); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.and(wq->{ + wq.eq(ImTalk::getUserId1, authUser.getStoreId()).or().eq(ImTalk::getUserId2,authUser.getStoreId()); + }); + queryWrapper.orderByDesc(ImTalk::getLastTalkTime); + List imTalks = this.list(queryWrapper); + + List imTalkVOList = imTalks.stream().map(imTalk -> { + return new ImTalkVO(imTalk, authUser.getStoreId()); + }).collect(Collectors.toList()); + getUnread(imTalkVOList); + return imTalkVOList; + } + + /** + * 获取未读消息数量 + * @param imTalkVOList 消息列表 + */ + private void getUnread(List imTalkVOList){ + if(!imTalkVOList.isEmpty()){ + for (ImTalkVO imTalkVO : imTalkVOList) { + long count = imMessageService.count(new LambdaQueryWrapper().eq(ImMessage::getFromUser, imTalkVO.getUserId()).eq(ImMessage::getTalkId,imTalkVO.getId()).eq(ImMessage::getIsRead, false)); + imTalkVO.setUnread(count); + } + } + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/serviceimpl/QAServiceImpl.java b/framework/src/main/java/cn/lili/modules/im/serviceimpl/QAServiceImpl.java new file mode 100644 index 00000000..2ee78fbc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/serviceimpl/QAServiceImpl.java @@ -0,0 +1,32 @@ +package cn.lili.modules.im.serviceimpl; + +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.im.entity.dos.QA; +import cn.lili.modules.im.mapper.QAMapper; +import cn.lili.modules.im.service.QAService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 坐席业务层实现 + * + * @author pikachu + * @since 2020-02-18 16:18:56 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class QAServiceImpl extends ServiceImpl implements QAService { + + @Override + public IPage getStoreQA(String word, PageVO pageVo) { + LambdaQueryWrapper qaLambdaQueryWrapper = new LambdaQueryWrapper<>(); + qaLambdaQueryWrapper.eq(QA::getTenantId, UserContext.getCurrentUser().getTenantId()); + qaLambdaQueryWrapper.like(QA::getQuestion, word); + return this.page(PageUtil.initPage(pageVo), qaLambdaQueryWrapper); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/serviceimpl/SeatServiceImpl.java b/framework/src/main/java/cn/lili/modules/im/serviceimpl/SeatServiceImpl.java new file mode 100644 index 00000000..cac28af1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/serviceimpl/SeatServiceImpl.java @@ -0,0 +1,111 @@ +package cn.lili.modules.im.serviceimpl; + +import cn.lili.cache.Cache; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.token.Token; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.im.entity.dos.Seat; +import cn.lili.modules.im.entity.enums.OnlineStatusEnum; +import cn.lili.modules.im.entity.vo.SeatVO; +import cn.lili.modules.im.mapper.SeatMapper; +import cn.lili.modules.im.service.SeatService; +import cn.lili.modules.im.token.SeatTokenGenerate; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * 坐席业务层实现 + * + * @author pikachu + * @since 2020-02-18 16:18:56 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class SeatServiceImpl extends ServiceImpl implements SeatService { + + + @Autowired + private SeatTokenGenerate seatTokenGenerate; + + @Autowired + private Cache cache; + + /** + * 快捷登录缓存前缀 + */ + private static String prefix = "{quick_login}_"; + + + @Override + public List seatVoList(String storeId) { + + LambdaQueryWrapper seatLambdaQueryWrapper = new LambdaQueryWrapper<>(); + seatLambdaQueryWrapper.eq(Seat::getTenantId, storeId); + List list = this.list(seatLambdaQueryWrapper); + + //转换模型为VO + List results = list.stream().map(item -> (SeatVO) item).collect(Collectors.toList()); + //填充坐席当前状态 + //todo + results.forEach(item -> { + item.setOnlineStatus(OnlineStatusEnum.ONLINE.name()); + }); + return results; + } + + @Override + public Token usernameLogin(String username, String password) { + + Seat seat = this.findByUsername(username); + //判断用户是否存在 + if (seat == null || !seat.getDisabled()) { + throw new ServiceException(ResultCode.ERROR); + } + //判断密码是否输入正确 + if (!new BCryptPasswordEncoder().matches(password, seat.getPassword())) { + throw new ServiceException(ResultCode.ERROR); + } + return seatTokenGenerate.createToken(seat, true); + } + + @Override + public String createQuickLoginCode(String username) { + String code = UUID.randomUUID().toString(); + cache.put(prefix + code, username, 20L); + return code; + } + + @Override + public Token quickLogin(String code) { + String username = cache.get(prefix + code); + cache.remove(prefix + code); + if (StringUtils.isEmpty(username)) { + throw new ServiceException(ResultCode.ERROR); + } + return seatTokenGenerate.createToken(findByUsername(username), true); + } + + /** + * 查询坐席 + * + * @param username + * @return + */ + @Override + public Seat findByUsername(String username) { + LambdaQueryWrapper seatLambdaQueryWrapper = new LambdaQueryWrapper<>(); + seatLambdaQueryWrapper.eq(Seat::getUsername, username); + return this.getOne(seatLambdaQueryWrapper); + } + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/serviceimpl/SeatSettingServiceImpl.java b/framework/src/main/java/cn/lili/modules/im/serviceimpl/SeatSettingServiceImpl.java new file mode 100644 index 00000000..e5ec4a8e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/serviceimpl/SeatSettingServiceImpl.java @@ -0,0 +1,48 @@ +package cn.lili.modules.im.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.im.entity.dos.SeatSetting; +import cn.lili.modules.im.mapper.SeatSettingMapper; +import cn.lili.modules.im.service.SeatSettingService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 坐席设置业务层实现 + * + * @author pikachu + * @since 2020-02-18 16:18:56 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class SeatSettingServiceImpl extends ServiceImpl implements SeatSettingService { + @Override + public SeatSetting getSetting(String storeId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SeatSetting::getTenantId, storeId); + SeatSetting seatSetting = this.baseMapper.selectOne(queryWrapper); + if (seatSetting == null) { + seatSetting = new SeatSetting(); + seatSetting.setOutLineAutoReply("您好,我现在不在线,请您留下关键内容和联系方式,我看到后会立马回电。"); + seatSetting.setLongTermAutoReply("您好,我正在查阅相关资料,请您稍等。"); + seatSetting.setWelcome("您好,请问有什么可以帮您?"); + seatSetting.setTenantId(storeId); + this.save(seatSetting); + } + return seatSetting; + } + + @Override + public SeatSetting updateByStore(SeatSetting seatSetting) { + SeatSetting oldSetting = this.baseMapper.selectById(seatSetting.getId()); + if (oldSetting.getTenantId().equals(seatSetting.getTenantId())) { + this.updateById(seatSetting); + } else { + throw new ServiceException(ResultCode.ERROR); + } + return seatSetting; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/im/token/SeatTokenGenerate.java b/framework/src/main/java/cn/lili/modules/im/token/SeatTokenGenerate.java new file mode 100644 index 00000000..caa0a153 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/im/token/SeatTokenGenerate.java @@ -0,0 +1,45 @@ +package cn.lili.modules.im.token; + +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; +import cn.lili.common.security.token.TokenUtil; +import cn.lili.common.security.token.base.AbstractTokenGenerate; +import cn.lili.modules.im.entity.dos.Seat; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 会员token生成 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/16 10:50 + */ +@Component +public class SeatTokenGenerate extends AbstractTokenGenerate { + @Autowired + private TokenUtil tokenUtil; + + @Override + public Token createToken(Seat seat, Boolean longTerm) { + AuthUser authUser = AuthUser.builder() + .username(seat.getUsername()) + .id(seat.getId()) + .nickName(seat.getNickName()) + .face(seat.getFace()) + .role(UserEnums.SEAT) + .longTerm(longTerm) + .tenantId(seat.getTenantId()) + .build(); + + //登陆成功生成token + return tokenUtil.createToken(authUser); + } + + @Override + public Token refreshToken(String refreshToken) { + return tokenUtil.refreshToken(refreshToken); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/LogisticsPlugin.java b/framework/src/main/java/cn/lili/modules/logistics/LogisticsPlugin.java new file mode 100644 index 00000000..5a0ab4e7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/LogisticsPlugin.java @@ -0,0 +1,58 @@ +package cn.lili.modules.logistics; + +import cn.lili.modules.logistics.entity.dto.LabelOrderDTO; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; +import cn.lili.modules.order.order.entity.vo.OrderDetailVO; +import cn.lili.modules.system.entity.dos.Logistics; +import cn.lili.modules.system.entity.vo.Traces; + +import java.util.Map; + +/** + * 物流插件接口 + * + * @author Bulbasaur + * @author Bulbasaur + * @since 2023-02-16 + */ +public interface LogisticsPlugin { + + + /** + * 插件名称 + */ + LogisticsEnum pluginName(); + + /** + * 实时查询快递 + * + * @param logistics 物流公司 + * @param expNo + * @param phone + * @return 物流信息 + */ + Traces pollQuery(Logistics logistics, String expNo, String phone); + + /** + * 实时查询地图轨迹 + * + * @param logistics 物流公司 + * @param expNo 单号 + * @param phone 收件人手机号 + * @param from 出发地信息,最小颗粒到市级,例如:广东省深圳市 + * @param to 目的地信息,最小颗粒到市级,例如:广东省深圳市 + * @return 物流信息 + */ + Traces pollMapTrack(Logistics logistics, String expNo, String phone, String from, String to); + + /** + * 电子面单打印 + * + * @param labelOrderDTO 电子面单DTO + * @return + */ + Map labelOrder(LabelOrderDTO labelOrderDTO); + + String createOrder(OrderDetailVO orderDetailVO); + +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/LogisticsPluginFactory.java b/framework/src/main/java/cn/lili/modules/logistics/LogisticsPluginFactory.java new file mode 100644 index 00000000..4ecc4bfe --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/LogisticsPluginFactory.java @@ -0,0 +1,59 @@ +package cn.lili.modules.logistics; + +import cn.hutool.json.JSONUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; +import cn.lili.modules.logistics.plugin.kdniao.KdniaoPlugin; +import cn.lili.modules.logistics.plugin.kuaidi100.Kuaidi100Plugin; +import cn.lili.modules.logistics.plugin.shunfeng.ShunfengPlugin; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.LogisticsSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 文件服务抽象工厂 直接返回操作类 + * + * @author Bulbasaur + * @version v1.0 + * 2022-06-06 11:35 + */ + +@Component +public class LogisticsPluginFactory { + + + @Autowired + private SettingService settingService; + + + /** + * 获取logistics client + * + * @return + */ + public LogisticsPlugin filePlugin() { + + LogisticsSetting logisticsSetting = null; + try { + Setting setting = settingService.get(SettingEnum.LOGISTICS_SETTING.name()); + logisticsSetting = JSONUtil.toBean(setting.getSettingValue(), LogisticsSetting.class); + switch (LogisticsEnum.valueOf(logisticsSetting.getType())) { + case KDNIAO: + return new KdniaoPlugin(logisticsSetting); + case KUAIDI100: + return new Kuaidi100Plugin(logisticsSetting); + case SHUNFENG: + return new ShunfengPlugin(logisticsSetting); + default: + throw new ServiceException(); + } + } catch (Exception e) { + throw new ServiceException(); + } + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/entity/dto/LabelOrderDTO.java b/framework/src/main/java/cn/lili/modules/logistics/entity/dto/LabelOrderDTO.java new file mode 100644 index 00000000..c1072d65 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/entity/dto/LabelOrderDTO.java @@ -0,0 +1,31 @@ +package cn.lili.modules.logistics.entity.dto; + +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; +import cn.lili.modules.system.entity.dos.Logistics; +import lombok.Data; + +import java.util.List; + +/** + * 电子面单DTO + * + * @author Bulbasaur + * @since 2023-02-16 + */ +@Data +public class LabelOrderDTO { + + //订单 + Order order; + //订单货物 + List orderItems; + //物流公司 + Logistics logistics; + //店铺物流公司配置 + StoreLogistics storeLogistics; + //店铺发件地址 + StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDTO; +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/entity/enums/LogisticsEnum.java b/framework/src/main/java/cn/lili/modules/logistics/entity/enums/LogisticsEnum.java new file mode 100644 index 00000000..20c9bba8 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/entity/enums/LogisticsEnum.java @@ -0,0 +1,15 @@ +package cn.lili.modules.logistics.entity.enums; + +/** + * LogisticsEnum + * + * @author Bulbasaur + * @version v1.0 + * 2022-06-06 11:23 + */ +public enum LogisticsEnum { + /** + * 快递查询渠道 + */ + KDNIAO, KUAIDI100,SHUNFENG; +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/plugin/kdniao/KdniaoPlugin.java b/framework/src/main/java/cn/lili/modules/logistics/plugin/kdniao/KdniaoPlugin.java new file mode 100644 index 00000000..9e022575 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/plugin/kdniao/KdniaoPlugin.java @@ -0,0 +1,389 @@ +package cn.lili.modules.logistics.plugin.kdniao; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.logistics.LogisticsPlugin; +import cn.lili.modules.logistics.entity.dto.LabelOrderDTO; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.entity.vo.OrderDetailVO; +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; +import cn.lili.modules.system.entity.dos.Logistics; +import cn.lili.modules.system.entity.dto.LogisticsSetting; +import cn.lili.modules.system.entity.vo.Traces; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 快递鸟插件 + * + * @author Bulbasaur + */ +@Slf4j +public class KdniaoPlugin implements LogisticsPlugin { + + @Autowired + private LogisticsSetting logisticsSetting; + + public KdniaoPlugin(LogisticsSetting logisticsSetting) { + this.logisticsSetting = logisticsSetting; + } + + @Override + public LogisticsEnum pluginName() { + return LogisticsEnum.KDNIAO; + } + + @Override + public Traces pollQuery(Logistics logistics, String expNo, String phone) { + try { + String requestData = "{'OrderCode':'','ShipperCode':'" + logistics.getCode() + + "','LogisticCode':'" + expNo + "'" + + ",'CustomerName':'" + phone.substring(phone.length() - 4) + "'" + + "}"; + //请求地址-测试地址 + String testReqURL = "http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json"; + //请求地址-正式地址 + String reqURL = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"; + Map params = new HashMap<>(8); + params.put("RequestData", urlEncoder(requestData, "UTF-8")); + params.put("EBusinessID", logisticsSetting.getKdniaoEbusinessID()); + params.put("RequestType", "1002"); + String dataSign = encrypt(requestData, logisticsSetting.getKdniaoAppKey(), "UTF-8"); + params.put("DataSign", urlEncoder(dataSign, "UTF-8")); + params.put("DataType", "2"); + + String result = sendPost(reqURL, params); + Map map = (Map) JSON.parse(result); + return new Traces(logistics.getName(), expNo, (List) map.get("Traces")); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Traces pollMapTrack(Logistics logistics, String expNo, String phone, String from, String to) { + try { + //请求地址-测试地址 + String testReqURL = "http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json"; + //请求地址-正式地址 + String reqURL = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"; + String RequestData = "{" + + "'OrderCode': ''," + + "'CustomerName': '" + phone.substring(phone.length() - 4) + "'," + + "'ShipperCode': '" + logistics.getCode() + "'," + + "'LogisticCode': '" + expNo + "'," + + "'SenderCityName': '" + from + "'," + + "'ReceiverCityName': '" + to + "'," + + "'IsReturnCoordinates': 1," + + "'IsReturnRouteMap': 1," + + "}"; + // 组装系统级参数 + Map params = new HashMap(); + params.put("RequestData", urlEncoder(RequestData, "UTF-8")); + params.put("EBusinessID", logisticsSetting.getKdniaoEbusinessID()); + params.put("RequestType", "8003"); + String dataSign = encrypt(RequestData, logisticsSetting.getKdniaoAppKey(), "UTF-8"); + params.put("DataSign", urlEncoder(dataSign, "UTF-8")); + // params.put("DataType", "2"); + // 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数 + String result = sendPost(reqURL, params); + log.error(result); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Map labelOrder(LabelOrderDTO labelOrderDTO) { + try { + Map resultMap = new HashMap(); + //订单 + Order order = labelOrderDTO.getOrder(); + //订单货物 + List orderItems = labelOrderDTO.getOrderItems(); + //获取对应物流 + Logistics logistics = labelOrderDTO.getLogistics(); + //收件人地址 + String[] ConsigneeAddress = order.getConsigneeAddressPath().split(","); + //获取店家信息 + StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDTO = labelOrderDTO.getStoreDeliverGoodsAddressDTO(); + //发件人地址 + String[] consignorAddress = storeDeliverGoodsAddressDTO.getSalesConsignorAddressPath().split(","); + //店铺-物流公司设置 + StoreLogistics storeLogistics = labelOrderDTO.getStoreLogistics(); + + //组装快递鸟应用级参数 + String resultDate = "{" + + "'OrderCode': '" + order.getSn() + "'," + //订单编码 + "'ShipperCode': '" + logistics.getCode() + "'," + //快递公司编码 + "'CustomerName': '" + storeLogistics.getCustomerName() + "'," +//客户编码 + "'CustomerPwd': '" + storeLogistics.getCustomerPwd() + "'," + //客户密码 + "'MonthCode': '" + storeLogistics.getMonthCode() + "'," + //密钥 + "'SendSite': '" + storeLogistics.getSendSite() + "'," + //归属网点 + "'SendStaff': '" + storeLogistics.getSendStaff() + "'," + //收件快递员 + "'PayType': " + storeLogistics.getPayType() + "," + + "'ExpType': " + storeLogistics.getExpType() + "," + + //发件人信息 + "'Sender': {" + + "'Name': '" + storeDeliverGoodsAddressDTO.getSalesConsignorName() + "'," + + "'Mobile': '" + storeDeliverGoodsAddressDTO.getSalesConsignorMobile() + "'," + + "'ProvinceName': '" + consignorAddress[0] + "'," + //省 + "'CityName': '" + consignorAddress[1] + "'," + //市 + "'ExpAreaName': '" + consignorAddress[2] + "'," + //区 + "'Address': '" + storeDeliverGoodsAddressDTO.getSalesConsignorDetail() + "'" + //发件人详细地址 + "}," + + //收件人信息 + "'Receiver': {" + + "'Name': '" + order.getConsigneeName() + "'," + + "'Mobile': '" + order.getConsigneeMobile() + "'," + + "'ProvinceName': '" + ConsigneeAddress[0] + "'," + //省 + "'CityName': '" + ConsigneeAddress[1] + "'," + //市 + "'ExpAreaName': '" + ConsigneeAddress[2] + "'," + //区 + "'Address': '" + order.getConsigneeDetail() + "'" + //收件人详细地址 + "}," + + //商品信息 + "'Commodity': ["; + + //子订单信息 + for (OrderItem orderItem : orderItems) { + resultDate = resultDate + "{" + + "'GoodsName': '" + orderItem.getGoodsName() + "'," + + "'Goodsquantity': '" + orderItem.getNum() + "'" + + "},"; + } + resultDate = resultDate + "]," + + "'Quantity': " + orderItems.size() + "," + //包裹数 + "'IsReturnPrintTemplate':1," + //生成电子面单模板 + "'Remark': '" + order.getRemark() + "'" +//商家备注 + "}"; + + + //组织系统级参数 + Map params = new HashMap<>(); + //请求地址-测试地址 + String testReqURL = "http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json"; + //请求地址-正式地址 + String reqURL = "https://api.kdniao.com/api/EOrderService"; + + //进行格式加密 + params.put("RequestData", urlEncoder(resultDate, "UTF-8")); + params.put("EBusinessID", logisticsSetting.getKdniaoEbusinessID()); + params.put("RequestType", "1007"); + + String dataSign = encrypt(resultDate, logisticsSetting.getKdniaoAppKey(), "UTF-8"); + params.put("DataSign", dataSign); + params.put("DataType", "2"); + // 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数 + String result = sendPost(reqURL, params); + if (CharSequenceUtil.isEmpty(result) || CharSequenceUtil.isBlank(result)) { + throw new ServiceException(ResultCode.LOGISTICS_CHECK_SETTING); + } + //根据公司业务处理返回的信息...... + JSONObject obj = JSONObject.parseObject(result); + log.info("电子面单响应:{}", result); + if (!"100".equals(obj.getString("ResultCode"))) { +// resultMap.put("Reason",obj.getString("Reason")); + throw new ServiceException(obj.getString("Reason")); +// return resultMap; + } + + JSONObject orderJson = JSONObject.parseObject(obj.getString("Order")); + resultMap.put("printTemplate",obj.getString("PrintTemplate")); + return resultMap; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public String createOrder(OrderDetailVO orderDetailVO) { + return null; + } + + + /** + * MD5加密 + * + * @param str 内容 + * @param charset 编码方式 + * @throws Exception + */ + @SuppressWarnings("unused") + private String MD5(String str, String charset) throws Exception { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(str.getBytes(charset)); + byte[] result = md.digest(); + StringBuffer sb = new StringBuffer(32); + for (int i = 0; i < result.length; i++) { + int val = result[i] & 0xff; + if (val <= 0xf) { + sb.append("0"); + } + sb.append(Integer.toHexString(val)); + } + return sb.toString().toLowerCase(); + } + + /** + * base64编码 + * + * @param str 内容 + * @param charset 编码方式di + * @throws UnsupportedEncodingException + */ + private String base64(String str, String charset) throws UnsupportedEncodingException { + return base64Encode(str.getBytes(charset)); + } + + @SuppressWarnings("unused") + private String urlEncoder(String str, String charset) throws UnsupportedEncodingException { + return URLEncoder.encode(str, charset); + } + + /** + * 电商Sign签名生成 + * + * @param content 内容 + * @param keyValue Appkey + * @param charset 编码方式 + * @return DataSign签名 + * @throws UnsupportedEncodingException ,Exception + */ + @SuppressWarnings("unused") + private String encrypt(String content, String keyValue, String charset) throws Exception { + if (keyValue != null) { + return base64(MD5(content + keyValue, charset), charset); + } + return base64(MD5(content, charset), charset); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param params 请求的参数集合 + * @return 远程资源的响应结果 + */ + @SuppressWarnings("unused") + private String sendPost(String url, Map params) { + OutputStreamWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try { + URL realUrl = new URL(url); + HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); + //发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + //POST方法 + conn.setRequestMethod("POST"); + //设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.connect(); + //获取URLConnection对象对应的输出流 + out = new OutputStreamWriter(conn.getOutputStream(), StandardCharsets.UTF_8); + //发送请求参数 + if (params != null) { + StringBuilder param = new StringBuilder(); + for (Map.Entry entry : params.entrySet()) { + if (param.length() > 0) { + param.append("&"); + } + param.append(entry.getKey()); + param.append("="); + param.append(entry.getValue()); + } + out.write(param.toString()); + } + //flush输出流的缓冲 + out.flush(); + //定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) { + result.append(line); + } + } catch (Exception e) { + log.error("向指定 URL 发送POST方法的请求错误", e); + } + //使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return result.toString(); + } + + + private static final char[] BASE64_ENCODE_CHARS = new char[]{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/'}; + + public static String base64Encode(byte[] data) { + StringBuffer sb = new StringBuffer(); + int len = data.length; + int i = 0; + int b1, b2, b3; + while (i < len) { + b1 = data[i++] & 0xff; + if (i == len) { + sb.append(BASE64_ENCODE_CHARS[b1 >>> 2]); + sb.append(BASE64_ENCODE_CHARS[(b1 & 0x3) << 4]); + sb.append("=="); + break; + } + b2 = data[i++] & 0xff; + if (i == len) { + sb.append(BASE64_ENCODE_CHARS[b1 >>> 2]); + sb.append(BASE64_ENCODE_CHARS[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); + sb.append(BASE64_ENCODE_CHARS[(b2 & 0x0f) << 2]); + sb.append("="); + break; + } + b3 = data[i++] & 0xff; + sb.append(BASE64_ENCODE_CHARS[b1 >>> 2]); + sb.append(BASE64_ENCODE_CHARS[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); + sb.append(BASE64_ENCODE_CHARS[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); + sb.append(BASE64_ENCODE_CHARS[b3 & 0x3f]); + } + return sb.toString(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/Kuaidi100Plugin.java b/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/Kuaidi100Plugin.java new file mode 100644 index 00000000..b66980f8 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/Kuaidi100Plugin.java @@ -0,0 +1,191 @@ +package cn.lili.modules.logistics.plugin.kuaidi100; + +import cn.lili.modules.logistics.LogisticsPlugin; +import cn.lili.modules.logistics.entity.dto.LabelOrderDTO; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; +import cn.lili.modules.logistics.plugin.kuaidi100.utils.Kuaidi100SignUtils; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.entity.vo.OrderDetailVO; +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; +import cn.lili.modules.system.entity.dos.Logistics; +import cn.lili.modules.system.entity.dto.LogisticsSetting; +import cn.lili.modules.system.entity.vo.Traces; +import com.google.gson.Gson; +import com.kuaidi100.sdk.api.LabelV2; +import com.kuaidi100.sdk.api.QueryTrack; +import com.kuaidi100.sdk.api.QueryTrackMap; +import com.kuaidi100.sdk.contant.ApiInfoConstant; +import com.kuaidi100.sdk.contant.PrintType; +import com.kuaidi100.sdk.core.IBaseClient; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.ManInfo; +import com.kuaidi100.sdk.request.PrintReq; +import com.kuaidi100.sdk.request.QueryTrackParam; +import com.kuaidi100.sdk.request.QueryTrackReq; +import com.kuaidi100.sdk.request.labelV2.OrderReq; +import com.kuaidi100.sdk.response.QueryTrackData; +import com.kuaidi100.sdk.response.QueryTrackMapResp; +import com.kuaidi100.sdk.response.QueryTrackResp; +import com.kuaidi100.sdk.response.samecity.OrderResp; +import com.kuaidi100.sdk.utils.SignUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 快递100插件 + * + * @author Bulbasaur + */ +@Slf4j +public class Kuaidi100Plugin implements LogisticsPlugin { + + + @Autowired + private LogisticsSetting logisticsSetting; + + public Kuaidi100Plugin(LogisticsSetting logisticsSetting) { + this.logisticsSetting = logisticsSetting; + } + + @Override + public LogisticsEnum pluginName() { + return LogisticsEnum.KUAIDI100; + } + + @Override + public Traces pollQuery(Logistics logistics, String expNo, String phone) { + try { + QueryTrackReq queryTrackReq = new QueryTrackReq(); + QueryTrackParam queryTrackParam = new QueryTrackParam(); + queryTrackParam.setCom(logistics.getCode()); + queryTrackParam.setNum(expNo); + queryTrackParam.setPhone(phone); + String param = new Gson().toJson(queryTrackParam); + + queryTrackReq.setParam(param); + queryTrackReq.setCustomer(logisticsSetting.getKuaidi100Customer()); + queryTrackReq.setSign(Kuaidi100SignUtils.querySign(param, logisticsSetting.getKuaidi100Key(), logisticsSetting.getKuaidi100Customer())); + + IBaseClient baseClient = new QueryTrack(); + HttpResult httpResult = baseClient.execute(queryTrackReq); + QueryTrackResp queryTrackResp = new Gson().fromJson(httpResult.getBody(), QueryTrackResp.class); + log.info(String.valueOf(queryTrackResp.getData())); + + List traces = new ArrayList<>(); + for (QueryTrackData queryTrackData : queryTrackResp.getData()) { + Map map = new HashMap(); + map.put("AcceptTime", queryTrackData.getTime()); + map.put("AcceptStation", queryTrackData.getContext()); + map.put("Remark", null); + traces.add(map); + } + return new Traces(logistics.getName(), expNo, traces); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Traces pollMapTrack(Logistics logistics, String expNo, String phone, String from, String to) { + try { + QueryTrackReq queryTrackReq = new QueryTrackReq(); + QueryTrackParam queryTrackParam = new QueryTrackParam(); + queryTrackParam.setCom(logistics.getCode()); + queryTrackParam.setNum(expNo); + queryTrackParam.setPhone(phone); + queryTrackParam.setFrom(from); + queryTrackParam.setTo(to); + queryTrackParam.setResultv2("5"); + String param = new Gson().toJson(queryTrackParam); + + queryTrackReq.setParam(param); + queryTrackReq.setCustomer(logisticsSetting.getKuaidi100Customer()); + queryTrackReq.setSign(SignUtils.querySign(param, logisticsSetting.getKuaidi100Key(), logisticsSetting.getKuaidi100Customer())); + + IBaseClient baseClient = new QueryTrackMap(); + HttpResult result = baseClient.execute(queryTrackReq); + + QueryTrackMapResp queryTrackMapResp = new Gson().fromJson(result.getBody(), QueryTrackMapResp.class); + System.out.println(queryTrackMapResp); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Map labelOrder(LabelOrderDTO labelOrderDTO) { + try { + //订单 + Order order = labelOrderDTO.getOrder(); + //订单货物 + List orderItems = labelOrderDTO.getOrderItems(); + //获取对应物流 + Logistics logistics = labelOrderDTO.getLogistics(); + //收件人地址 + String[] consigneeAddress = order.getConsigneeAddressPath().split(","); + //获取店家信息 + StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDTO = labelOrderDTO.getStoreDeliverGoodsAddressDTO(); + //发件人地址 + String[] consignorAddress = storeDeliverGoodsAddressDTO.getSalesConsignorAddressPath().split(","); + //店铺-物流公司设置 + StoreLogistics storeLogistics = labelOrderDTO.getStoreLogistics(); + + + ManInfo recManInfo = new ManInfo(); + recManInfo.setName(order.getConsigneeName()); + recManInfo.setMobile(order.getConsigneeMobile()); + recManInfo.setPrintAddr(consigneeAddress[0] + consigneeAddress[1] + consigneeAddress[2] + consigneeAddress[3] + order.getConsigneeDetail()); + + ManInfo sendManInfo = new ManInfo(); + sendManInfo.setName(storeDeliverGoodsAddressDTO.getSalesConsignorName()); + sendManInfo.setMobile(storeDeliverGoodsAddressDTO.getSalesConsignorMobile()); + sendManInfo.setPrintAddr(consignorAddress[0] + consignorAddress[1] + consignorAddress[2] + consignorAddress[3] + storeDeliverGoodsAddressDTO.getSalesConsignorDetail()); + + OrderReq orderReq = new OrderReq(); + orderReq.setKuaidicom(logistics.getCode()); + orderReq.setCount(1); + // orderReq.setSiid(siid); + //orderReq.setTempId("60f6c17c7c223700131d8bc3"); + orderReq.setSendMan(sendManInfo); + orderReq.setRecMan(recManInfo); + + orderReq.setPrintType(PrintType.CLOUD); + + String param = new Gson().toJson(orderReq); + String t = System.currentTimeMillis() + ""; + + PrintReq printReq = new PrintReq(); + printReq.setT(t); + printReq.setKey(logisticsSetting.getKuaidi100Key()); + printReq.setSign(SignUtils.printSign(param, t, logisticsSetting.getKuaidi100Key(), logisticsSetting.getKuaidi100Customer())); + printReq.setMethod(ApiInfoConstant.ORDER); + printReq.setParam(param); + + IBaseClient baseClient = new LabelV2(); + HttpResult result = baseClient.execute(printReq); + System.out.println(result.getBody()); + QueryTrackMapResp queryTrackMapResp = new Gson().fromJson(result.getBody(), QueryTrackMapResp.class); + OrderResp orderResp = new Gson().fromJson(result.getBody(), OrderResp.class); + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public String createOrder(OrderDetailVO orderDetailVO) { + return null; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/utils/Kuaidi100SignUtils.java b/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/utils/Kuaidi100SignUtils.java new file mode 100644 index 00000000..b90470ec --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/utils/Kuaidi100SignUtils.java @@ -0,0 +1,73 @@ +package cn.lili.modules.logistics.plugin.kuaidi100.utils; + +import org.apache.commons.codec.digest.DigestUtils; + +/** + * @Author: api.kuaidi100.com + * @Date: 2020-07-14 16:54 + */ +public class Kuaidi100SignUtils { + + /** + * 快递100加密方式统一为MD5后转大写 + * + * @param msg + * @return + */ + public static String sign(String msg) { + return DigestUtils.md5Hex(msg).toUpperCase(); + } + + /** + * 查询加密 + * + * @param param + * @param key + * @param customer + * @return + */ + public static String querySign(String param, String key, String customer) { + return sign(param + key + customer); + } + + /** + * 打印/下单 加密 + * + * @param param + * @param t + * @param key + * @param secret + * @return: java.lang.String + * @author: api.kuaidi100.com + * @time: 2020/12/3 9:23 + */ + public static String printSign(String param, String t, String key, String secret) { + return sign(param + t + key + secret); + } + + /** + * 云平台 加密 + * + * @param key + * @param secret + * @return: java.lang.String + * @author: api.kuaidi100.com + * @time: 2020/12/3 9:23 + */ + public static String cloudSign(String key, String secret) { + return sign(key + secret); + } + + /** + * 短信加密 + * + * @param key + * @param userId + * @return: java.lang.String + * @author: api.kuaidi100.com + * @time: 2020/12/3 9:32 + */ + public static String smsSign(String key, String userId) { + return sign(key + userId); + } +} diff --git a/framework/src/main/java/cn/lili/modules/logistics/plugin/shunfeng/ShunfengPlugin.java b/framework/src/main/java/cn/lili/modules/logistics/plugin/shunfeng/ShunfengPlugin.java new file mode 100644 index 00000000..f813baad --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/logistics/plugin/shunfeng/ShunfengPlugin.java @@ -0,0 +1,242 @@ +package cn.lili.modules.logistics.plugin.shunfeng; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.SpringContextUtil; +import cn.lili.modules.logistics.LogisticsPlugin; +import cn.lili.modules.logistics.entity.dto.LabelOrderDTO; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.entity.vo.OrderDetailVO; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; +import cn.lili.modules.store.service.StoreDetailService; +import cn.lili.modules.system.entity.dos.Logistics; +import cn.lili.modules.system.entity.dto.LogisticsSetting; +import cn.lili.modules.system.entity.vo.Traces; +import com.sf.csim.express.service.CallExpressServiceTools; +import com.sf.csim.express.service.HttpClientUtil; +import com.sf.csim.express.service.IServiceCodeStandard; +import com.sf.csim.express.service.code.ExpressServiceCodeEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.UnsupportedEncodingException; +import java.util.*; + +/** + * 顺丰插件 + * @author admin + */ +@Slf4j +public class ShunfengPlugin implements LogisticsPlugin { + + /** + * ExpressServiceCodeEnum 对应速运类-快递APIs + * POSTServiceCodeEnum 对应速运类-驿站APIs + * YJTServiceCodeEnum 对应解决方案-医寄通APIs + * EPSServiceCodeEnum 对应解决方案-快递管家APIs + * 详情见code目录下枚举类,客户可自行修改引用的该类 + **/ + private LogisticsSetting logisticsSetting; + + public ShunfengPlugin(){} + + public ShunfengPlugin(LogisticsSetting logisticsSetting) { + this.logisticsSetting = logisticsSetting; + } + + @Override + public LogisticsEnum pluginName() { + return LogisticsEnum.SHUNFENG; + } + + /** + * 文档地址:https://open.sf-express.com/Api/ApiDetails?level3=393&interName=%E4%B8%8B%E8%AE%A2%E5%8D%95%E6%8E%A5%E5%8F%A3-EXP_RECE_CREATE_ORDER + * + * @param orderDetailVO + */ + public String createOrder(OrderDetailVO orderDetailVO) { + StoreDetailService storeService = SpringContextUtil.getBean(StoreDetailService.class); + StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDTO = storeService.getStoreDeliverGoodsAddressDto(orderDetailVO.getOrder().getStoreId()); + if(storeDeliverGoodsAddressDTO == null){ + throw new ServiceException(ResultCode.STORE_DELIVER_ADDRESS_EXIST); + } + try { + Order order = orderDetailVO.getOrder(); + Map msgDataMap = new HashMap(); + msgDataMap.put("language", "zh-CN"); + msgDataMap.put("orderId", order.getSn()); + //托寄物信息 + List> cargoDetails = new ArrayList<>(); + for (OrderItem orderItem : orderDetailVO.getOrderItems()) { + Map map = new HashMap<>(); + map.put("name", orderItem.getGoodsName()); + cargoDetails.add(map); + } + msgDataMap.put("cargoDetails", cargoDetails); + + //收寄双方信息 + List> contactInfoList = new ArrayList<>(); + Map storeContactInfoMap = new HashMap<>(); + storeContactInfoMap.put("contactType", 1); + storeContactInfoMap.put("contact", storeDeliverGoodsAddressDTO.getSalesConsignorName()); + storeContactInfoMap.put("mobile", storeDeliverGoodsAddressDTO.getSalesConsignorMobile()); + //国家或地区2位代码 参照附录 + storeContactInfoMap.put("country", "CN"); + //详细地址,若有四级行政区划,如镇/街道等信息可拼接至此字段,格式样例:镇/街道+详细地址。若province/city 字段的值不传,此字段必须包含省市信息,避免影响原寄地代码识别,如:广东省深圳市福田区新洲十一街万基商务大厦10楼;此字段地址必须详细,否则会影响目的地中转识别; + storeContactInfoMap.put("address", storeDeliverGoodsAddressDTO.getSalesConsignorAddressPath() + storeDeliverGoodsAddressDTO.getSalesConsignorDetail()); + contactInfoList.add(storeContactInfoMap); + + Map memberContactInfoMap = new HashMap<>(); + memberContactInfoMap.put("contactType", 2); + memberContactInfoMap.put("contact", order.getConsigneeName()); + memberContactInfoMap.put("mobile", order.getConsigneeMobile()); + //国家或地区2位代码 参照附录 + memberContactInfoMap.put("country", "CN"); + //详细地址,若有四级行政区划,如镇/街道等信息可拼接至此字段,格式样例:镇/街道+详细地址。若province/city 字段的值不传,此字段必须包含省市信息,避免影响原寄地代码识别,如:广东省深圳市福田区新洲十一街万基商务大厦10楼;此字段地址必须详细,否则会影响目的地中转识别; + memberContactInfoMap.put("address", order.getConsigneeAddressPath() + order.getConsigneeDetail()); + contactInfoList.add(memberContactInfoMap); + msgDataMap.put("contactInfoList", contactInfoList); + + msgDataMap.put("expressTypeId", 1); + msgDataMap.put("isReturnRoutelabel", 1); + + + String result = sendPost(ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER, msgDataMap); + JSONObject resultData = JSONUtil.parseObj(result).getJSONObject("apiResultData"); + if(Boolean.TRUE.toString().equals(resultData.get("success").toString())){ + return resultData.getJSONObject("msgData").getJSONArray("waybillNoInfoList").getJSONObject(0).get("waybillNo").toString(); + } + throw new ServiceException(resultData.get("errorMsg").toString()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + /** + * 文档地址:https://open.sf-express.com/Api/ApiDetails?apiServiceCode=EXP_RECE_SEARCH_ROUTES&category=1&apiClassify=1&interName=%E8%B7%AF%E7%94%B1%E6%9F%A5%E8%AF%A2%E6%8E%A5%E5%8F%A3-EXP_RECE_SEARCH_ROUTES + * + * @param logistics 物流公司 + * @param expNo + * @param phone + * @return + */ + @Override + public Traces pollQuery(Logistics logistics, String expNo, String phone) { + try { + Map msgDataMap = new HashMap(); + msgDataMap.put("language", "zh-CN"); + /** + * 查询号类别: + * 1:根据顺丰运单号查询,trackingNumber将被当作顺丰运单号处理 + * 2:根据客户订单号查询,trackingNumber将被当作客户订单号处理 + */ + msgDataMap.put("trackingType", 1); + List trackingNumber = new ArrayList<>(); + trackingNumber.add(expNo); + msgDataMap.put("trackingNumber", trackingNumber); + JSONObject result = JSONUtil.parseObj(sendPost(ExpressServiceCodeEnum.EXP_RECE_SEARCH_ROUTES, msgDataMap)); + JSONObject resultData = result.getJSONObject("apiResultData"); + if(Boolean.TRUE.toString().equals(resultData.get("success").toString())){ + JSONArray routesJson = resultData.getJSONObject("msgData").getJSONArray("routeResps").getJSONObject(0).getJSONArray("routes"); + List routes = routesJson.toList(Map.class); + return new Traces(logistics.getName(),expNo,routes); + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return null; + } + + @Override + public Traces pollMapTrack(Logistics logistics, String expNo, String phone, String from, String to) { + return null; + } + + /** + * 文档地址:http://open.sf-express.com/Api/ApiDetails?level3=317&interName=%E4%BA%91%E6%89%93%E5%8D%B0%E9%9D%A2%E5%8D%952.0%E6%8E%A5%E5%8F%A3-COM_RECE_CLOUD_PRINT_WAYBILLS + * + * @param labelOrderDTO 电子面单DTO + * @return + */ + @Override + public Map labelOrder(LabelOrderDTO labelOrderDTO) { + try { + Map msgDataMap = new HashMap<>(); + //模板编码 + //关联云打印接口后,点击查看,可在接口详情页获取模板编码,类似:fm_76130_standard_{partnerId} + msgDataMap.put("templateCode", logisticsSetting.getTemplateCode()); + //业务数据 + Map documents = new HashMap<>(); + documents.put("masterWaybillNo", labelOrderDTO.getOrder().getLogisticsNo()); + msgDataMap.put("documents",documents); + msgDataMap.put("sync",true); + /** + * 版本号,传固定值:2.0 + */ + msgDataMap.put("version", "2.0"); + JSONObject result = JSONUtil.parseObj(sendPost(ExpressServiceCodeEnum.COM_RECE_CLOUD_PRINT_WAYBILLS, msgDataMap)); + JSONObject resultData = result.getJSONObject("apiResultData"); + if(Boolean.TRUE.toString().equals(resultData.get("success").toString())){ + return resultData.getJSONObject("obj").getJSONArray("files").toList(Map.class).get(0); + } + throw new ServiceException(resultData.getJSONArray("errorMessage").get(0).toString()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + /** + * 文档地址:https://open.sf-express.com/Api/ApiDetails?level3=409&interName=%E9%A2%84%E8%AE%A1%E6%B4%BE%E9%80%81%E6%97%B6%E9%97%B4%E6%8E%A5%E5%8F%A3-EXP_RECE_SEARCH_PROMITM + * + * @param searchNo + * @param checkNos + */ + public String searchPromitm(String searchNo, String checkNos) { + try { + Map msgDataMap = new HashMap(); + //顺丰运单号 + msgDataMap.put("searchNo", searchNo); + //校验类型 1,电话号码校验 2,月结卡号校验 + msgDataMap.put("checkType", 1); + //校验值 当校验类型为1时传电话号码 当校验类型为2时传月结卡号 + List mobileList= new ArrayList<>(); + mobileList.add(checkNos); + msgDataMap.put("checkNos", mobileList); + JSONObject result = JSONUtil.parseObj(sendPost(ExpressServiceCodeEnum.EXP_RECE_SEARCH_PROMITM, msgDataMap)); + JSONObject resultData = result.getJSONObject("apiResultData"); + if(Boolean.TRUE.toString().equals(resultData.get("success").toString())){ + return resultData.getJSONObject("msgData").get("promiseTm").toString(); + } + throw new ServiceException(resultData.get("errorMsg").toString()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + private String sendPost(IServiceCodeStandard standardService, Map msgDataMap) throws UnsupportedEncodingException { + CallExpressServiceTools tools = CallExpressServiceTools.getInstance(); + Map params = new HashMap(); + String timeStamp = String.valueOf(System.currentTimeMillis()); + // 顾客编码 + params.put("partnerID", logisticsSetting.getClientCode()); + params.put("requestID", UUID.randomUUID().toString().replace("-", "")); + // 接口服务码 + params.put("serviceCode", standardService.getCode()); + params.put("timestamp", timeStamp); + params.put("msgData", JSONUtil.toJsonStr(msgDataMap)); + + params.put("msgDigest", tools.getMsgDigest(params.get("msgData"), timeStamp, logisticsSetting.getCheckWord())); + String result = HttpClientUtil.post(logisticsSetting.getCallUrl(), params); + + log.info("===调用地址 ===" + logisticsSetting.getCallUrl()); + log.info("===顾客编码 ===" + logisticsSetting.getClientCode()); + log.info("===返回结果:" + result); + + return result; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/aop/annotation/PointLogPoint.java b/framework/src/main/java/cn/lili/modules/member/aop/annotation/PointLogPoint.java similarity index 72% rename from framework/src/main/java/cn/lili/modules/member/entity/aop/annotation/PointLogPoint.java rename to framework/src/main/java/cn/lili/modules/member/aop/annotation/PointLogPoint.java index 61b3d1a6..3289396f 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/aop/annotation/PointLogPoint.java +++ b/framework/src/main/java/cn/lili/modules/member/aop/annotation/PointLogPoint.java @@ -1,4 +1,4 @@ -package cn.lili.modules.member.entity.aop.annotation; +package cn.lili.modules.member.aop.annotation; import java.lang.annotation.*; @@ -7,7 +7,7 @@ import java.lang.annotation.*; * 会员积分操作aop * * @author pikachu - * @date 2020/11/17 7:22 下午 + * @since 2020/11/17 7:22 下午 */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java b/framework/src/main/java/cn/lili/modules/member/aop/interceptor/PointLogInterceptor.java similarity index 70% rename from framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java rename to framework/src/main/java/cn/lili/modules/member/aop/interceptor/PointLogInterceptor.java index 8e16afd5..073350b1 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java +++ b/framework/src/main/java/cn/lili/modules/member/aop/interceptor/PointLogInterceptor.java @@ -1,10 +1,11 @@ -package cn.lili.modules.member.entity.aop.interceptor; +package cn.lili.modules.member.aop.interceptor; -import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberPointsHistory; +import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberPointsHistoryService; import cn.lili.modules.member.service.MemberService; +import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; @@ -15,8 +16,9 @@ import org.springframework.stereotype.Component; * 积分操作切面 * * @author Chopper - * @date 2020/11/17 7:22 下午 + * @since 2020/11/17 7:22 下午 */ +@Slf4j @Aspect @Component public class PointLogInterceptor { @@ -27,7 +29,7 @@ public class PointLogInterceptor { @Autowired private MemberService memberService; - @After("@annotation(cn.lili.modules.member.entity.aop.annotation.PointLogPoint)") + @After("@annotation(cn.lili.modules.member.aop.annotation.PointLogPoint)") public void doAfter(JoinPoint pjp) { //参数 Object[] obj = pjp.getArgs(); @@ -38,15 +40,20 @@ public class PointLogInterceptor { point = Long.valueOf(obj[0].toString()); } //变动类型 - Integer type = 0; + String type = PointTypeEnum.INCREASE.name(); if (obj[1] != null) { - type = Integer.valueOf(obj[1].toString()); + type = obj[1].toString(); } - //会员ID + // 会员ID String memberId = ""; if (obj[2] != null) { memberId = obj[2].toString(); } + // 变动积分为0,则直接返回 + if (point == 0) { + return; + } + //根据会员id查询会员信息 Member member = memberService.getById(memberId); if (member != null) { @@ -54,15 +61,21 @@ public class PointLogInterceptor { memberPointsHistory.setMemberId(member.getId()); memberPointsHistory.setMemberName(member.getUsername()); memberPointsHistory.setPointType(type); + memberPointsHistory.setVariablePoint(point); - memberPointsHistory.setBeforePoint(new Double(CurrencyUtil.sub(member.getPoint(), point)).longValue()); + if (type.equals(PointTypeEnum.INCREASE.name())) { + memberPointsHistory.setBeforePoint(member.getPoint() - point); + } else { + memberPointsHistory.setBeforePoint(member.getPoint() + point); + } + memberPointsHistory.setPoint(member.getPoint()); memberPointsHistory.setContent(obj[3] == null ? "" : obj[3].toString()); memberPointsHistory.setCreateBy("系统"); memberPointsHistoryService.save(memberPointsHistory); } } catch (Exception e) { - e.printStackTrace(); + log.error("积分操作错误", e); } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java new file mode 100644 index 00000000..fc9f8b01 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java @@ -0,0 +1,81 @@ +package cn.lili.modules.member.entity.dos; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 店员Model + * + * @author wget + * @title: Clerk + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +@Data +@TableName("li_clerk") +@ApiModel(value = "店员") +@NoArgsConstructor +@AllArgsConstructor +public class Clerk extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "店员名称") + private String clerkName; + + @ApiModelProperty(value = "会员ID") + private String memberId; + + @ApiModelProperty(value = "店铺ID") + private String storeId; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "角色id集合") + private String roleIds; + + @ApiModelProperty(value = "是否是店主", hidden = true) + private Boolean shopkeeper = false; + + @ApiModelProperty(value = "是否是超级管理员 超级管理员/普通管理员") + private Boolean isSuper = false; + + @ApiModelProperty(value = "状态 默认true正常 false禁用") + private Boolean status = true; + + + /** + * 构建店员 + * + * @param clerkAddDTO + */ + public Clerk(ClerkAddDTO clerkAddDTO) { + if (clerkAddDTO.getRoles()!=null && !clerkAddDTO.getRoles().isEmpty()) { + this.roleIds = CharSequenceUtil.join(",", clerkAddDTO.getRoles()); + } + this.memberId = clerkAddDTO.getMemberId(); + this.departmentId = clerkAddDTO.getDepartmentId(); + this.storeId = clerkAddDTO.getStoreId(); + this.clerkName = clerkAddDTO.getUsername(); + + } + + + public Clerk(Store store){ + this.memberId = store.getMemberId(); + this.storeId = store.getId(); + this.clerkName = store.getMemberName(); + this.setShopkeeper(true); + this.setIsSuper(true); + this.setStatus(true); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/FootPrint.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/FootPrint.java index 9c68a425..355df4a3 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/FootPrint.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/FootPrint.java @@ -1,25 +1,23 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 浏览历史 * * @author Chopper - * @date 2020/11/17 7:22 下午 + * @since 2020/11/17 7:22 下午 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_foot_print") @TableName("li_foot_print") @ApiModel(value = "浏览历史") @NoArgsConstructor @@ -32,6 +30,9 @@ public class FootPrint extends BaseEntity { @ApiModelProperty(value = "会员ID") private String memberId; + @ApiModelProperty(value = "店铺Id") + private String storeId; + @ApiModelProperty(value = "商品ID") private String goodsId; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/GoodsCollection.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/GoodsCollection.java index 749a97c4..9a68dbed 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/GoodsCollection.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/GoodsCollection.java @@ -1,8 +1,8 @@ package cn.lili.modules.member.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -12,32 +12,19 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 会员商品收藏 * * @author Chopper - * @date 2020/11/18 3:31 下午 + * @since 2020/11/18 3:31 下午 */ @Data -@Entity @NoArgsConstructor @ApiModel(value = "会员商品收藏") @TableName("li_goods_collection") -@Table(name = "li_goods_collection") -public class GoodsCollection { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class GoodsCollection extends BaseIdEntity { @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java index ea2aaa44..b39565fc 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java @@ -1,6 +1,9 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -9,8 +12,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import java.util.Date; @@ -19,11 +20,9 @@ import java.util.Date; * 会员 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member") @TableName("li_member") @ApiModel(value = "会员") @NoArgsConstructor @@ -57,12 +56,17 @@ public class Member extends BaseEntity { @NotEmpty(message = "手机号码不能为空") @ApiModelProperty(value = "手机号码", required = true) + @Sensitive(strategy = SensitiveStrategy.PHONE) private String mobile; @Min(message = "必须为数字", value = 0) @ApiModelProperty(value = "积分数量") private Long point; + @Min(message = "必须为数字", value = 0) + @ApiModelProperty(value = "积分总数量") + private Long totalPoint; + @ApiModelProperty(value = "会员头像") private String face; @@ -76,7 +80,7 @@ public class Member extends BaseEntity { private String storeId; /** - * @see cn.lili.modules.base.entity.enums.ClientTypeEnum + * @see ClientTypeEnum */ @ApiModelProperty(value = "客户端") private String clientEnum; @@ -85,19 +89,28 @@ public class Member extends BaseEntity { @ApiModelProperty(value = "最后一次登录时间") private Date lastLoginDate; + @ApiModelProperty(value = "会员等级ID") + private String gradeId; + + @Min(message = "必须为数字", value = 0) + @ApiModelProperty(value = "经验值数量") + private Long experience; + + public Member(String username, String password, String mobile) { this.username = username; this.password = password; this.mobile = mobile; - this.nickName = mobile; + this.nickName = "临时昵称"; this.disabled = true; this.haveStore = false; this.sex = 0; this.point = 0L; + this.totalPoint = 0L; this.lastLoginDate = new Date(); } - public Member(String username, String password, String mobile, String nickName, String face) { + public Member(String username, String password, String face, String nickName, Integer sex,String mobile) { this.username = username; this.password = password; this.mobile = mobile; @@ -105,21 +118,9 @@ public class Member extends BaseEntity { this.disabled = true; this.haveStore = false; this.face = face; - this.sex = 0; - this.point = 0L; - this.lastLoginDate = new Date(); - } - - public Member(String username, String password, String face, String nickName, Integer sex) { - this.username = username; - this.password = password; - this.mobile = ""; - this.nickName = nickName; - this.disabled = true; - this.haveStore = false; - this.face = face; this.sex = sex; this.point = 0L; + this.totalPoint = 0L; this.lastLoginDate = new Date(); } } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberAddress.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberAddress.java index 32ef3871..480d2a40 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberAddress.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberAddress.java @@ -1,27 +1,24 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; -import cn.lili.common.validation.Mobile; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.common.validation.Phone; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; /** * 会员地址 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_address") @TableName("li_member_address") @ApiModel(value = "会员地址") public class MemberAddress extends BaseEntity { @@ -35,8 +32,9 @@ public class MemberAddress extends BaseEntity { @ApiModelProperty(value = "收货人姓名") private String name; - @Mobile + @Phone @ApiModelProperty(value = "手机号码") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String mobile; @NotBlank(message = "地址不能为空") @@ -51,7 +49,6 @@ public class MemberAddress extends BaseEntity { @ApiModelProperty(value = "详细地址") private String detail; - @NotNull(message = "是否默认不能为空") @ApiModelProperty(value = "是否为默认收货地址") private Boolean isDefault; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberEvaluation.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberEvaluation.java index 0cf904b7..9ec652d2 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberEvaluation.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberEvaluation.java @@ -1,11 +1,13 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.SwitchEnum; -import cn.lili.common.utils.StringUtils; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.member.entity.dto.MemberEvaluationDTO; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -13,19 +15,15 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.BeanUtils; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotNull; /** * 会员商品评价 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_evaluation") @TableName("li_member_evaluation") @ApiModel(value = "会员商品评价") @NoArgsConstructor @@ -54,6 +52,7 @@ public class MemberEvaluation extends BaseEntity { @NotNull @ApiModelProperty(value = "会员名称") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; @NotNull @@ -81,7 +80,7 @@ public class MemberEvaluation extends BaseEntity { private String content; @ApiModelProperty(value = "评价图片") - private String image; + private String images; @NotNull @ApiModelProperty(value = "状态 OPEN 正常 ,CLOSE 关闭 ") @@ -93,11 +92,11 @@ public class MemberEvaluation extends BaseEntity { @ApiModelProperty(value = "评价回复图片") private String replyImage; - @ApiModelProperty(value = "评论是否有图片 1 有 ,0 没有") - private boolean haveImage; + @ApiModelProperty(value = "评论是否有图片 true 有 ,false 没有") + private Boolean haveImage; - @ApiModelProperty(value = "回复是否有图片 1 有 ,0 没有") - private boolean haveReplyImage; + @ApiModelProperty(value = "回复是否有图片 true 有 ,false 没有") + private Boolean haveReplyImage; @ApiModelProperty(value = "回复状态") private boolean replyStatus; @@ -112,28 +111,28 @@ public class MemberEvaluation extends BaseEntity { private Integer descriptionScore; - public MemberEvaluation(MemberEvaluationDTO memberEvaluationDTO, GoodsSku goodsSku, Member member,Order order){ + public MemberEvaluation(MemberEvaluationDTO memberEvaluationDTO, GoodsSku goodsSku, Member member, Order order) { //复制评价信息 BeanUtils.copyProperties(memberEvaluationDTO, this); //设置会员 - this.memberId=member.getId(); + this.memberId = member.getId(); //会员名称 - this.memberName=member.getNickName(); + this.memberName = member.getNickName(); //设置会员头像 - this.memberProfile=member.getFace(); + this.memberProfile = member.getFace(); //商品名称 - this.goodsName=goodsSku.getGoodsName(); + this.goodsName = goodsSku.getGoodsName(); //商品图片 - this.goodsImage=goodsSku.getThumbnail(); + this.goodsImage = goodsSku.getThumbnail(); //设置店铺ID - this.storeId=order.getStoreId(); + this.storeId = order.getStoreId(); //设置店铺名称 - this.storeName=order.getStoreName(); + this.storeName = order.getStoreName(); //设置订单编号 - this.orderNo=order.getSn(); + this.orderNo = order.getSn(); //是否包含图片 - this.haveImage=StringUtils.isNotEmpty(memberEvaluationDTO.getImages()); + this.haveImage = CharSequenceUtil.isNotEmpty(memberEvaluationDTO.getImages()); //默认开启评价 - this.status=SwitchEnum.OPEN.name(); + this.status = SwitchEnum.OPEN.name(); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberGrade.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberGrade.java new file mode 100644 index 00000000..601d823b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberGrade.java @@ -0,0 +1,36 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 会员等级 + * + * @author Bulbasaur + * @since 2021/5/14 5:43 下午 + */ +@Data +@TableName("li_member_grade") +@ApiModel(value = "会员等级") +public class MemberGrade extends BaseEntity { + + @NotNull + @ApiModelProperty(value = "等级名称") + private String gradeName; + + @NotNull + @ApiModelProperty(value = "等级图片") + private String gradeImage; + + @NotNull + @ApiModelProperty(value = "所需经验值") + private Integer experienceValue; + + @ApiModelProperty(value = "是否为默认等级") + private Boolean isDefault; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNotice.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNotice.java index 12fdb810..3f5ca961 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNotice.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNotice.java @@ -1,24 +1,19 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 会员站内信 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_notice") @TableName("li_member_notice") @ApiModel(value = "会员站内信") public class MemberNotice extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeLog.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeLog.java index 44dfe402..3343e1c8 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeLog.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeLog.java @@ -1,6 +1,6 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -8,67 +8,41 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** * 会员消息 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_notice_log") @TableName("li_member_notice_log") @ApiModel(value = "会员消息") public class MemberNoticeLog extends BaseEntity { private static final long serialVersionUID = 1L; - /** - * 标题 - */ - @Column(name = "title") + @ApiModelProperty(value = "标题") private String title; - /** - * 消息内容 - */ - @Column(name = "content") + @ApiModelProperty(value = "消息内容") private String content; - /** - * 会员id - */ - @Column(name = "member_ids") + @ApiModelProperty(value = "会员id") private String memberIds; - /** - * 管理员id - */ - @Column(name = "admin_id") + @ApiModelProperty(value = "管理员id") private String adminId; - /** - * 管理员名称 - */ - @Column(name = "admin_name") + @ApiModelProperty(value = "管理员名称") private String adminName; - /** - * 发送时间 - */ - @Column(name = "send_time") + @ApiModelProperty(value = "发送时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) private Date sendTime; - /** - * 发送类型 - */ - @Column(name = "send_type") + @ApiModelProperty(value = "发送类型,0全站,1指定会员") private Integer sendType; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeSenter.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeSenter.java index e7c8d4c8..7e62e2a9 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeSenter.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberNoticeSenter.java @@ -1,49 +1,40 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 会员消息 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_notice_senter") @TableName("li_member_notice_senter") @ApiModel(value = "会员消息") public class MemberNoticeSenter extends BaseEntity { /** * 标题 */ - @Column(name = "title") @ApiModelProperty(value = "标题") private String title; /** * 消息内容 */ - @Column(name = "content") @ApiModelProperty(value = "消息内容") private String content; /** * 会员id */ - @Column(name = "member_ids") @ApiModelProperty(value = "会员id") private String memberIds; /** * 发送类型 */ - @Column(name = "send_type") @ApiModelProperty(value = "发送类型,ALL 全站,SELECT 指定会员") private String sendType; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java index 7b11e00b..dc91cebc 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberPointsHistory.java @@ -1,9 +1,11 @@ package cn.lili.modules.member.entity.dos; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -13,36 +15,21 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; import java.util.Date; /** * 会员积分历史 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_points_history") @TableName("li_member_points_history") @ApiModel(value = "会员积分历史") -public class MemberPointsHistory { +public class MemberPointsHistory extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建者", hidden = true) @@ -58,6 +45,8 @@ public class MemberPointsHistory { @ApiModelProperty(value = "会员ID") private String memberId; + + @Sensitive(strategy = SensitiveStrategy.PHONE) @ApiModelProperty(value = "会员名称") private String memberName; @@ -67,15 +56,16 @@ public class MemberPointsHistory { @ApiModelProperty(value = "消费之前积分") private Long beforePoint; - @ApiModelProperty(value = "消费积分") + @ApiModelProperty(value = "变动积分") private Long variablePoint; @ApiModelProperty(value = "content") private String content; - @Min(message = "最小值为0", value = 0) - @Max(message = "最大值为1", value = 1) - @ApiModelProperty(value = "消费积分类型,1为增加,0为消费") - private Integer pointType; + /** + * @see cn.lili.modules.member.entity.enums.PointTypeEnum + */ + @ApiModelProperty(value = "积分类型") + private String pointType; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberReceipt.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberReceipt.java index b8ef4538..0b4a8ee4 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberReceipt.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberReceipt.java @@ -1,8 +1,8 @@ package cn.lili.modules.member.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -11,34 +11,21 @@ import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 会员发票 * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ @Data -@Entity -@Table(name = "li_member_receipt") @TableName("li_member_receipt") @ApiModel(value = "会员发票") -public class MemberReceipt { +public class MemberReceipt extends BaseIdEntity { private static final long serialVersionUID = -8210927482915675995L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @ApiModelProperty(value = "发票抬头") private String receiptTitle; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberSign.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberSign.java index 2691fedd..504975ca 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberSign.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberSign.java @@ -1,8 +1,8 @@ package cn.lili.modules.member.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -11,34 +11,21 @@ import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 会员签到 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_sign") @TableName("li_member_sign") @ApiModel(value = "会员签到") -public class MemberSign { +public class MemberSign extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -55,4 +42,8 @@ public class MemberSign { @ApiModelProperty(value = "连续签到天数") private Integer signDay; + + @ApiModelProperty(value = "签到日 为数字 从现在减去19700101 的日期") + private Integer day; + } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java new file mode 100644 index 00000000..4f4bd5c1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java @@ -0,0 +1,36 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 用户角色 + * + * @author Chopper + * @since 2020/11/19 12:18 + */ +@Data +@TableName("li_clerk_role") +@ApiModel(value = "用户角色") +@Builder +@NoArgsConstructor +public class StoreClerkRole extends BaseIdEntity { + + @ApiModelProperty(value = "店员唯一id") + private String clerkId; + + @ApiModelProperty(value = "角色唯一id") + private String roleId; + + public StoreClerkRole(String clerkId, String roleId) { + this.clerkId = clerkId; + this.roleId = roleId; + } + +} + diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreCollection.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreCollection.java index 09aba9b8..452a227d 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreCollection.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreCollection.java @@ -1,6 +1,6 @@ package cn.lili.modules.member.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,18 +8,14 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 会员店铺收藏 * * @author Chopper - * @date 2020/11/18 3:32 下午 + * @since 2020/11/18 3:32 下午 */ @Data -@Entity -@Table(name = "li_store_collection") @TableName("li_store_collection") @ApiModel(value = "会员收藏") @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartment.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartment.java new file mode 100644 index 00000000..e2921bbc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartment.java @@ -0,0 +1,37 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + + +/** + * 部门 + * + * @author Chopper + * @since 2020/11/19 11:57 + */ +@Data +@TableName("li_store_department") +@ApiModel(value = "店铺部门") +public class StoreDepartment extends BaseEntity { + + private static final long serialVersionUID = 1L; + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; + + @ApiModelProperty(value = "部门名称") + @NotEmpty(message = "部门名称不能为空") + private String title; + + @ApiModelProperty(value = "父id") + @NotEmpty(message = "父id不能为空") + private String parentId; + + @ApiModelProperty(value = "排序值") + private Double sortOrder; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartmentRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartmentRole.java new file mode 100644 index 00000000..04fb6de6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartmentRole.java @@ -0,0 +1,34 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * 角色部门绑定关系 + * + * @author Chopper + * @since 2020/11/19 12:18 + */ +@Data +@TableName("li_store_department_role") +@ApiModel(value = "店铺角色部门") +@NoArgsConstructor +@AllArgsConstructor +public class StoreDepartmentRole extends BaseEntity { + + + private static final long serialVersionUID = 2342812932116647050L; + + @ApiModelProperty(value = "角色id") + private String roleId; + + @ApiModelProperty(value = "部门id") + private String departmentId; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenu.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenu.java new file mode 100644 index 00000000..64522888 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenu.java @@ -0,0 +1,48 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 菜单权限 + * + * @author Chopper + * @since 2020/11/19 12:12 + */ +@Data +@TableName("li_store_menu") +@ApiModel(value = "店铺菜单权限") +public class StoreMenu extends BaseEntity { + + private static final long serialVersionUID = 7050744476203495207L; + + + @ApiModelProperty(value = "菜单标题") + private String title; + + @ApiModelProperty(value = "路由名称") + private String name; + + @ApiModelProperty(value = "路径") + private String path; + + @ApiModelProperty(value = "菜单层级") + private Integer level; + + @ApiModelProperty(value = "前端目录文件") + private String frontRoute; + + @ApiModelProperty(value = "父id") + private String parentId = "0"; + + @ApiModelProperty(value = "排序值") + private Double sortOrder; + + @ApiModelProperty(value = "权限URL,*号模糊匹配,逗号分割") + private String permission; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenuRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenuRole.java new file mode 100644 index 00000000..0992997f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenuRole.java @@ -0,0 +1,35 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 角色权限绑定关系 + * + * @author Chopper + * @since 2020/11/19 12:18 + */ +@Data +@TableName("li_store_menu_role") +@ApiModel(value = "店铺角色权限") +public class StoreMenuRole extends BaseEntity { + + private static final long serialVersionUID = -4680260092546996026L; + + @ApiModelProperty(value = "角色id") + private String roleId; + + @ApiModelProperty(value = "菜单") + private String menuId; + + @ApiModelProperty(value = "店铺id") + private String storeId; + + @ApiModelProperty(value = "是否拥有操作数据权限,为否则只有查看权限") + private Boolean isSuper; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreRole.java new file mode 100644 index 00000000..8057b682 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreRole.java @@ -0,0 +1,36 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + + +/** + * 部门 + * + * @author Chopper + * @since 2020/11/19 11:57 + */ +@Data +@TableName("li_store_role") +@ApiModel(value = "店铺角色") +public class StoreRole extends BaseEntity { + + @ApiModelProperty(value = "角色名") + @NotEmpty(message = "角色名称必填") + private String name; + + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; + + @ApiModelProperty(value = "是否为注册默认角色") + private Boolean defaultRole = false; + + @ApiModelProperty(value = "备注") + private String description; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java new file mode 100644 index 00000000..6b8207b5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java @@ -0,0 +1,64 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 店员dto + * + * @author wget + * @title: Clerk + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +@Data +@NoArgsConstructor +public class ClerkAddDTO { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "会员用户名") + @NotEmpty(message = "会员用户名不能为空") + @Length(max = 30, message = "会员用户名不能超过20个字符") + private String username; + + @ApiModelProperty(value = "会员密码") + @NotEmpty(message = "会员密码不能为空") + private String password; + + @NotEmpty(message = "手机号码不能为空") + @ApiModelProperty(value = "手机号码", required = true) + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String mobile; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否是超级管理员 超级管理员/普通管理员") + private Boolean isSuper = false; + + @ApiModelProperty(value = "角色") + private List roles; + + @ApiModelProperty(value = "会员id", required = true) + private String memberId; + + @ApiModelProperty(value = "是否是店主", hidden = true) + private Boolean shopkeeper = false; + + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkEditDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkEditDTO.java new file mode 100644 index 00000000..d535103d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkEditDTO.java @@ -0,0 +1,46 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 店员dto + * + * @author wget + * @title: Clerk + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +@Data +@NoArgsConstructor +public class ClerkEditDTO { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "店员id", hidden = true) + private String id; + + @ApiModelProperty(value = "会员密码") + private String password; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否是超级管理员 超级管理员/普通管理员") + private Boolean isSuper = false; + + @ApiModelProperty(value = "角色") + private List roles; + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkOperationDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkOperationDTO.java new file mode 100644 index 00000000..aa9959e9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkOperationDTO.java @@ -0,0 +1,48 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.mybatis.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * 管理员入库dto + * + * @author Chopper + * @since 2020/11/16 19:55 + */ +@Data +@ApiModel(value = "店员操作dto") +public class ClerkOperationDTO extends BaseEntity { + + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "用户名") + @Length(max = 20,message = "用户名长度不能超过20个字符") + private String username; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "昵称") + @Length(max = 10,message = "昵称长度不能超过10个字符") + private String nickName; + + @ApiModelProperty(value = "手机") + @Length(max = 11,message = "手机号长度不能超过11") + private String mobile; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "描述/详情/备注") + private String description; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否为超级管理员") + private Boolean isSuper; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkQueryDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkQueryDTO.java new file mode 100644 index 00000000..956b48f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkQueryDTO.java @@ -0,0 +1,41 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.mybatis.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * 店员查询 + * + * @author Chopper + * @since 2020/11/16 19:55 + */ +@Data +@ApiModel(value = "店员查询") +public class ClerkQueryDTO extends BaseEntity { + + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "店员名称") + @Length(max = 20, message = "用户名长度不能超过20个字符") + private String clerkName; + + @ApiModelProperty(value = "手机") + @Length(max = 11, message = "手机号长度不能超过11") + private String mobile; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否为超级管理员") + private Boolean isSuper; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/CollectionDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/CollectionDTO.java new file mode 100644 index 00000000..0ec661e0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/CollectionDTO.java @@ -0,0 +1,28 @@ +package cn.lili.modules.member.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 收藏数量变化DTO + * + * @author Chopper + * @version v1.0 + * 2021-11-30 10:14 + */ +@Data +@AllArgsConstructor +public class CollectionDTO { + + /** + * 变化的模型id + * 商品id/店铺id + */ + private String id; + + /** + * 变化的数量 + * -1 减少1 / +1 增加1 + */ + private Integer num; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ConnectQueryDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ConnectQueryDTO.java new file mode 100644 index 00000000..486a838a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ConnectQueryDTO.java @@ -0,0 +1,32 @@ +package cn.lili.modules.member.entity.dto; + +import lombok.Builder; +import lombok.Data; + +/** + * ConnectQueryDTO + * + * @author Chopper + * @version v1.0 + * 2021-12-01 14:34 + */ +@Data +@Builder +public class ConnectQueryDTO { + + /** + * 用户id + */ + private String userId; + + /** + * 第三方id + */ + private String unionId; + + /** + * 联合登陆类型 + */ + private String unionType; + +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/EvaluationQueryParams.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/EvaluationQueryParams.java index aa150722..90cbbdf7 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/EvaluationQueryParams.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/EvaluationQueryParams.java @@ -1,20 +1,31 @@ package cn.lili.modules.member.entity.dto; -import cn.lili.common.utils.StringUtils; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.vo.PageVO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; /** * 评价查询条件 * * @author Bulbasaur - * @date 2020/11/30 14:52 + * @since 2020/11/30 14:52 */ +@EqualsAndHashCode(callSuper = true) @Data public class EvaluationQueryParams extends PageVO { + @ApiModelProperty(value = "ID") + private String id; + + @ApiModelProperty(value = "买家ID") + private String memberId; + + @ApiModelProperty(value = "skuID") + private String skuId; + @ApiModelProperty(value = "会员名称") private String memberName; @@ -24,9 +35,6 @@ public class EvaluationQueryParams extends PageVO { @ApiModelProperty(value = "卖家ID") private String storeId; - @ApiModelProperty(value = "买家ID", hidden = true) - private String memberId; - @ApiModelProperty(value = "商品名称") private String goodsName; @@ -45,39 +53,47 @@ public class EvaluationQueryParams extends PageVO { @ApiModelProperty(value = "评论日期--结束时间") private String endTime; - public EvaluationQueryParams() { - - } + @ApiModelProperty(value = "状态") + private String status; public QueryWrapper queryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); - if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + if (CharSequenceUtil.isNotEmpty(id)) { + queryWrapper.eq("id", id); + } + if (CharSequenceUtil.isNotEmpty(startTime) && CharSequenceUtil.isNotEmpty(endTime)) { queryWrapper.between("create_time", startTime, endTime); } - if (StringUtils.isNotEmpty(grade)) { + if (CharSequenceUtil.isNotEmpty(grade)) { queryWrapper.eq("grade", grade); } - if (StringUtils.isNotEmpty(goodsName)) { + if (CharSequenceUtil.isNotEmpty(goodsName)) { queryWrapper.like("goods_name", goodsName); } - if (StringUtils.isNotEmpty(storeName)) { + if (CharSequenceUtil.isNotEmpty(storeName)) { queryWrapper.like("store_name", storeName); } - if (StringUtils.isNotEmpty(memberName)) { + if (CharSequenceUtil.isNotEmpty(memberName)) { queryWrapper.like("member_name", memberName); } - if (StringUtils.isNotEmpty(goodsId)) { + if (CharSequenceUtil.isNotEmpty(goodsId)) { queryWrapper.eq("goods_id", goodsId); } - if (StringUtils.isNotEmpty(storeId)) { + if (CharSequenceUtil.isNotEmpty(skuId)) { + queryWrapper.eq("sku_id", skuId); + } + if (CharSequenceUtil.isNotEmpty(storeId)) { queryWrapper.eq("store_id", storeId); } - if (StringUtils.isNotEmpty(memberId)) { + if (CharSequenceUtil.isNotEmpty(memberId)) { queryWrapper.eq("member_id", memberId); } - if (StringUtils.isNotEmpty(haveImage)) { + if (CharSequenceUtil.isNotEmpty(haveImage)) { queryWrapper.eq("have_image", haveImage); } + if (CharSequenceUtil.isNotEmpty(status)) { + queryWrapper.eq("status", status); + } queryWrapper.eq("delete_flag", false); queryWrapper.orderByDesc("create_time"); return queryWrapper; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/FootPrintQueryParams.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/FootPrintQueryParams.java new file mode 100644 index 00000000..d2a5ec50 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/FootPrintQueryParams.java @@ -0,0 +1,36 @@ +package cn.lili.modules.member.entity.dto; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.vo.PageVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author chc + * @since 2022/6/2114:46 + */ +@Data +@ApiModel +public class FootPrintQueryParams extends PageVO { + + @ApiModelProperty("用户Id") + private String memberId; + + @ApiModelProperty("店铺Id") + private String storeId; + + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (CharSequenceUtil.isNotEmpty(memberId)) { + queryWrapper.eq("member_id", memberId); + } + if (CharSequenceUtil.isNotEmpty(storeId)) { + queryWrapper.eq("store_id", storeId); + } + queryWrapper.eq("delete_flag",false); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java index 1e2987a7..13f9c165 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java @@ -16,11 +16,14 @@ import java.util.Date; * 用于后台的用户信息修改 * * @author Bulbasaur - * @date 2020/12/15 9:57 + * @since 2020/12/15 9:57 */ @Data public class ManagerMemberEditDTO { + @NotNull(message = "用户ID不能为空") + private String id; + @ApiModelProperty(value = "会员用户名,用户名不能进行修改", required = true) @NotNull(message = "会员用户名不能为空") private String username; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddDTO.java index 30a4074c..6d54c0a9 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddDTO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddDTO.java @@ -11,13 +11,12 @@ import javax.validation.constraints.Size; * 添加会员DTO * * @author Bulbasaur - * @date 2020/12/14 16:31 + * @since 2020/12/14 16:31 */ @Data public class MemberAddDTO { - @NotEmpty(message = "会员用户名必填") - @Size(min = 6, max = 30) + @Size(max = 30,message = "会员用户名最长30位") @ApiModelProperty(value = "会员用户名") private String username; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddressDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddressDTO.java index 3fe583f9..dd77a186 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddressDTO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberAddressDTO.java @@ -1,6 +1,6 @@ package cn.lili.modules.member.entity.dto; -import cn.lili.common.validation.Mobile; +import cn.lili.common.validation.Phone; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -11,7 +11,7 @@ import javax.validation.constraints.NotEmpty; * 会员地址DTO * * @author Bulbasaur - * @date 2020/12/14 16:31 + * @since 2020/12/14 16:31 */ @Data public class MemberAddressDTO { @@ -20,7 +20,7 @@ public class MemberAddressDTO { @ApiModelProperty(value = "收货人姓名") private String consigneeName; - @Mobile + @Phone @ApiModelProperty(value = "手机号码") private String consigneeMobile; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEditDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEditDTO.java index f07866cd..37aa56df 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEditDTO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEditDTO.java @@ -15,7 +15,7 @@ import java.util.Date; * 会员信息修改DTO * * @author Bulbasaur - * @date 2020/12/11 14:39 + * @since 2020/12/11 14:39 */ @Data public class MemberEditDTO { @@ -38,7 +38,7 @@ public class MemberEditDTO { private Integer sex; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "会员生日") private Date birthday; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEvaluationDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEvaluationDTO.java index 825944a3..ceef0503 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEvaluationDTO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberEvaluationDTO.java @@ -10,7 +10,7 @@ import javax.validation.constraints.NotEmpty; * 会员评价DTO * * @author Chopper - * @date 2020/11/29 11:13 下午 + * @since 2020/11/29 11:13 下午 */ @Data public class MemberEvaluationDTO { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java index a1eddc2a..b0d5847b 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java @@ -7,7 +7,7 @@ import lombok.Data; * 会员积分 * * @author Bulbasaur - * @date 2020/12/14 16:31 + * @since 2020/12/14 16:31 */ @Data public class MemberPointMessage { @@ -15,8 +15,8 @@ public class MemberPointMessage { @ApiModelProperty(value = "积分") private Long point; - @ApiModelProperty(value = "类型 1为增加") - private Integer type; + @ApiModelProperty(value = "是否增加积分") + private String type; @ApiModelProperty(value = "会员id") private String memberId; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/StoreEvaluationQueryParams.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/StoreEvaluationQueryParams.java deleted file mode 100644 index d1d76775..00000000 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/StoreEvaluationQueryParams.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.lili.modules.member.entity.dto; - -import cn.hutool.core.date.DateUtil; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.StringUtils; -import cn.lili.common.vo.PageVO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 店铺评价查询参数 - * - * @author Chopper - * @date 2021/3/20 10:43 - */ - -@Data -public class StoreEvaluationQueryParams extends PageVO { - - @ApiModelProperty(value = "会员名称") - private String memberName; - - @ApiModelProperty(value = "商品名称") - private String goodsName; - - @ApiModelProperty(value = "好中差评 good:好评,neutral:中评,bad:差评", allowableValues = "GOOD,NEUTRAL,BAD") - private String grade; - - @ApiModelProperty(value = "评论日期--开始时间") - private String startDate; - - @ApiModelProperty(value = "评论日期--结束时间") - private String endDate; - - - public QueryWrapper queryWrapper() { - QueryWrapper queryWrapper = new QueryWrapper<>(); - - queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); - - if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(endDate)) { - queryWrapper.between("create_time", DateUtil.parse(startDate), DateUtil.parse(endDate)); - } - - if (StringUtils.isNotEmpty(grade)) { - queryWrapper.eq("grade", grade); - } - - if (StringUtils.isNotEmpty(goodsName)) { - queryWrapper.eq("goods_name", goodsName); - } - - if (StringUtils.isNotEmpty(memberName)) { - queryWrapper.eq("member_name", memberName); - } - return queryWrapper; - } -} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/enums/EvaluationGradeEnum.java b/framework/src/main/java/cn/lili/modules/member/entity/enums/EvaluationGradeEnum.java index a6a0758b..61f3a051 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/enums/EvaluationGradeEnum.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/enums/EvaluationGradeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.member.entity.enums; * 评价枚举 * * @author Chopper - * @date 2021/3/20 10:44 + * @since 2021/3/20 10:44 */ public enum EvaluationGradeEnum { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/enums/MemberReceiptEnum.java b/framework/src/main/java/cn/lili/modules/member/entity/enums/MemberReceiptEnum.java index 9e846658..d483d896 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/enums/MemberReceiptEnum.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/enums/MemberReceiptEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.member.entity.enums; * 发票类型 * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ public enum MemberReceiptEnum { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/enums/PointTypeEnum.java b/framework/src/main/java/cn/lili/modules/member/entity/enums/PointTypeEnum.java new file mode 100644 index 00000000..3c456c40 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/enums/PointTypeEnum.java @@ -0,0 +1,29 @@ +package cn.lili.modules.member.entity.enums; + +/** + * 积分类型枚举 + * + * @author Chopper + * @since 2021/3/20 10:44 + */ + +public enum PointTypeEnum { + /** + * 增加 + */ + INCREASE("增加"), + /** + * 减少 + */ + REDUCE("减少"); + + private String description; + + public String description() { + return description; + } + + PointTypeEnum(String description) { + this.description = description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/enums/QRCodeLoginSessionStatusEnum.java b/framework/src/main/java/cn/lili/modules/member/entity/enums/QRCodeLoginSessionStatusEnum.java new file mode 100644 index 00000000..7a176f72 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/enums/QRCodeLoginSessionStatusEnum.java @@ -0,0 +1,46 @@ +package cn.lili.modules.member.entity.enums; + + +import lombok.Getter; + +@Getter +public enum QRCodeLoginSessionStatusEnum { + + /** + * 二维码创建完毕,等待app端扫码 + */ + WAIT_SCANNING(0,"等待扫码"), + + /** + * app端已经扫码,等待确认同意登录 + */ + SCANNING(1,"已经扫码"), + + /** + * 用户在app端点击了同意登录 + */ + VERIFIED(2,"确认登录"), + + /** + * 用户在app端点击了取消登录 + */ + CANCELED(3,"取消登录"), + + /** + * 二维码不存在/或者已经过期 + */ + NO_EXIST(4,"二维码已过期") + + ; + + + private Integer code; + + private String desc; + + + QRCodeLoginSessionStatusEnum(Integer code,String desc){ + this.code = code; + this.desc = desc; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/enums/SendTypeEnum.java b/framework/src/main/java/cn/lili/modules/member/entity/enums/SendTypeEnum.java index f34f30a1..36ec9f86 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/enums/SendTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/enums/SendTypeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.member.entity.enums; * 发送类型 * * @author Chopper - * @date 2020-03-10 11:35 上午 + * @since 2020-03-10 11:35 上午 */ public enum SendTypeEnum { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/ClerkVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/ClerkVO.java new file mode 100644 index 00000000..6a695b2f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/ClerkVO.java @@ -0,0 +1,44 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.dos.StoreRole; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 管理员VO + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ClerkVO extends Clerk { + + private static final long serialVersionUID = -2378384199695839312L; + + @ApiModelProperty(value = "手机号") + private String mobile; + + @ApiModelProperty(value = "所属部门名称") + private String departmentTitle; + + @ApiModelProperty(value = "用户拥有角色") + private List roles; + + @ApiModelProperty(value = "用户拥有的权限") + private List menus; + + + public ClerkVO(Clerk clerk) { + BeanUtil.copyProperties(clerk, this); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/EvaluationNumberVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/EvaluationNumberVO.java index 9993b449..52d8b772 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/EvaluationNumberVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/EvaluationNumberVO.java @@ -7,12 +7,12 @@ import lombok.Data; * 评价数量VO * * @author Chopper - * @date 2021/1/27 10:41 上午 + * @since 2021/1/27 10:41 上午 */ @Data public class EvaluationNumberVO { - @ApiModelProperty(value = "全部商品") + @ApiModelProperty(value = "全部评价") private Integer all; @ApiModelProperty(value = "好评数量") @@ -25,5 +25,5 @@ public class EvaluationNumberVO { private Integer worse; @ApiModelProperty(value = "有图数量") - private Integer haveImage; + private Long haveImage; } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/GoodsCollectionVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/GoodsCollectionVO.java index e0478568..a885c758 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/GoodsCollectionVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/GoodsCollectionVO.java @@ -7,7 +7,7 @@ import lombok.Data; * 会员商品收藏VO * * @author Chopper - * @date 2021/1/27 10:41 上午 + * @since 2021/1/27 10:41 上午 */ @Data public class GoodsCollectionVO { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberDistributionVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberDistributionVO.java index 3b02e2dc..c272cfe3 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberDistributionVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberDistributionVO.java @@ -7,7 +7,7 @@ import lombok.Data; * 会员分布VO * * @author Chopper - * @date 2021-02-26 17:25 + * @since 2021-02-26 17:25 */ @Data public class MemberDistributionVO { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationListVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationListVO.java index a9688392..c1dc8995 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationListVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationListVO.java @@ -11,7 +11,7 @@ import java.util.Date; * 会员评价VO * * @author Bulbasaur - * @date 2020/11/30 15:00 + * @since 2020/11/30 15:00 */ @Data public class MemberEvaluationListVO { @@ -35,12 +35,19 @@ public class MemberEvaluationListVO { private String status; @ApiModelProperty(value = "回复状态") - private boolean replyStatus; + private Boolean replyStatus; @ApiModelProperty(value = "创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; + @ApiModelProperty(value = "物流评分") + private Integer deliveryScore; + @ApiModelProperty(value = "服务评分") + private Integer serviceScore; + + @ApiModelProperty(value = "描述评分") + private Integer descriptionScore; } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationVO.java index 1806d0e4..db0dbe26 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberEvaluationVO.java @@ -12,7 +12,7 @@ import java.util.List; * 会员评价VO * * @author Bulbasaur - * @date 2020/11/30 15:00 + * @since 2020/11/30 15:00 */ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java index 04b43ada..61b79bf1 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberPointsHistoryVO.java @@ -7,16 +7,20 @@ import lombok.Data; * 会员积分VO * * @author Chopper - * @date 2021/2/25 9:52 上午 + * @since 2021/2/25 9:52 上午 */ @Data public class MemberPointsHistoryVO { - @ApiModelProperty(value = "积分总数") + @ApiModelProperty(value = "当前会员积分") private Long point; - @ApiModelProperty(value = "未使用积分总数") - private Long variablePoint; + @ApiModelProperty(value = "累计获得积分") + private Long totalPoint; + public MemberPointsHistoryVO(){ + this.point = 0L; + this.totalPoint = 0L; + } } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptAddVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptAddVO.java index 4c3d030f..eaf5f049 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptAddVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptAddVO.java @@ -9,7 +9,7 @@ import lombok.Data; * 会员发票添加VO * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ @Data @ApiModel(value = "会员发票") diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptVO.java index 9de46587..fb9ae9d7 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberReceiptVO.java @@ -12,7 +12,7 @@ import lombok.Data; * 会员发票查询VO * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ @Data @ApiModel(value = "会员发票") diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberSearchVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberSearchVO.java index f40e5eba..caae52d6 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberSearchVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberSearchVO.java @@ -8,7 +8,7 @@ import lombok.Data; * 会员搜索VO * * @author Bulbasaur - * @date 2020/12/15 10:48 + * @since 2020/12/15 10:48 */ @Data public class MemberSearchVO { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java new file mode 100644 index 00000000..e69139c3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java @@ -0,0 +1,101 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.member.entity.dos.Member; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author paulG + * @since 2021/11/8 + **/ +@Data +@NoArgsConstructor +public class MemberVO implements Serializable { + + private static final long serialVersionUID = 1810890757303309436L; + + @ApiModelProperty(value = "唯一标识", hidden = true) + private String id; + + @ApiModelProperty(value = "会员用户名") + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String username; + + @ApiModelProperty(value = "昵称") + + private String nickName; + + @ApiModelProperty(value = "会员性别,1为男,0为女") + private Integer sex; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty(value = "会员生日") + private Date birthday; + + @ApiModelProperty(value = "会员地址ID") + private String regionId; + + @ApiModelProperty(value = "会员地址") + private String region; + + @ApiModelProperty(value = "手机号码", required = true) + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String mobile; + + @ApiModelProperty(value = "积分数量") + private Long point; + + @ApiModelProperty(value = "积分总数量") + private Long totalPoint; + + @ApiModelProperty(value = "会员头像") + private String face; + + @ApiModelProperty(value = "会员状态") + private Boolean disabled; + + @ApiModelProperty(value = "是否开通店铺") + private Boolean haveStore; + + @ApiModelProperty(value = "店铺ID") + private String storeId; + + @ApiModelProperty(value = "openId") + private String openId; + + /** + * @see ClientTypeEnum + */ + @ApiModelProperty(value = "客户端") + private String clientEnum; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "最后一次登录时间") + private Date lastLoginDate; + + @ApiModelProperty(value = "会员等级ID") + private String gradeId; + + @ApiModelProperty(value = "经验值数量") + private Long experience; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间", hidden = true) + private Date createTime; + + public MemberVO(Member member) { + BeanUtil.copyProperties(member, this); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/QRCodeLoginSessionVo.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/QRCodeLoginSessionVo.java new file mode 100644 index 00000000..3fb89555 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/QRCodeLoginSessionVo.java @@ -0,0 +1,21 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class QRCodeLoginSessionVo implements Serializable { + + + private static final long serialVersionUID = 8793639296995408322L; + + private String token; + + private Integer status; + + private long duration; + + private long userId; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/QRLoginResultVo.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/QRLoginResultVo.java new file mode 100644 index 00000000..aaa25a4a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/QRLoginResultVo.java @@ -0,0 +1,12 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.security.token.Token; +import lombok.Data; + +@Data +public class QRLoginResultVo { + + private Token token; + + private int status; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreCollectionVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreCollectionVO.java index d34f14e4..050cb6db 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreCollectionVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreCollectionVO.java @@ -7,20 +7,20 @@ import lombok.Data; * 会员店铺收藏VO * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data public class StoreCollectionVO { @ApiModelProperty(value = "店铺id") - private String storeId; + private String id; @ApiModelProperty(value = "店铺名称") private String storeName; @ApiModelProperty(value = "店铺Logo") - private String logo; + private String storeLogo; @ApiModelProperty(value = "是否自营") - private boolean selfOperated; + private Boolean selfOperated; } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreDepartmentVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreDepartmentVO.java new file mode 100644 index 00000000..a40ae6a3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreDepartmentVO.java @@ -0,0 +1,28 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.permission.entity.dos.Department; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 部门VO + * + * @author Chopper + * @since 2020-11-23 18:48 + */ +@Data +public class StoreDepartmentVO extends StoreDepartment { + + private List children = new ArrayList<>(); + + public StoreDepartmentVO() { + } + + public StoreDepartmentVO(StoreDepartment storeDepartment) { + BeanUtil.copyProperties(storeDepartment, this); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreMenuVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreMenuVO.java new file mode 100644 index 00000000..ae661967 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreMenuVO.java @@ -0,0 +1,45 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.member.entity.dos.StoreMenu; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * 菜单VO 展示模型 + * + * @author Chopper + * @since 2020/11/20 15:38 + */ + +@Data +public class StoreMenuVO extends StoreMenu { + + @ApiModelProperty(value = "子菜单") + private List children = new ArrayList<>(); + + public StoreMenuVO() { + + } + + public StoreMenuVO(StoreMenu storeMenu) { + BeanUtil.copyProperties(storeMenu, this); + } + + public List getChildren() { + if (children != null) { + children.sort(new Comparator() { + @Override + public int compare(StoreMenuVO o1, StoreMenuVO o2) { + return o1.getSortOrder().compareTo(o2.getSortOrder()); + } + }); + return children; + } + return null; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreRatingVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreRatingVO.java index e455e1f7..2410eeda 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreRatingVO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreRatingVO.java @@ -7,7 +7,7 @@ import lombok.Data; * 评分VO * * @author Chopper - * @date 2021/3/15 5:55 下午 + * @since 2021/3/15 5:55 下午 */ @Data public class StoreRatingVO { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreUserMenuVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreUserMenuVO.java new file mode 100644 index 00000000..8a6318f2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreUserMenuVO.java @@ -0,0 +1,29 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.permission.entity.dos.Menu; +import lombok.Data; + +/** + * RoleMenuVO + * + * @author Chopper + * @since 2020-11-24 11:45 + */ +@Data +public class StoreUserMenuVO extends StoreMenu { + + private static final long serialVersionUID = -7478870595109016162L; + + /** + * 是否是超级管理员 + */ + private Boolean isSuper; + + public Boolean getSuper() { + if (this.isSuper == null) { + return false; + } + return isSuper; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java new file mode 100644 index 00000000..4ea0539d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java @@ -0,0 +1,34 @@ +package cn.lili.modules.member.mapper; + + +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.vo.ClerkVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 店员数据处理层 + * + * @author wget + * @title: ClerkMapper + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +public interface ClerkMapper extends BaseMapper { + + /** + * 查询店员分页数据 + * @param page 分页信息 + * @param ew 店铺ID + * @return + */ + @Select("select li_clerk.*,m.id,m.mobile as mobile from li_clerk inner join li_member as m on li_clerk.member_id = m.id ${ew.customSqlSegment}") + IPage selectClerkPage(Page page, @Param(Constants.WRAPPER) QueryWrapper ew); + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java index 741d1c40..3933ebb6 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java @@ -1,33 +1,37 @@ package cn.lili.modules.member.mapper; import cn.lili.modules.member.entity.dos.FootPrint; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; +import org.springframework.transaction.annotation.Transactional; /** * 浏览历史数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface FootprintMapper extends BaseMapper { - - @Select("select sku_id from li_foot_print ${ew.customSqlSegment} ") - List footprintSkuIdList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - /** * 删除超过100条后的记录 + * * @param memberId 会员ID */ - @Delete("DELETE FROM li_foot_print WHERE (SELECT COUNT(b.id) FROM ( SELECT * FROM li_foot_print WHERE member_id = #{memberId} ) b) >100 " + - " AND id =(SELECT a.id FROM ( SELECT * FROM li_foot_print WHERE member_id = #{memberId} ORDER BY create_time ASC LIMIT 1 ) AS a)") + @Transactional(rollbackFor = Exception.class) + @Delete("DELETE li_foot_print " + + "FROM li_foot_print " + + "LEFT JOIN ( " + + " SELECT id " + + " FROM ( " + + " SELECT id " + + " FROM li_foot_print " + + " WHERE member_id = ${memberId} " + + " ORDER BY create_time DESC " + + " LIMIT 100 " + + " ) AS keep " + + ") AS latest_footprints " + + "ON li_foot_print.id = latest_footprints.id " + + "WHERE li_foot_print.member_id = ${memberId} AND latest_footprints.id IS NULL; ") void deleteLastFootPrint(String memberId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/GoodsCollectionMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/GoodsCollectionMapper.java index 72007cd7..f7a83fa7 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/GoodsCollectionMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/GoodsCollectionMapper.java @@ -13,10 +13,17 @@ import org.apache.ibatis.annotations.Select; * 会员收藏数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface GoodsCollectionMapper extends BaseMapper { + /** + * 商品收藏VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 商品收藏VO分页 + */ @Select("select gc.id AS id,gs.id as sku_id,gs.goods_id as goods_id,gs.goods_name as goods_name,gs.thumbnail as image,gs.price,gs.market_enable AS market_enable from li_goods_collection gc INNER JOIN li_goods_sku gs ON gc.sku_id=gs.id ${ew.customSqlSegment} ") IPage goodsCollectionVOList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberAddressMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberAddressMapper.java index 525d768d..45561976 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberAddressMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberAddressMapper.java @@ -7,7 +7,7 @@ import cn.lili.modules.member.entity.dos.MemberAddress; * 会员地址数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberAddressMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberEvaluationMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberEvaluationMapper.java index 829b1b44..3806ea47 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberEvaluationMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberEvaluationMapper.java @@ -17,23 +17,48 @@ import java.util.Map; * 会员商品评价数据处理层 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberEvaluationMapper extends BaseMapper { + /** + * 会员评价分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 会员评价分页 + */ @Select("select me.* from li_member_evaluation as me ${ew.customSqlSegment}") IPage getMemberEvaluationList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - @Select("select grade,count(1) as num from li_member_evaluation Where goods_id=#{goodsId} GROUP BY grade") + /** + * 评价数量 + * + * @param goodsId 商品ID + * @return 会员评价 + */ + @Select("select grade,count(1) as num from li_member_evaluation Where goods_id=#{goodsId} and status='OPEN' and delete_flag = false GROUP BY grade") List> getEvaluationNumber(String goodsId); + /** + * 获取店铺评分 + * + * @param queryWrapper 查询条件 + * @return 店铺评分 + */ @Select("SELECT round( AVG( delivery_score ), 2 ) AS delivery_score" + ",round( AVG( description_score ), 2 ) AS description_score" + ",round( AVG( service_score ), 2 ) AS service_score " + "FROM li_member_evaluation ${ew.customSqlSegment}") StoreRatingVO getStoreRatingVO(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 商品会员评价数量 + * + * @param queryWrapper 查询条件 + * @return 评价数量 + */ @Select("SELECT goods_id,COUNT(goods_id) AS num FROM li_member_evaluation GROUP BY goods_id") List> memberEvaluationNum(@Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberGradeMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberGradeMapper.java new file mode 100644 index 00000000..c7a534c9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberGradeMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.MemberGrade; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 会员等级数据层 + * + * @author Bulbasaur + * @since 2021/5/14 5:57 下午 + */ +public interface MemberGradeMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java index 78b3217f..32f09fa9 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java @@ -2,8 +2,12 @@ package cn.lili.modules.member.mapper; import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.entity.vo.MemberDistributionVO; +import cn.lili.modules.member.entity.vo.MemberVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -12,13 +16,17 @@ import java.util.List; * 会员数据处理层 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberMapper extends BaseMapper { + /** + * 获取所有的会员手机号 + * @return 会员手机号 + */ @Select("select m.mobile from li_member m") List getAllMemberMobile(); - @Select("select client_enum,count(0) as num from li_member group by client_enum") - List distribution(); + @Select("select * from li_member ${ew.customSqlSegment}") + IPage pageByMemberVO(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMessageMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberMessageMapper.java deleted file mode 100644 index a727b6e2..00000000 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMessageMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.lili.modules.member.mapper; - - -import cn.lili.modules.member.entity.dos.MemberMessage; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - - -/** - * 会员消息数据处理层 - * - * @author lili - * @date 2020-02-25 14:10:16 - */ -public interface MemberMessageMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeLogMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeLogMapper.java index 4c806c27..74c70076 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeLogMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeLogMapper.java @@ -7,7 +7,7 @@ import cn.lili.modules.member.entity.dos.MemberNoticeLog; * 会员消息数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberNoticeLogMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeMapper.java index a13a70cd..7d325a89 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeMapper.java @@ -7,7 +7,7 @@ import cn.lili.modules.member.entity.dos.MemberNotice; * 会员站内信数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberNoticeMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeSenterMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeSenterMapper.java index 44ed0c07..0508f4b4 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeSenterMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberNoticeSenterMapper.java @@ -7,7 +7,7 @@ import cn.lili.modules.member.entity.dos.MemberNoticeSenter; * 会员消息数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberNoticeSenterMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberPointsHistoryMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberPointsHistoryMapper.java index ed90642b..a2c98e4f 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberPointsHistoryMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberPointsHistoryMapper.java @@ -8,15 +8,28 @@ import org.apache.ibatis.annotations.Select; * 会员积分历史数据处理层 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberPointsHistoryMapper extends BaseMapper { + /** + * 获取所有用户的积分历史VO + * + * @param pointType 积分类型 + * @return + */ @Select("SELECT SUM( variable_point ) FROM li_member_points_history WHERE point_type = #{pointType}") - Long getALLMemberPointsHistoryVO(Integer pointType); + Long getALLMemberPointsHistoryVO(String pointType); + /** + * 获取用户的积分数量 + * + * @param pointType 积分类型 + * @param memberId 会员ID + * @return 积分数量 + */ @Select("SELECT SUM( variable_point ) FROM li_member_points_history WHERE point_type = #{pointType} AND member_id=#{memberId}") - Long getMemberPointsHistoryVO(Integer pointType, String memberId); + Long getMemberPointsHistoryVO(String pointType, String memberId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberReceiptMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberReceiptMapper.java index c197f018..27dba0ac 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberReceiptMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberReceiptMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 会员发票数据层 * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ public interface MemberReceiptMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberSignMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberSignMapper.java index e9e24fc3..14454e3c 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberSignMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberSignMapper.java @@ -14,17 +14,35 @@ import java.util.List; * 会员签到数据处理层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberSignMapper extends BaseMapper { + /** + * 获取会员之前签到信息 + * + * @param memberId 会员ID + * @return 会员签到列表 + */ @Select("SELECT * FROM li_member_sign WHERE TO_DAYS( NOW( ) ) - TO_DAYS( create_time) = 1 and member_id = #{memberId}") List getBeforeMemberSign(String memberId); - + /** + * 获取会员签到 + * + * @param queryWrapper 查询条件 + * @return 会员签到列表 + */ @Select("select * from li_member_sign ${ew.customSqlSegment}") List getTodayMemberSign(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 获取当月的会员签到记录 + * + * @param memberId 会员ID + * @param time 时间 + * @return 会员签到列表 + */ @Select("SELECT * FROM li_member_sign WHERE DATE_FORMAT(create_time,'%Y%m') = #{time} and member_id = #{memberId}") List getMonthMemberSign(String memberId, String time); diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreClerkRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreClerkRoleMapper.java new file mode 100644 index 00000000..2b219edc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreClerkRoleMapper.java @@ -0,0 +1,13 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreClerkRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 角色权限数据处理层 + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreClerkRoleMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreCollectionMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreCollectionMapper.java index c4a8206c..ed874f43 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/StoreCollectionMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreCollectionMapper.java @@ -13,10 +13,17 @@ import org.apache.ibatis.annotations.Select; * 会员收藏数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface StoreCollectionMapper extends BaseMapper { + /** + * 会员店铺收藏分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return + */ @Select("select s.id,s.store_name,s.store_logo,s.self_operated from li_store s INNER JOIN li_store_collection sc ON s.id=sc.store_id ${ew.customSqlSegment} ") IPage storeCollectionVOList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentMapper.java new file mode 100644 index 00000000..252801bf --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreDepartment; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 部门数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreDepartmentMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentRoleMapper.java new file mode 100644 index 00000000..4171a437 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentRoleMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 店铺部门角色数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreDepartmentRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreLogisticsMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreLogisticsMapper.java new file mode 100644 index 00000000..ae73777a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreLogisticsMapper.java @@ -0,0 +1,73 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.system.entity.vo.StoreLogisticsVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 物流公司数据处理层 + * + * @author Chopper + * @since 2020/11/17 8:01 下午 + */ +public interface StoreLogisticsMapper extends BaseMapper { + + /** + * 获取店铺选择的物流公司 + * + * @param storeId 店铺ID + * @return 物流公司列表 + */ + @Select("SELECT l.id as logistics_id,l.name FROM li_logistics l RIGHT JOIN li_store_logistics sl ON l.id=sl.logistics_id WHERE sl.store_id=#{storeId} AND l.disabled='OPEN'") + List getSelectedStoreLogistics(String storeId); + + /** + * 店铺已选择的物流公司名称列表 + * + * @param storeId 店铺ID + * @return 店铺已选择的物流公司名称列表 + */ + @Select("SELECT l.name FROM li_logistics l RIGHT JOIN li_store_logistics sl ON l.id=sl.logistics_id WHERE sl.store_id=#{storeId} AND l.disabled='OPEN'") + List getSelectedStoreLogisticsName(String storeId); + + /** + * 获取店铺地址VO列表 + * + * @param storeId 店铺列表 + * @return 店铺地址VO列表 + */ + @Select("SELECT id as logistics_id , `name` , ( SELECT sl.id FROM li_store_logistics sl WHERE l.id = sl.logistics_id AND sl.store_id=#{storeId} ) AS selected,(SELECT sl.face_sheet_flag FROM li_store_logistics sl WHERE l.id = sl.logistics_id AND sl.store_id = #{storeId}) as face_sheet_flag FROM li_logistics l WHERE l.disabled='OPEN';") + //@Select("SELECT *, ( SELECT sl.id FROM li_store_logistics sl WHERE l.id = sl.logistics_id AND sl.store_id=#{storeId} ) AS selected FROM li_logistics l WHERE l.disabled='OPEN';") + List getStoreLogistics(String storeId); + + /** + * 店铺已选择的物流公司 + * @param storeId 店铺Id + * @return 物流公司列表 + */ + @Select("SELECT sl.logistics_id,l.name,sl.face_sheet_flag FROM li_logistics l INNER JOIN li_store_logistics sl on sl.logistics_id=l.id WHERE l.disabled = 'OPEN' AND store_id=#{storeId};") + List getOpenStoreLogistics(String storeId); + + /** + * 店铺未选择的物流公司 + * @param storeId 店铺Id + * @return 物流公司列表 + */ + @Select("SELECT id as logistics_id,name FROM li_logistics WHERE id not in(SELECT logistics_id FROM li_store_logistics WHERE store_id=#{storeId}) AND disabled = 'OPEN'") + List getCloseStroreLogistics(String storeId); + + /** + * 获取店铺选择的物流公司并使用了电子面单 + * + * @param storeId 店铺ID + * @return 物流公司列表 + */ + @Select("SELECT id as logistics_id , `name` FROM li_logistics WHERE disabled='OPEN'" + + "AND id in(SELECT logistics_id FROM li_store_logistics WHERE store_id=#{storeId} and face_sheet_flag=1)") + List getSelectedStoreLogisticsUseFaceSheet(String storeId); + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java new file mode 100644 index 00000000..e94a4717 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java @@ -0,0 +1,44 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import cn.lili.modules.permission.entity.dos.Menu; +import cn.lili.modules.permission.entity.vo.UserMenuVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 菜单数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreMenuMapper extends BaseMapper { + + /** + * 根据用户获取菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Select("SELECT menu.* FROM li_store_menu AS menu WHERE menu.id IN (" + + "SELECT rm.menu_id FROM li_store_menu_role AS rm WHERE rm.role_id IN (" + + "SELECT ur.role_id FROM li_clerk_role AS ur WHERE ur.clerk_id=#{userId}) OR rm.role_id IN (" + + "SELECT dr.role_id FROM li_store_department_role AS dr WHERE dr.department_id=(" + + "SELECT department_id FROM li_clerk AS au WHERE au.id = #{userId})))") + List findByUserId(String userId); + + /** + * 根据用户获取菜单权限 + * + * @param userId 用户ID + * @return 用户菜单VO列表 + */ + @Select("SELECT rm.is_super as is_super,m.*FROM li_store_menu AS m INNER JOIN li_store_menu_role AS rm ON rm.menu_id=m.id WHERE rm.role_id IN (" + + "SELECT ur.role_id FROM li_clerk_role AS ur WHERE ur.clerk_id=#{userId}) OR rm.role_id IN (" + + "SELECT dr.role_id FROM li_store_department_role AS dr INNER JOIN li_clerk AS au ON au.department_id=dr.department_id " + + "WHERE au.id=#{userId}) GROUP BY m.id,rm.is_super ORDER BY rm.is_super desc") + List getUserRoleMenu(String userId); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuRoleMapper.java new file mode 100644 index 00000000..be9530b6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuRoleMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 角色菜单数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreMenuRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreRoleMapper.java new file mode 100644 index 00000000..8f8eb867 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreRoleMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.permission.entity.dos.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 店铺角色数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreRoleMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/ClerkService.java b/framework/src/main/java/cn/lili/modules/member/service/ClerkService.java new file mode 100644 index 00000000..17bf036b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/ClerkService.java @@ -0,0 +1,99 @@ +package cn.lili.modules.member.service; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; +import cn.lili.modules.member.entity.dto.ClerkEditDTO; +import cn.lili.modules.member.entity.dto.ClerkQueryDTO; +import cn.lili.modules.member.entity.vo.ClerkVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 店员业务层 + * + * @author wget + * @title: ClerkService + * @projectName lilishop + * @date 2021/12/28 7:42 下午 + */ +public interface ClerkService extends IService { + + /** + * 店员查询 + * + * @param page + * @param clerkQueryDTO + * @return + */ + IPage clerkForPage(PageVO page, ClerkQueryDTO clerkQueryDTO); + + /** + * 查询店员详细 + * + * @param id 店员id + * @return + */ + ClerkVO get(String id); + + /** + * 修改店员信息 + * + * @param clerkEditDTO 店员 + * @return + */ + Clerk updateClerk(ClerkEditDTO clerkEditDTO); + + /** + * 保存店员 + * + * @param clerkAddDTO 店员 + * @return + */ + Clerk saveClerk(ClerkAddDTO clerkAddDTO); + + /** + * 根据会员id获取店员信息 + * + * @param memberId 会员id + * @return + */ + Clerk getClerkByMemberId(String memberId); + + /** + * 重置店员密码 + * + * @param ids 店员ids + */ + void resetPassword(List ids); + + /** + * 删除店员 + * + * @param ids 店员ids + */ + void deleteClerk(List ids); + + /** + * 检测会员有效性 + * + * @param mobile 手机号码 + * @return + */ + Member checkClerk(String mobile); + + /** + * 店员状态操作 + * + * @param id 店员id + * @param status 状态 + */ + void disable(String id, Boolean status); + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java b/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java index 3dd22c24..a3ff318e 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java @@ -2,7 +2,9 @@ package cn.lili.modules.member.service; import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dos.FootPrint; +import cn.lili.modules.member.entity.dto.FootPrintQueryParams; import cn.lili.modules.search.entity.dos.EsGoodsIndex; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -11,7 +13,7 @@ import java.util.List; * 会员浏览历史业务层 * * @author Chopper - * @date 2020/11/18 10:46 上午 + * @since 2020/11/18 10:46 上午 */ public interface FootprintService extends IService { @@ -41,15 +43,16 @@ public interface FootprintService extends IService { /** * 获取会员浏览历史分页 * - * @param pageVO 分页 + * @param params 分页 * @return 会员浏览历史列表 */ - List footPrintPage(PageVO pageVO); + IPage footPrintPage(FootPrintQueryParams params); /** * 获取当前会员的浏览记录数量 * * @return 当前会员的浏览记录数量 */ - Integer getFootprintNum(); + long getFootprintNum(); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/GoodsCollectionService.java b/framework/src/main/java/cn/lili/modules/member/service/GoodsCollectionService.java index 9847f86f..fa855d82 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/GoodsCollectionService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/GoodsCollectionService.java @@ -12,7 +12,7 @@ import java.util.List; * 商品收藏业务层 * * @author Chopper - * @date 2020/11/18 2:25 下午 + * @since 2020/11/18 2:25 下午 */ public interface GoodsCollectionService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/MemberAddressService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberAddressService.java similarity index 90% rename from framework/src/main/java/cn/lili/modules/promotion/service/MemberAddressService.java rename to framework/src/main/java/cn/lili/modules/member/service/MemberAddressService.java index cef85ea4..77193e0c 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/MemberAddressService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberAddressService.java @@ -1,4 +1,4 @@ -package cn.lili.modules.promotion.service; +package cn.lili.modules.member.service; import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dos.MemberAddress; @@ -9,14 +9,15 @@ import com.baomidou.mybatisplus.extension.service.IService; * 收货地址业务层 * * @author Chopper - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 */ public interface MemberAddressService extends IService { /** * 根据会员获取会员地址分页列表 * - * @param page 分页条件 + * @param page 分页条件 + * @param memberId 会员ID * @return 会员地址分页列表 */ IPage getAddressByMember(PageVO page, String memberId); diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberEvaluationService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberEvaluationService.java index 0e1d44f2..860018be 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberEvaluationService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberEvaluationService.java @@ -1,10 +1,8 @@ package cn.lili.modules.member.service; -import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.entity.dto.EvaluationQueryParams; import cn.lili.modules.member.entity.dto.MemberEvaluationDTO; -import cn.lili.modules.member.entity.dto.StoreEvaluationQueryParams; import cn.lili.modules.member.entity.vo.EvaluationNumberVO; import cn.lili.modules.member.entity.vo.MemberEvaluationListVO; import cn.lili.modules.member.entity.vo.MemberEvaluationVO; @@ -15,7 +13,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 会员商品评价业务层 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberEvaluationService extends IService { @@ -25,23 +23,15 @@ public interface MemberEvaluationService extends IService { * @param evaluationQueryParams 评价查询 * @return 评价分页 */ - IPage queryByParams(EvaluationQueryParams evaluationQueryParams); - - /** - * 商家查询会员的评价分页列表 - * - * @param storeEvaluationQueryParams 评价查询 - * @return 会员的评价分页 - */ - IPage queryByParams(StoreEvaluationQueryParams storeEvaluationQueryParams); + IPage managerQuery(EvaluationQueryParams evaluationQueryParams); /** * 查询评价分页列表 + * * @param evaluationQueryParams 评价查询条件 - * @param page 分页查询参数 * @return 评价分页列表 */ - IPage queryPage(EvaluationQueryParams evaluationQueryParams, PageVO page); + IPage queryPage(EvaluationQueryParams evaluationQueryParams); /** * 添加会员评价 @@ -51,9 +41,11 @@ public interface MemberEvaluationService extends IService { * 4.发送用户评价消息修改商品的评价数量以及好评率 * * @param memberEvaluationDTO 评论 + * @param isSelf 是否自己操作(true:买家操作/false 系统操作) * @return 操作状态 */ - MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO); + MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO, Boolean isSelf); + /** * 根据ID查询会员评价 * @@ -65,7 +57,7 @@ public interface MemberEvaluationService extends IService { /** * 更改评论状态 * - * @param id 评价ID + * @param id 评价ID * @param status 状态 * @return 会员评价 */ @@ -85,12 +77,13 @@ public interface MemberEvaluationService extends IService { * @param id 评价ID * @param reply 回复内容 * @param replyImage 回复图片 - * + * @return 操作状态 */ boolean reply(String id, String reply, String replyImage); /** * 获取商品评价数量 + * * @param goodsId 商品ID * @return 评价数量数据 */ @@ -98,14 +91,24 @@ public interface MemberEvaluationService extends IService { /** * 获取今天新增的评价数量 + * * @return 今日评价数量 */ - Integer todayMemberEvaluation(); + long todayMemberEvaluation(); /** * 获取等待回复评价数量 + * * @return 等待回复评价数量 */ - Integer getWaitReplyNum(); + long getWaitReplyNum(); + + /** + * 统计商品评价数量 + * + * @param evaluationQueryParams 查询条件 + * @return 商品评价数量 + */ + long getEvaluationCount(EvaluationQueryParams evaluationQueryParams); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberGradeService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberGradeService.java new file mode 100644 index 00000000..76b12f0e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberGradeService.java @@ -0,0 +1,15 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.MemberGrade; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 会员等级业务层 + * @author Bulbasaur + * @since 2021/5/14 5:57 下午 + * + */ +public interface MemberGradeService extends IService { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeLogService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeLogService.java index 89902c0c..af034ad8 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeLogService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeLogService.java @@ -7,7 +7,7 @@ import cn.lili.modules.member.entity.dos.MemberNoticeLog; * 会员消息业务层 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ public interface MemberNoticeLogService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeSenterService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeSenterService.java index e4372c75..d783f423 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeSenterService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeSenterService.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 会员消息业务层 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ public interface MemberNoticeSenterService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeService.java index 045e47f2..07e06f30 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberNoticeService.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 会员站内信业务层 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ public interface MemberNoticeService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java index 6f9e25a8..dec081bc 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java @@ -1,14 +1,16 @@ package cn.lili.modules.member.service; +import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dos.MemberPointsHistory; import cn.lili.modules.member.entity.vo.MemberPointsHistoryVO; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; /** * 会员积分历史业务层 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberPointsHistoryService extends IService { @@ -20,5 +22,14 @@ public interface MemberPointsHistoryService extends IService MemberPointsHistoryList(PageVO page, String memberId, String memberName); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberReceiptService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberReceiptService.java index 601178e9..99815390 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberReceiptService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberReceiptService.java @@ -13,7 +13,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 会员发票业务层 * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ public interface MemberReceiptService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java index 7395dc04..7b777646 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java @@ -1,27 +1,35 @@ package cn.lili.modules.member.service; -import cn.lili.common.token.Token; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; import cn.lili.common.vo.PageVO; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO; import cn.lili.modules.member.entity.dto.MemberAddDTO; import cn.lili.modules.member.entity.dto.MemberEditDTO; -import cn.lili.modules.member.entity.vo.MemberDistributionVO; import cn.lili.modules.member.entity.vo.MemberSearchVO; +import cn.lili.modules.member.entity.vo.MemberVO; +import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo; +import cn.lili.modules.member.entity.vo.QRLoginResultVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; /** * 会员业务层 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberService extends IService { + /** + * 默认密码 + */ + static String DEFAULT_PASSWORD = "111111"; /** * 获取当前登录的用户信息 @@ -31,12 +39,13 @@ public interface MemberService extends IService { Member getUserInfo(); /** - * 是否可以通过手机获取用户 + * 通过手机获取用户 * - * @param uuid UUID * @param mobile 手机号 * @return 操作状态 */ + Member findByMobile(String mobile); + boolean findByMobile(String uuid, String mobile); /** @@ -65,10 +74,19 @@ public interface MemberService extends IService { */ Token usernameStoreLogin(String username, String password); + /** + * 商家登录:用户名、密码登录 + * + * @param mobilePhone 用户名 + * @return token + */ + Token mobilePhoneStoreLogin(String mobilePhone); + /** * 注册:手机号、验证码登录 * - * @return 是否登录成功 + * @param mobilePhone 手机号 + * @return token */ Token mobilePhoneLogin(String mobilePhone); @@ -99,6 +117,28 @@ public interface MemberService extends IService { */ Token register(String userName, String password, String mobilePhone); + /** + * 是否可以初始化密码 + * + * @return + */ + boolean canInitPass(); + + /** + * 初始化密码 + * + * @param password 密码 + * @return 操作结果 + */ + void initPass(String password); + + /** + * 注销账号 + * + * @param password 密码 + * @return 操作结果 + */ + void cancellation(String password); /** * 修改当前会员的手机号 * @@ -107,6 +147,14 @@ public interface MemberService extends IService { */ boolean changeMobile(String mobile); + /** + * 修改用户手机号 + * @param memberId 会员ID + * @param mobile 手机号 + * @return + */ + boolean changeMobile(String memberId,String mobile); + /** * 通过手机号修改密码 @@ -140,21 +188,23 @@ public interface MemberService extends IService { * @param page 分页 * @return 会员分页 */ - IPage getMemberPage(MemberSearchVO memberSearchVO, PageVO page); - - /** - * 一键注册会员 - * - * @return - */ - Token autoRegister(); + IPage getMemberPage(MemberSearchVO memberSearchVO, PageVO page); + + +// /** +// * 一键注册会员 +// * +// * @return +// */ +// Token autoRegister(); /** * 一键注册会员 * + * @param authUser 联合登录用户 * @return Token */ - Token autoRegister(ConnectAuthUser authUser); + Member autoRegister(ConnectAuthUser authUser); /** * 刷新token @@ -176,12 +226,13 @@ public interface MemberService extends IService { * 会员积分变动 * * @param point 变动积分 - * @param type 变动类型 1为增加 0为消费 + * @param type 是否增加积分 INCREASE 增加 REDUCE 扣减 * @param memberId 会员id - * @param content 变动详细 + * @param content 变动日志 * @return 操作结果 */ - Boolean updateMemberPoint(Long point, Integer type, String memberId, String content); + Boolean updateMemberPoint(Long point, String type, String memberId, String content); + /** * 修改会员状态 @@ -192,18 +243,81 @@ public interface MemberService extends IService { */ Boolean updateMemberStatus(List memberIds, Boolean status); - /** - * 查看会员数据分布 - * - * @return 会员数据分布 - */ - List distribution(); - /** * 根据条件查询会员总数 * * @param memberSearchVO * @return 会员总数 */ - Integer getMemberNum(MemberSearchVO memberSearchVO); + long getMemberNum(MemberSearchVO memberSearchVO); + + /** + * 获取指定会员数据 + * + * @param columns 指定获取的列 + * @param memberIds 会员ids + * @return 指定会员数据 + */ + List> listFieldsByMemberIds(String columns, List memberIds); + + /** + * 登出 + * + * @param userEnums token角色类型 + */ + void logout(UserEnums userEnums); + + /** + * 登出 + * + * @param userId 用户id + */ + void logout(String userId); + + /** + * 修改会员是否拥有店铺 + * + * @param haveStore 是否拥有店铺 + * @param storeId 店铺id + * @param memberIds 会员id + * @return + */ + void updateHaveShop(Boolean haveStore, String storeId, List memberIds); + + /** + * 重置会员密码为123456 + * + * @param ids 会员id + */ + void resetPassword(List ids); + + /** + * 获取所有会员的手机号 + * + * @return 所有会员的手机号 + */ + List getAllMemberMobile(); + + /** + * 更新会员登录时间为最新时间 + * + * @param memberId 会员id + * @return 是否更新成功 + */ + boolean updateMemberLoginTime(String memberId); + + /** + * 获取用户VO + * @param id 会员id + * @return 用户VO + */ + MemberVO getMember(String id); + + QRCodeLoginSessionVo createPcSession(); + + Object appScanner(String token); + + boolean appSConfirm(String token, Integer code); + + QRLoginResultVo loginWithSession(String token); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberSignService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberSignService.java index 268aa9c3..de3e0fbc 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberSignService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberSignService.java @@ -9,7 +9,7 @@ import java.util.List; * 会员签到业务层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberSignService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberWalletService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberWalletService.java deleted file mode 100644 index e669e985..00000000 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberWalletService.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.lili.modules.member.service; - - -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.entity.dos.MemberWallet; -import cn.lili.modules.member.entity.dos.MemberWithdrawApply; -import cn.lili.modules.member.entity.vo.MemberWalletVO; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - * 会员预存款业务层 - * - * @author pikachu - * @date 2020-02-25 14:10:16 - */ -public interface MemberWalletService extends IService { - - /** - * 查询会员的预存款 - * - * @param memberId 会员id - * @return 会员预存款VO - */ - MemberWalletVO getMemberWallet(String memberId); - - /** - * 增加用户预存款余额 - * - * @param money 金额 - * @param memberId 会员id - * @param serviceType 业务类型 @see DepositServiceTypeEnum - * @param detail 操作描述 - * @return 返回增加结果 true:增加成功 false:增加失败 - */ - Boolean increase(Double money, String memberId, String detail, String serviceType); - - /** - * 从冻结金额到余额 - * - * @param money 金额 - * @param memberId 会员id - * @param serviceType 业务类型 @see DepositServiceTypeEnum - * @param detail 操作描述 - * @return 返回增加结果 true:增加成功 false:增加失败 - */ - Boolean increaseWithdrawal(Double money, String memberId, String detail, String serviceType); - - /** - * 扣减用户预存款余额 - * - * @param money 金额 - * @param memberId 会员id - * @param detail 操作描述 - * @param serviceType 业务类型 @see DepositServiceTypeEnum - * @return 操作状态 - */ - Boolean reduce(Double money, String memberId, String detail, String serviceType); - - /** - * 提现扣减余额到冻结金额 - * - * @param money 金额 - * @param memberId 会员id - * @param detail 操作描述 - * @param serviceType 业务类型 @see DepositServiceTypeEnum - * @return 操作状态 - */ - Boolean reduceWithdrawal(Double money, String memberId, String detail, String serviceType); - - /** - * 提现扣减冻结金额 - * - * @param money 金额 - * @param memberId 会员id - * @param detail 操作描述 - * @return 操作状态 - */ - Boolean reduceFrozen(Double money, String memberId, String detail, String serviceType); - - /** - * 设置支付密码 - * - * @param member 会员id - * @param password 支付密码 - */ - void setMemberWalletPassword(Member member, String password); - - /** - * 检查当前会员是否设置过预存款密码 - * - * @return 操作状态 - */ - Boolean checkPassword(); - - /** - * 会员注册添加会员预存款 - * - * @param memberId 会员id - * @param memberName 会员名称 - * @return 操作结果 - */ - MemberWallet save(String memberId, String memberName); - - /** - * 用户提现 - * - * @param price 提现金额 - * @return 是否提现成功 - */ - Boolean applyWithdrawal(Double price); - - /** - * 提现公共方法,此方法供前端用户提现和后端提现使用 - * - * @param memberWithdrawApply 会员零钱提现申请 - * @return 操作状态 - */ - Boolean withdrawal(MemberWithdrawApply memberWithdrawApply); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreClerkRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreClerkRoleService.java new file mode 100644 index 00000000..58dee8db --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreClerkRoleService.java @@ -0,0 +1,41 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreClerkRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 店铺店员角色业务层 + * + * @author Chopper + * @since 2020/11/17 3:46 下午 + */ +public interface StoreClerkRoleService extends IService { + + /** + * 根据用户查看拥有的角色 + * + * @param clerkId 店员id + * @return + */ + List listByUserId(String clerkId); + + /** + * 根据店员id查看角色 + * + * @param clerkId 店员id + * @return + */ + List listId(String clerkId); + + /** + * 更新用户拥有的角色 + * + * @param clerkId 店员id + * @param storeClerkRoles 角色权限 + */ + void updateClerkRole(String clerkId, List storeClerkRoles); + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreCollectionService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreCollectionService.java index df2d12a4..7e9e60f8 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/StoreCollectionService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreCollectionService.java @@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 店铺收藏业务层 * * @author Chopper - * @date 2020/11/18 2:52 下午 + * @since 2020/11/18 2:52 下午 */ public interface StoreCollectionService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentRoleService.java new file mode 100644 index 00000000..4ffc9a19 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentRoleService.java @@ -0,0 +1,38 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 部门角色业务层 + * + * @author Chopper + * @since 2020/11/22 12:08 + */ +public interface StoreDepartmentRoleService extends IService { + + /** + * 根据部门获取角色集合 + * + * @param storeDepartmentId 店铺部门id + * @return + */ + List listByDepartmentId(String storeDepartmentId); + + /** + * 更新部门角色关联 + * + * @param storeDepartmentId 店铺部门id + * @param storeDepartmentRoles 店铺部门角色 + */ + void updateByDepartmentId(String storeDepartmentId, List storeDepartmentRoles); + + /** + * 根据部门id删除部门与角色关联 + * + * @param ids id集合 + */ + void deleteByDepartment(List ids); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentService.java new file mode 100644 index 00000000..43fdd74d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentService.java @@ -0,0 +1,40 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.member.entity.vo.StoreDepartmentVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 店铺部门业务层 + * + * @author Chopper + * @since 2020/11/17 3:43 下午 + */ +public interface StoreDepartmentService extends IService { + + /** + * 获取部门树 + * + * @param initWrapper + * @return + */ + List tree(QueryWrapper initWrapper); + + /** + * 删除部门 + * + * @param ids + */ + void deleteByIds(List ids); + + /** + * 更新店铺部门 + * + * @param storeDepartment 店铺部门 + * @return + */ + Boolean update(StoreDepartment storeDepartment); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreLogisticsService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreLogisticsService.java new file mode 100644 index 00000000..f4842ddf --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreLogisticsService.java @@ -0,0 +1,92 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.store.entity.dto.StoreLogisticsCustomerDTO; +import cn.lili.modules.system.entity.vo.StoreLogisticsVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 店铺-物流公司业务层 + * + * @author Chopper + * @since 2020/11/17 8:02 下午 + */ +public interface StoreLogisticsService extends IService { + + /** + * 获取当前店铺的物流公司列表 + * + * @param storeId 店铺id + * @return 物流公司列表 + */ + List getStoreLogistics(String storeId); + + /** + * 获取当前店铺已选择的物流公司列表 + * + * @param storeId 店铺id + * @return 物流公司列表 + */ + List getStoreSelectedLogistics(String storeId); + + /** + * 获取当前店铺已选择的物流公司名称列表 + * + * @param storeId 店铺id + * @return 物流公司列表 + */ + List getStoreSelectedLogisticsName(String storeId); + + /** + * 添加店铺-物流公司 + * + * @param logisticsId 物流公司设置id + * @param storeId 店铺id + * @return 店铺物流公司 + */ + StoreLogistics add(String logisticsId, String storeId, StoreLogisticsCustomerDTO storeLogisticsCustomerDTO); + + /** + * 获取当前店铺已选择的物流公司并使用电子面单列表 + * + * @param storeId 店铺id + * @return 物流公司列表 + */ + List getStoreSelectedLogisticsUseFaceSheet(String storeId); + + + /** + * 修改店铺-物流公司电子面单参数 + * @param logisticsId 物流公司设置id + * @param storeId 店铺id + * @return 店铺物流公司 + */ + StoreLogistics update(String logisticsId, String storeId, StoreLogisticsCustomerDTO storeLogisticsCustomerDTO); + + + /** + * 获取店铺物流信息回填 + * @param logisticsId 物流id + * @return 店铺物流信息 + */ + StoreLogistics getStoreLogisticsInfo(String logisticsId); + + /** + * 获取当前店铺已开启的物流公司列表 + * + * @param storeId 店铺id + * @return 物流公司列表 + */ + List getOpenStoreLogistics(String storeId); + + /** + * 获取当前店铺未开启的物流公司列表 + * + * @param storeId 店铺id + * @return 物流公司列表 + */ + List getCloseStoreLogistics(String storeId); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java new file mode 100644 index 00000000..98aa9e6f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java @@ -0,0 +1,57 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 角色菜单接口 + * + * @author Chopper + * @since 2020/11/22 11:43 + */ +public interface StoreMenuRoleService extends IService { + + /** + * 通过角色获取菜单权限列表 + * + * @param roleId + * @return + */ + List findByRoleId(String roleId); + + + /** + * 根据角色集合获取拥有的菜单具体权限 + * + * @param clerkId + * @return + */ + List findAllMenu(String clerkId,String memberId); + + + /** + * 更新某角色拥有到菜单 + * + * @param roleId 角色id + * @param roleMenus + */ + void updateRoleMenu(String roleId, List roleMenus); + + /** + * 根据角色id 删除数据 + * + * @param roleId + */ + void delete(String roleId); + + /** + * 根据角色id 删除数据 + * + * @param roleId + */ + void delete(List roleId); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreMenuService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuService.java new file mode 100644 index 00000000..934e5600 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuService.java @@ -0,0 +1,74 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.vo.StoreMenuVO; +import cn.lili.modules.permission.entity.dto.MenuSearchParams; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.cache.annotation.CacheConfig; + +import java.util.List; + +/** + * 店铺菜单权限业务层 + * + * @author Chopper + * @since 2020/11/17 3:45 下午 + */ +@CacheConfig(cacheNames = "{store_menu}") +public interface StoreMenuService extends IService { + + /** + * 通过用户的菜单权限 + * + * @return + */ + List findUserTree(); + + /** + * 通过用户id获取 + * + * @param userId + * @return + */ + List findUserList(String userId); + + + /** + * 根据角色id获取菜单集合 + * + * @param roleIds + * @return + */ + List findByRoleIds(String roleIds); + + /** + * 树形结构 + * + * @return + */ + List tree(); + + /** + * 查询列表 + * + * @param menuSearchParams + * @return + */ + List searchList(MenuSearchParams menuSearchParams); + + /** + * 批量删除 + * + * @param ids + */ + void deleteIds(List ids); + + /** + * 添加更新菜单 + * + * @param storeMenu 菜单数据 + * @return 是否成功 + */ + boolean saveOrUpdateMenu(StoreMenu storeMenu); + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreRoleService.java new file mode 100644 index 00000000..74c9804a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreRoleService.java @@ -0,0 +1,56 @@ +package cn.lili.modules.member.service; + + +import cn.lili.modules.member.entity.dos.StoreRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 角色业务层 + * + * @author Chopper + * @since 2020/11/17 3:45 下午 + */ +public interface StoreRoleService extends IService { + + /** + * 获取默认角色 + * + * @param defaultRole + * @return + */ + List findByDefaultRole(Boolean defaultRole); + + + /** + * 批量删除角色 + * + * @param roleIds + */ + void deleteRoles(List roleIds); + + /** + * 修改角色 + * + * @param storeRole 店铺角色 + * @return + */ + Boolean update(StoreRole storeRole); + + /** + * 保存店铺角色 + * + * @param storeRole 店铺角色 + * @return + */ + Boolean saveStoreRole(StoreRole storeRole); + + /** + * 当前店铺 根据角色id查询角色 + * + * @param ids 角色id + * @return + */ + List list(List ids); +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java new file mode 100644 index 00000000..84aea3b4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java @@ -0,0 +1,327 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.StringUtils; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dos.StoreClerkRole; +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; +import cn.lili.modules.member.entity.dto.ClerkEditDTO; +import cn.lili.modules.member.entity.dto.ClerkQueryDTO; +import cn.lili.modules.member.entity.vo.ClerkVO; +import cn.lili.modules.member.mapper.ClerkMapper; +import cn.lili.modules.member.service.*; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 店员业务实现 + * + * @author wget + * @title: ClerkServiceImpl + * @projectName lilishop + * @date 2021/12/28 8:13 下午 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class ClerkServiceImpl extends ServiceImpl implements ClerkService { + + @Autowired + private StoreRoleService storeRoleService; + @Autowired + private StoreDepartmentService storeDepartmentService; + @Autowired + private MemberService memberService; + @Autowired + private StoreClerkRoleService storeClerkRoleService; + + @Override + public IPage clerkForPage(PageVO page, ClerkQueryDTO clerkQueryDTO) { + + QueryWrapper clerkVOQueryWrapper = new QueryWrapper<>(); + clerkVOQueryWrapper.eq("li_clerk.store_id", UserContext.getCurrentUser().getStoreId()); + clerkVOQueryWrapper.eq(StringUtils.isNotEmpty(clerkQueryDTO.getDepartmentId()), "li_clerk.department_id", clerkQueryDTO.getDepartmentId()); + clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getClerkName()), "li_clerk.clerk_name", clerkQueryDTO.getClerkName()); + clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getMobile()), "m.mobile", clerkQueryDTO.getMobile()); + + return this.baseMapper.selectClerkPage(PageUtil.initPage(page), clerkVOQueryWrapper); + + + /*Page clerkPage = page(initPage, initWrapper); + + if (clerkPage.getRecords().size() > 0) { + List roles = storeRoleService.list(new QueryWrapper() + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + + List departments = storeDepartmentService.list(new QueryWrapper() + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + + List memberIds = new ArrayList<>(); + clerkPage.getRecords().forEach(clerk -> { + memberIds.add(clerk.getMemberId()); + }); + List members = memberService.list(new QueryWrapper().in("id", memberIds)); + + List result = new ArrayList<>(); + + clerkPage.getRecords().forEach(clerk -> { + ClerkVO clerkVO = new ClerkVO(clerk); + if (!CharSequenceUtil.isEmpty(clerk.getDepartmentId())) { + try { + clerkVO.setDepartmentTitle( + departments.stream().filter + (department -> department.getId().equals(clerk.getDepartmentId())) + .collect(Collectors.toList()) + .get(0) + .getTitle() + ); + } catch (Exception e) { + log.error("填充部门信息异常", e); + } + } + clerkVO.setMobile( + members.stream().filter + (member -> member.getId().equals(clerk.getMemberId())) + .collect(Collectors.toList()) + .get(0) + .getMobile() + ); + if (!StringUtils.isEmpty(clerk.getRoleIds())) { + try { + List memberRoles = Arrays.asList(clerk.getRoleIds().split(",")); + clerkVO.setRoles( + roles.stream().filter + (role -> memberRoles.contains(role.getId())) + .collect(Collectors.toList()) + ); + } catch (Exception e) { + log.error("填充部门信息异常", e); + } + } + result.add(clerkVO); + }); + Page pageResult = new Page(clerkPage.getCurrent(), clerkPage.getSize(), clerkPage.getTotal()); + pageResult.setRecords(result); + return pageResult; + } + return new Page();*/ + } + + + @Override + public ClerkVO get(String id) { + Clerk clerk = this.getById(id); + ClerkVO clerkVO = new ClerkVO(clerk); + //手机号码 + clerkVO.setMobile(memberService.getById(clerk.getMemberId()).getMobile()); + if (!CharSequenceUtil.isEmpty(clerk.getDepartmentId())) { + clerkVO.setDepartmentTitle(storeDepartmentService.getById(clerk.getDepartmentId()).getTitle()); + } + if (!StringUtils.isEmpty(clerk.getRoleIds())) { + List memberRoles = Arrays.asList(clerk.getRoleIds().split(",")); + List roles = storeRoleService.list(new QueryWrapper() + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + clerkVO.setRoles( + roles.stream().filter + (role -> memberRoles.contains(role.getId())) + .collect(Collectors.toList()) + ); + } + return clerkVO; + } + + @Override + public Clerk updateClerk(ClerkEditDTO clerkEditDTO) { + Clerk clerk = this.getById(clerkEditDTO.getId()); + if (clerk != null) { + //编辑店主限制 + if(clerk.getShopkeeper()){ + throw new ServiceException(ResultCode.CANT_EDIT_CLERK_SHOPKEEPER); + } + + //校验当前店员是否是当前店铺的 + if (!clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + if (clerkEditDTO.getIsSuper()) { + clerk.setRoleIds(""); + } else { + //角色赋值 + if (!clerkEditDTO.getRoles().isEmpty()) { + clerk.setRoleIds(CharSequenceUtil.join(",", clerkEditDTO.getRoles())); + } + } + + //部门校验 + if (StringUtils.isNotEmpty(clerkEditDTO.getDepartmentId())) { + if (storeDepartmentService.getById(clerkEditDTO.getDepartmentId()) != null) { + clerk.setDepartmentId(clerkEditDTO.getDepartmentId()); + } else { + throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); + } + } + clerk.setIsSuper(clerkEditDTO.getIsSuper()); + this.updateById(clerk); + return clerk; + } + throw new ServiceException(ResultCode.CLERK_NOT_FOUND_ERROR); + } + + @Override + public Clerk saveClerk(ClerkAddDTO clerkAddDTO) { + Clerk clerk = new Clerk(clerkAddDTO); + clerk.setShopkeeper(clerkAddDTO.getShopkeeper()); + clerk.setIsSuper(clerkAddDTO.getIsSuper()); + //校验此会员是否已经是店员 + Clerk temp = this.getClerkByMemberId(clerkAddDTO.getMemberId()); + + //店员信息不为空 + if (temp != null && !temp.getStoreId().equals(clerkAddDTO.getStoreId())) { + throw new ServiceException(ResultCode.CLERK_USER_ERROR); + } + if (temp != null && temp.getStoreId().equals(clerkAddDTO.getStoreId())) { + throw new ServiceException(ResultCode.CLERK_ALREADY_EXIT_ERROR); + } + //部门校验 + if (StringUtils.isNotEmpty(clerkAddDTO.getDepartmentId())) { + if (storeDepartmentService.getById(clerkAddDTO.getDepartmentId()) == null) { + throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); + } + } + //角色校验 + if (clerkAddDTO.getRoles() != null && clerkAddDTO.getRoles().size() > 0) { + List storeRoles = storeRoleService.list(clerkAddDTO.getRoles()); + if (storeRoles.size() != clerkAddDTO.getRoles().size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + } + + this.save(clerk); + + //判断用户角色权限不为超级会员且权限路径不为空 + if(clerkAddDTO.getIsSuper()==false && clerkAddDTO.getRoles()!=null){ + //添加店员用户角色 + List storeClerkRoleList = new ArrayList<>(); + + clerkAddDTO.getRoles().stream().forEach(a -> { + storeClerkRoleList.add(StoreClerkRole.builder().clerkId(clerk.getId()).roleId(a).build()); + }); + storeClerkRoleService.saveBatch(storeClerkRoleList); + } + + return clerk; + } + + @Override + public Clerk getClerkByMemberId(String memberId) { + return this.getOne(new QueryWrapper().eq("member_id", memberId)); + } + + @Override + public void resetPassword(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.in("id", ids); + List clerks = this.baseMapper.selectList(queryWrapper); + //校验要重置的店员是否是当前店铺的店员 + if (clerks.size() != ids.size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + //店员密码就是会员密码所以要组织会员修改密码参数信息 + List memberIds = new ArrayList<>(); + clerks.forEach(clerk -> { + //如果是店主无法重置密码 + if (clerk.getShopkeeper()) { + throw new ServiceException(ResultCode.CLERK_SUPPER); + } + memberIds.add(clerk.getMemberId()); + }); + memberService.resetPassword(memberIds); + } + + + @Override + public void deleteClerk(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.in("id", ids); + List clerks = this.baseMapper.selectList(queryWrapper); + if (clerks.size() > 0) { + //校验要重置的店员是否是当前店铺的店员 + if (clerks.size() != ids.size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + //删除店员 + this.removeByIds(ids); + //更改会员为为拥有店铺 + List memberIds = new ArrayList<>(); + clerks.forEach(clerk -> { + //无法删除当前登录的店员 + if (UserContext.getCurrentUser().getClerkId().equals(clerk.getId())) { + throw new ServiceException(ResultCode.CLERK_CURRENT_SUPPER); + } + //无法删除店主 + if (clerk.getShopkeeper()) { + throw new ServiceException(ResultCode.CLERK_SUPPER); + } + memberIds.add(clerk.getMemberId()); + }); + memberService.updateHaveShop(false, null, memberIds); + } + } + + @Override + public Member checkClerk(String mobile) { + //校验是否已经是会员 + Member member = memberService.findByMobile(mobile); + if (member != null) { + //校验要添加的会员是否已经是店主 + if (member.getHaveStore()) { + throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); + } + //校验会员的有效性 + if (!member.getDisabled()) { + throw new ServiceException(ResultCode.USER_STATUS_ERROR); + } + //校验此会员是否已经是店员 + Clerk clerk = this.getClerkByMemberId(member.getId()); + if (clerk != null && !clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.CLERK_USER_ERROR); + } + if (clerk != null && clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.CLERK_ALREADY_EXIT_ERROR); + } + return member; + } + return new Member(); + } + + @Override + public void disable(String id, Boolean status) { + Clerk clerk = this.getById(id); + if (clerk == null) { + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } + //店主无法禁用 + if (clerk.getShopkeeper() && clerk.getStatus()) { + throw new ServiceException(ResultCode.CLERK_SUPPER); + } + clerk.setStatus(status); + this.updateById(clerk); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java index ff7d65b1..b8110c7c 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java @@ -1,17 +1,19 @@ package cn.lili.modules.member.serviceimpl; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.member.entity.dos.FootPrint; +import cn.lili.modules.member.entity.dto.FootPrintQueryParams; import cn.lili.modules.member.mapper.FootprintMapper; import cn.lili.modules.member.service.FootprintService; import cn.lili.modules.search.entity.dos.EsGoodsIndex; -import cn.lili.modules.search.service.EsGoodsSearchService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,43 +21,42 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * 会员浏览历史业务层实现 * * @author Chopper - * @date 2020/11/18 10:46 上午 + * @since 2020/11/18 10:46 上午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FootprintServiceImpl extends ServiceImpl implements FootprintService { - //足迹数据层 - private final FootprintMapper footprintMapper; - //es商品业务层 - private final EsGoodsSearchService esGoodsSearchService; + + @Autowired + private GoodsSkuService goodsSkuService; @Override + @Transactional(rollbackFor = Exception.class) public FootPrint saveFootprint(FootPrint footPrint) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(FootPrint::getMemberId, footPrint.getMemberId()); queryWrapper.eq(FootPrint::getGoodsId, footPrint.getGoodsId()); //如果已存在某商品记录,则更新其修改时间 //如果不存在则添加记录 + //为了保证足迹的排序,将原本足迹删除后重新添加 List oldPrints = list(queryWrapper); if (oldPrints != null && !oldPrints.isEmpty()) { FootPrint oldPrint = oldPrints.get(0); - oldPrint.setSkuId(footPrint.getSkuId()); - this.updateById(oldPrint); - return oldPrint; - } else { - footPrint.setCreateTime(new Date()); - this.save(footPrint); - //删除超过100条后的记录 - footprintMapper.deleteLastFootPrint(footPrint.getMemberId()); - return footPrint; + this.removeById(oldPrint.getId()); } + footPrint.setCreateTime(new Date()); + this.save(footPrint); + //删除超过100条后的记录 + this.baseMapper.deleteLastFootPrint(footPrint.getMemberId()); + return footPrint; } @Override @@ -70,32 +71,48 @@ public class FootprintServiceImpl extends ServiceImpl lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(FootPrint::getMemberId, UserContext.getCurrentUser().getId()); lambdaQueryWrapper.in(FootPrint::getGoodsId, ids); - this.remove(lambdaQueryWrapper); - return true; + return this.remove(lambdaQueryWrapper); } @Override - public List footPrintPage(PageVO pageVO) { + public IPage footPrintPage(FootPrintQueryParams params) { + params.setSort("createTime"); + Page footPrintPages = this.page(PageUtil.initPage(params), params.queryWrapper()); + //定义结果 + Page esGoodsIndexIPage = new Page<>(); - LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(FootPrint::getMemberId, UserContext.getCurrentUser().getId()); - lambdaQueryWrapper.eq(FootPrint::getDeleteFlag,false); - lambdaQueryWrapper.orderByDesc(FootPrint::getUpdateTime); - List skuIdList = footprintMapper.footprintSkuIdList(PageUtil.initPage(pageVO), lambdaQueryWrapper); - if (skuIdList.size() > 0) { - List list = esGoodsSearchService.getEsGoodsBySkuIds(skuIdList); - //去除为空的商品数据 - list.removeIf(Objects::isNull); - return list; + if (footPrintPages.getRecords() != null && !footPrintPages.getRecords().isEmpty()) { + List skuIds = footPrintPages.getRecords().stream().map(FootPrint::getSkuId).collect(Collectors.toList()); + List goodsSkuByIdFromCache = goodsSkuService.getGoodsSkuByIdFromCache(skuIds); + List collect = IntStream.range(0, goodsSkuByIdFromCache.size()) + .mapToObj(i -> { + if (goodsSkuByIdFromCache.get(i) == null) { + EsGoodsIndex esGoodsIndex = new EsGoodsIndex(); + FootPrint footPrint = footPrintPages.getRecords().get(i); + esGoodsIndex.setGoodsId(footPrint.getGoodsId()); + esGoodsIndex.setId(footPrint.getSkuId()); + esGoodsIndex.setReleaseTime(footPrintPages.getRecords().get(i).getCreateTime().getTime()); + return esGoodsIndex; + } + Optional first = footPrintPages.getRecords().stream().filter(j -> j.getSkuId().equals(goodsSkuByIdFromCache.get(i).getId())).findFirst(); + return first.map(footPrint -> new EsGoodsIndex(goodsSkuByIdFromCache.get(i), footPrint.getCreateTime())).orElseGet(() -> new EsGoodsIndex(goodsSkuByIdFromCache.get(i))); + }) + .collect(Collectors.toList()); + esGoodsIndexIPage.setPages(footPrintPages.getPages()); + esGoodsIndexIPage.setRecords(collect); + esGoodsIndexIPage.setTotal(footPrintPages.getTotal()); + esGoodsIndexIPage.setSize(footPrintPages.getSize()); + esGoodsIndexIPage.setCurrent(footPrintPages.getCurrent()); + return esGoodsIndexIPage; } - return null; + return esGoodsIndexIPage; } @Override - public Integer getFootprintNum() { + public long getFootprintNum() { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(FootPrint::getMemberId, UserContext.getCurrentUser().getId()); - lambdaQueryWrapper.eq(FootPrint::getDeleteFlag,false); + lambdaQueryWrapper.eq(FootPrint::getMemberId, Objects.requireNonNull(UserContext.getCurrentUser()).getId()); + lambdaQueryWrapper.eq(FootPrint::getDeleteFlag, false); return this.count(lambdaQueryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java index 06341860..c7f915f7 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java @@ -1,27 +1,19 @@ package cn.lili.modules.member.serviceimpl; -import cn.hutool.json.JSONUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.GoodsTagsEnum; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.GoodsCollection; import cn.lili.modules.member.entity.vo.GoodsCollectionVO; import cn.lili.modules.member.mapper.GoodsCollectionMapper; import cn.lili.modules.member.service.GoodsCollectionService; +import cn.lili.mybatis.util.PageUtil; 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.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; @@ -30,19 +22,11 @@ import java.util.Optional; * 会员收藏业务层实现 * * @author Chopper - * @date 2020/11/18 2:25 下午 + * @since 2020/11/18 2:25 下午 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsCollectionServiceImpl extends ServiceImpl implements GoodsCollectionService { - //商品收藏 - private final GoodsCollectionMapper goodsCollectionMapper; - //rocketMq - private final RocketMQTemplate rocketMQTemplate; - //rocketMq配置 - private final RocketmqCustomProperties rocketmqCustomProperties; @Override public IPage goodsCollection(PageVO pageVo) { @@ -50,7 +34,7 @@ public class GoodsCollectionServiceImpl extends ServiceImpl implements MemberAddressService { @Override - public IPage getAddressByMember(PageVO page,String memberId) { + public IPage getAddressByMember(PageVO page, String memberId) { return this.page(PageUtil.initPage(page), new QueryWrapper() .eq("member_id", memberId)); @@ -41,7 +37,7 @@ public class MemberAddressServiceImpl extends ServiceImpl() - .eq("member_id", UserContext.getCurrentUser().getId()) + .eq("member_id", Objects.requireNonNull(UserContext.getCurrentUser()).getId()) .eq("id", id)); } @@ -54,14 +50,15 @@ public class MemberAddressServiceImpl extends ServiceImpl() - .eq("member_id", UserContext.getCurrentUser().getId()) + .eq("member_id", Objects.requireNonNull(UserContext.getCurrentUser()).getId()) .eq("is_default", true)); } @Override + @Transactional(rollbackFor = Exception.class) public MemberAddress saveMemberAddress(MemberAddress memberAddress) { //判断当前地址是否为默认地址,如果为默认需要将其他的地址修改为非默认 - updateDefaultShippingAddress(memberAddress); + removeDefaultAddress(memberAddress); //添加会员地址 this.save(memberAddress); @@ -69,13 +66,18 @@ public class MemberAddressServiceImpl extends ServiceImpl() - .eq("id", memberAddress.getId())); + MemberAddress originalMemberAddress = this.getMemberAddress(memberAddress.getId()); + if (originalMemberAddress != null) { + if (memberAddress.getIsDefault() == null) { + memberAddress.setIsDefault(false); + } + //判断当前地址是否为默认地址,如果为默认需要将其他的地址修改为非默认 + removeDefaultAddress(memberAddress); + this.saveOrUpdate(memberAddress); + } + return memberAddress; } @@ -88,20 +90,15 @@ public class MemberAddressServiceImpl extends ServiceImpl list = this.baseMapper.selectList(new QueryWrapper().eq("member_id", shippingAddress.getMemberId())); - if (list.size() == 1) { - shippingAddress.setIsDefault(true); - } + private void removeDefaultAddress(MemberAddress memberAddress) { //如果不是默认地址不需要处理 - if (shippingAddress.getIsDefault()) { + if (Boolean.TRUE.equals(memberAddress.getIsDefault())) { //将会员的地址修改为非默认地址 LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.set(MemberAddress::getIsDefault, false); - lambdaUpdateWrapper.eq(MemberAddress::getMemberId, shippingAddress.getMemberId()); + lambdaUpdateWrapper.eq(MemberAddress::getMemberId, memberAddress.getMemberId()); this.update(lambdaUpdateWrapper); } diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberEvaluationServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberEvaluationServiceImpl.java index 8ef5c7cd..6877a97a 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberEvaluationServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberEvaluationServiceImpl.java @@ -2,25 +2,21 @@ package cn.lili.modules.member.serviceimpl; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.json.JSONUtil; -import cn.lili.common.enums.SwitchEnum; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.SwitchEnum; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.GoodsTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; +import cn.lili.common.sensitive.SensitiveWordsFilter; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.entity.dto.EvaluationQueryParams; import cn.lili.modules.member.entity.dto.MemberEvaluationDTO; -import cn.lili.modules.member.entity.dto.StoreEvaluationQueryParams; import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; import cn.lili.modules.member.entity.vo.EvaluationNumberVO; import cn.lili.modules.member.entity.vo.MemberEvaluationListVO; @@ -33,8 +29,9 @@ import cn.lili.modules.order.order.entity.dos.OrderItem; import cn.lili.modules.order.order.entity.enums.CommentStatusEnum; import cn.lili.modules.order.order.service.OrderItemService; import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.system.utils.CharacterConstant; -import cn.lili.modules.system.utils.SensitiveWordsFilter; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -42,12 +39,12 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; import java.util.Map; @@ -55,60 +52,86 @@ import java.util.Map; * 会员商品评价业务层实现 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberEvaluationServiceImpl extends ServiceImpl implements MemberEvaluationService { - //会员评价数据层 - private final MemberEvaluationMapper memberEvaluationMapper; - //订单 - private final OrderService orderService; - //子订单 - private final OrderItemService orderItemService; - //会员 - private final MemberService memberService; - //商品 - private final GoodsSkuService goodsSkuService; - //rocketMq - private final RocketMQTemplate rocketMQTemplate; - //rocketMq配置 - private final RocketmqCustomProperties rocketmqCustomProperties; + /** + * 会员评价数据层 + */ + @Resource + private MemberEvaluationMapper memberEvaluationMapper; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 子订单 + */ + @Autowired + private OrderItemService orderItemService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; + /** + * 商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * rocketMq配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; @Override - public IPage queryByParams(EvaluationQueryParams queryParams) { + public IPage managerQuery(EvaluationQueryParams queryParams) { //获取评价分页 return this.page(PageUtil.initPage(queryParams), queryParams.queryWrapper()); } @Override - public IPage queryByParams(StoreEvaluationQueryParams storeEvaluationQueryParams) { - return memberEvaluationMapper.getMemberEvaluationList(PageUtil.initPage(storeEvaluationQueryParams), storeEvaluationQueryParams.queryWrapper()); + public IPage queryPage(EvaluationQueryParams evaluationQueryParams) { + return memberEvaluationMapper.getMemberEvaluationList(PageUtil.initPage(evaluationQueryParams), evaluationQueryParams.queryWrapper()); } @Override - public IPage queryPage(EvaluationQueryParams evaluationQueryParams, PageVO page) { - return memberEvaluationMapper.getMemberEvaluationList(PageUtil.initPage(page), evaluationQueryParams.queryWrapper()); - } - - @Override - public MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO) { + @Transactional(rollbackFor = Exception.class) + public MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO, Boolean isSelf) { //获取子订单信息 OrderItem orderItem = orderItemService.getBySn(memberEvaluationDTO.getOrderItemSn()); //获取订单信息 Order order = orderService.getBySn(orderItem.getOrderSn()); //检测是否可以添加会员评价 - checkMemberEvaluation(orderItem,order); - //获取用户信息 - Member member = memberService.getUserInfo(); + Member member; + + checkMemberEvaluation(orderItem, order); + + if (Boolean.TRUE.equals(isSelf)) { + //自我评价商品时,获取当前登录用户信息 + member = memberService.getUserInfo(); + } else { + //获取用户信息 非自己评价时,读取数据库 + member = memberService.getById(order.getMemberId()); + if (member == null) { + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } + } //获取商品信息 GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(memberEvaluationDTO.getSkuId()); //新增用户评价 MemberEvaluation memberEvaluation = new MemberEvaluation(memberEvaluationDTO, goodsSku, member, order); //过滤商品咨询敏感词 - memberEvaluation.setContent(SensitiveWordsFilter.filter(memberEvaluation.getContent(), CharacterConstant.WILDCARD_STAR)); + memberEvaluation.setContent(SensitiveWordsFilter.filter(memberEvaluation.getContent())); //添加评价 this.save(memberEvaluation); @@ -146,7 +169,7 @@ public class MemberEvaluationServiceImpl extends ServiceImpl updateWrapper = Wrappers.update(); updateWrapper.set("reply_status", true); updateWrapper.set("reply", reply); - if (StringUtils.isNotEmpty(replyImage)) { + if (CharSequenceUtil.isNotEmpty(replyImage)) { updateWrapper.set("have_reply_image", true); updateWrapper.set("reply_image", replyImage); } @@ -157,7 +180,8 @@ public class MemberEvaluationServiceImpl extends ServiceImpl> list = memberEvaluationMapper.getEvaluationNumber(goodsId); + List> list = this.baseMapper.getEvaluationNumber(goodsId); + Integer good = 0; Integer moderate = 0; @@ -183,25 +207,37 @@ public class MemberEvaluationServiceImpl extends ServiceImpl().gt(MemberEvaluation::getCreateTime, DateUtil.beginOfDay(new DateTime()))); + public long todayMemberEvaluation() { + return this.count(new LambdaQueryWrapper().ge(MemberEvaluation::getCreateTime, DateUtil.beginOfDay(new DateTime()))); } @Override - public Integer getWaitReplyNum() { + public long getWaitReplyNum() { QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), + queryWrapper.eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), "store_id", UserContext.getCurrentUser().getStoreId()); queryWrapper.eq("reply_status", false); return this.count(queryWrapper); } /** - * 检测会员评价 - * @param orderItem 子订单 - * @param order 订单 + * 统计商品评价数量 + * + * @param evaluationQueryParams 查询条件 + * @return 商品评价数量 */ - public void checkMemberEvaluation(OrderItem orderItem,Order order){ + @Override + public long getEvaluationCount(EvaluationQueryParams evaluationQueryParams) { + return this.count(evaluationQueryParams.queryWrapper()); + } + + /** + * 检测会员评价 + * + * @param orderItem 子订单 + * @param order 订单 + */ + public void checkMemberEvaluation(OrderItem orderItem, Order order) { //根据子订单编号判断是否评价过 if (orderItem.getCommentStatus().equals(CommentStatusEnum.FINISHED.name())) { @@ -209,7 +245,7 @@ public class MemberEvaluationServiceImpl extends ServiceImpl implements MemberGradeService { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeLogServiceImpl.java index ad0d24a0..98dedbbb 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeLogServiceImpl.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; * 会员消息业务层实现 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ @Service public class MemberNoticeLogServiceImpl extends ServiceImpl implements MemberNoticeLogService { diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeSenterServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeSenterServiceImpl.java index aa5f3e8b..0672d717 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeSenterServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeSenterServiceImpl.java @@ -1,17 +1,17 @@ package cn.lili.modules.member.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.member.entity.dos.MemberNoticeSenter; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberNotice; +import cn.lili.modules.member.entity.dos.MemberNoticeSenter; import cn.lili.modules.member.entity.enums.SendTypeEnum; import cn.lili.modules.member.mapper.MemberNoticeSenterMapper; import cn.lili.modules.member.service.MemberNoticeSenterService; import cn.lili.modules.member.service.MemberNoticeService; import cn.lili.modules.member.service.MemberService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -24,19 +24,25 @@ import java.util.List; * 会员消息业务层实现 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ @Service -@Transactional(propagation = Propagation.REQUIRED, rollbackFor = java.lang.Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class MemberNoticeSenterServiceImpl extends ServiceImpl implements MemberNoticeSenterService { - //会员 - private final MemberService memberService; - //会员站内信 - private final MemberNoticeService memberNoticeService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; + /** + * 会员站内信 + */ + @Autowired + private MemberNoticeService memberNoticeService; @Override + @Transactional(rollbackFor = Exception.class) public boolean customSave(MemberNoticeSenter memberNoticeSenter) { if (this.saveOrUpdate(memberNoticeSenter)) { @@ -44,7 +50,7 @@ public class MemberNoticeSenterServiceImpl extends ServiceImpl members = memberService.list(); MemberNotice memberNotice; @@ -72,12 +78,12 @@ public class MemberNoticeSenterServiceImpl extends ServiceImpl 0) { + if (!memberNotices.isEmpty()) { //批量保存 if (memberNoticeService.saveBatch(memberNotices)) { return true; } else { - throw new ServiceException("发送站内信异常,请检查系统日志"); + throw new ServiceException(ResultCode.NOTICE_SEND_ERROR); } } } diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeServiceImpl.java index 1444b14e..c2668d0b 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberNoticeServiceImpl.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; * 会员站内信业务层实现 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ @Service public class MemberNoticeServiceImpl extends ServiceImpl implements MemberNoticeService { diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java index de21a05c..70c40c38 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberPointsHistoryServiceImpl.java @@ -1,47 +1,58 @@ package cn.lili.modules.member.serviceimpl; -import cn.lili.common.utils.StringUtils; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberPointsHistory; import cn.lili.modules.member.entity.vo.MemberPointsHistoryVO; import cn.lili.modules.member.mapper.MemberPointsHistoryMapper; import cn.lili.modules.member.service.MemberPointsHistoryService; +import cn.lili.modules.member.service.MemberService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 会员积分历史业务层实现 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberPointsHistoryServiceImpl extends ServiceImpl implements MemberPointsHistoryService { - private final MemberPointsHistoryMapper memberPointsHistoryMapper; + + @Autowired + private MemberService memberService; @Override public MemberPointsHistoryVO getMemberPointsHistoryVO(String memberId) { + //获取会员积分历史 + Member member = memberService.getById(memberId); MemberPointsHistoryVO memberPointsHistoryVO = new MemberPointsHistoryVO(); - Long point = 0L; - Long variablePoint = 0L; - - if (StringUtils.isNotEmpty(memberId)) { - point = memberPointsHistoryMapper.getMemberPointsHistoryVO(1, memberId); - variablePoint = memberPointsHistoryMapper.getMemberPointsHistoryVO(0, memberId); - - } else { - point = memberPointsHistoryMapper.getALLMemberPointsHistoryVO(0); - variablePoint = memberPointsHistoryMapper.getALLMemberPointsHistoryVO(1); + if (member != null) { + memberPointsHistoryVO.setPoint(member.getPoint()); + memberPointsHistoryVO.setTotalPoint(member.getTotalPoint()); + return memberPointsHistoryVO; } - memberPointsHistoryVO.setPoint(point == null ? 0 : point); - memberPointsHistoryVO.setVariablePoint(variablePoint == null ? 0 : variablePoint); - memberPointsHistoryVO.setVariablePoint(memberPointsHistoryVO.getPoint() - memberPointsHistoryVO.getVariablePoint()); - return memberPointsHistoryVO; + return new MemberPointsHistoryVO(); } + + @Override + public IPage MemberPointsHistoryList(PageVO page, String memberId, String memberName) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(CharSequenceUtil.isNotEmpty(memberId), MemberPointsHistory::getMemberId, memberId) + .like(CharSequenceUtil.isNotEmpty(memberName), MemberPointsHistory::getMemberName, memberName); + //如果排序为空,则默认创建时间倒序 + if (CharSequenceUtil.isEmpty(page.getSort())) { + page.setSort("createTime"); + page.setOrder("desc"); + } + return this.page(PageUtil.initPage(page), lambdaQueryWrapper); + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberReceiptServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberReceiptServiceImpl.java index 0a172585..c72395eb 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberReceiptServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberReceiptServiceImpl.java @@ -4,7 +4,6 @@ package cn.lili.modules.member.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.BeanUtil; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberReceipt; @@ -13,11 +12,11 @@ import cn.lili.modules.member.entity.vo.MemberReceiptVO; import cn.lili.modules.member.mapper.MemberReceiptMapper; import cn.lili.modules.member.service.MemberReceiptService; import cn.lili.modules.member.service.MemberService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,14 +28,12 @@ import java.util.List; * 会员发票业务层实现 * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberReceiptServiceImpl extends ServiceImpl implements MemberReceiptService { - - private final MemberService memberService; + @Autowired + private MemberService memberService; @Override public IPage getPage(MemberReceiptVO memberReceiptVO, PageVO pageVO) { @@ -44,13 +41,14 @@ public class MemberReceiptServiceImpl extends ServiceImpl receipts = this.baseMapper.selectList(new QueryWrapper() .eq("member_id", memberId) .eq("receipt_title", memberReceiptAddVO.getReceiptTitle()) ); - if (receipts.size() > 0) { + if (!receipts.isEmpty()) { throw new ServiceException(ResultCode.USER_RECEIPT_REPEAT_ERROR); } //参数封装 @@ -64,7 +62,7 @@ public class MemberReceiptServiceImpl extends ServiceImpl list = this.baseMapper.selectList(new QueryWrapper().eq("member_id", memberId)); //如果当前会员只有一个发票则默认为默认发票,反之需要校验参数默认值,做一些处理 - if (list.size() <= 0) { + if (list.isEmpty()) { memberReceipt.setIsDefault(1); } else { if (memberReceiptAddVO.getIsDefault().equals(1)) { @@ -82,6 +80,7 @@ public class MemberReceiptServiceImpl extends ServiceImpl 0) { + if (!receipts.isEmpty()) { throw new ServiceException(ResultCode.USER_RECEIPT_REPEAT_ERROR); } BeanUtil.copyProperties(memberReceiptAddVO, memberReceiptDb); diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java index 11f42aa3..21f19dee 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java @@ -1,91 +1,116 @@ package cn.lili.modules.member.serviceimpl; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.context.ThreadContextHolder; import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.SwitchEnum; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.MemberTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.token.Token; -import cn.lili.common.token.base.generate.MemberTokenGenerate; -import cn.lili.common.token.base.generate.StoreTokenGenerate; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; +import cn.lili.common.sensitive.SensitiveWordsFilter; import cn.lili.common.utils.*; import cn.lili.common.vo.PageVO; -import cn.lili.config.context.ThreadContextHolder; -import cn.lili.config.rocketmq.RocketmqCustomProperties; -import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.service.ConnectService; -import cn.lili.modules.connect.util.UuidUtils; -import cn.lili.modules.member.entity.aop.annotation.PointLogPoint; +import cn.lili.modules.member.aop.annotation.PointLogPoint; import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO; -import cn.lili.modules.member.entity.dto.MemberAddDTO; -import cn.lili.modules.member.entity.dto.MemberEditDTO; -import cn.lili.modules.member.entity.dto.MemberPointMessage; -import cn.lili.modules.member.entity.vo.MemberDistributionVO; +import cn.lili.modules.member.entity.dto.*; +import cn.lili.modules.member.entity.enums.PointTypeEnum; +import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum; import cn.lili.modules.member.entity.vo.MemberSearchVO; +import cn.lili.modules.member.entity.vo.MemberVO; +import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo; +import cn.lili.modules.member.entity.vo.QRLoginResultVo; import cn.lili.modules.member.mapper.MemberMapper; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.member.token.MemberTokenGenerate; +import cn.lili.modules.member.token.StoreTokenGenerate; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.enums.StoreStatusEnum; import cn.lili.modules.store.service.StoreService; -import cn.lili.modules.system.utils.CharacterConstant; -import cn.lili.modules.system.utils.SensitiveWordsFilter; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.MemberTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; /** * 会员接口业务层实现 * * @author Chopper - * @date 2021-03-29 14:10:16 + * @since 2021-03-29 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberServiceImpl extends ServiceImpl implements MemberService { - //会员数据处理层 - private final MemberMapper memberMapper; - //会员token + /** + * 会员token + */ + @Autowired private MemberTokenGenerate memberTokenGenerate; - //商家token + /** + * 商家token + */ + @Autowired private StoreTokenGenerate storeTokenGenerate; - //联合登录 + /** + * 联合登录 + */ + @Autowired private ConnectService connectService; + /** + * 店铺 + */ @Autowired private StoreService storeService; - //RocketMQ 配置 - private final RocketmqCustomProperties rocketmqCustomProperties; - //RocketMQ - private final RocketMQTemplate rocketMQTemplate; - //缓存 - private final Cache cache; + /** + * RocketMQ 配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + /** + * 缓存 + */ + @Autowired + private Cache cache; @Override public Member findByUsername(String userName) { - QueryWrapper queryWrapper = new QueryWrapper(); + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("username", userName); - return memberMapper.selectOne(queryWrapper); + return this.baseMapper.selectOne(queryWrapper); } @@ -99,10 +124,17 @@ public class MemberServiceImpl extends ServiceImpl impleme } @Override - public boolean findByMobile(String uuid, String mobile) { - QueryWrapper queryWrapper = new QueryWrapper(); + public Member findByMobile(String mobile) { + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mobile", mobile); - Member member = memberMapper.selectOne(queryWrapper); + return this.baseMapper.selectOne(queryWrapper); + } + + @Override + public boolean findByMobile(String uuid, String mobile) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mobile", mobile); + Member member = this.baseMapper.selectOne(queryWrapper); if (member == null) { throw new ServiceException(ResultCode.USER_NOT_PHONE); } @@ -113,7 +145,7 @@ public class MemberServiceImpl extends ServiceImpl impleme @Override public Token usernameLogin(String username, String password) { - Member member = this.findByUsername(username); + Member member = this.findMember(username); //判断用户是否存在 if (member == null || !member.getDisabled()) { throw new ServiceException(ResultCode.USER_NOT_EXIST); @@ -123,13 +155,39 @@ public class MemberServiceImpl extends ServiceImpl impleme throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); } loginBindUser(member); - return memberTokenGenerate.createToken(member.getUsername(), false); + return memberTokenGenerate.createToken(member, false); + } + + + @Override + public void resetPassword(List ids) { + String password = new BCryptPasswordEncoder().encode(StringUtils.md5("123456")); + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.in(Member::getId, ids); + lambdaUpdateWrapper.set(Member::getPassword, password); + this.update(lambdaUpdateWrapper); + } + + @Override + public void updateHaveShop(Boolean haveStore, String storeId, List memberIds) { + List members = this.baseMapper.selectBatchIds(memberIds); + if (members.size() > 0) { + members.forEach(member -> { + member.setHaveStore(haveStore); + if (haveStore) { + member.setStoreId(storeId); + } else { + member.setStoreId(null); + } + }); + this.updateBatchById(members); + } } @Override public Token usernameStoreLogin(String username, String password) { - Member member = this.findByUsername(username); + Member member = this.findMember(username); //判断用户是否存在 if (member == null || !member.getDisabled()) { throw new ServiceException(ResultCode.USER_NOT_EXIST); @@ -139,51 +197,79 @@ public class MemberServiceImpl extends ServiceImpl impleme throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); } //对店铺状态的判定处理 - if (member.getHaveStore()) { + return checkMemberStore(member); + } + + @Override + public Token mobilePhoneStoreLogin(String mobilePhone) { + Member member = this.findMember(mobilePhone); + //如果手机号不存在则自动注册用户 + if (member == null) { + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } + loginBindUser(member); + //对店铺状态的判定处理 + return checkMemberStore(member); + } + + private Token checkMemberStore(Member member) { + if (Boolean.TRUE.equals(member.getHaveStore())) { Store store = storeService.getById(member.getStoreId()); if (!store.getStoreDisable().equals(StoreStatusEnum.OPEN.name())) { - throw new ServiceException(ResultCode.USER_NOT_EXIST); + throw new ServiceException(ResultCode.STORE_CLOSE_ERROR); } } else { throw new ServiceException(ResultCode.USER_NOT_EXIST); } + return storeTokenGenerate.createToken(member, false); + } - return storeTokenGenerate.createToken(member.getUsername(), false); + /** + * 传递手机号或者用户名 + * + * @param userName 手机号或者用户名 + * @return 会员信息 + */ + private Member findMember(String userName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("username", userName).or().eq("mobile", userName); + return this.getOne(queryWrapper); } @Override - public Token autoRegister(ConnectAuthUser authUser) { + @Transactional + public Member autoRegister(ConnectAuthUser authUser) { - if (StringUtils.isEmpty(authUser.getNickname())) { + if (CharSequenceUtil.isEmpty(authUser.getNickname())) { authUser.setNickname("临时昵称"); } - if (StringUtils.isEmpty(authUser.getAvatar())) { + if (CharSequenceUtil.isEmpty(authUser.getAvatar())) { authUser.setAvatar("https://i.loli.net/2020/11/19/LyN6JF7zZRskdIe.png"); } try { - String username = UuidUtils.getUUID(); - Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(), - authUser.getGender() != null ? Integer.parseInt(authUser.getGender().getCode()) : 0); - //保存会员 - this.save(member); - Member loadMember = this.findByUsername(username); - //绑定登录方式 - loginBindUser(loadMember, authUser.getUuid(), authUser.getSource()); - return memberTokenGenerate.createToken(username, false); +// String username = UuidUtils.getUUID(); + Member member = new Member(authUser.getUsername(), UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(), + authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0,authUser.getPhone()); + member.setPassword(DEFAULT_PASSWORD); + // 发送会员注册信息 + registerHandler(member); + + return member; } catch (ServiceException e) { - log.error("自动注册服务泡出异常:", e); + log.error("自动注册服务抛出异常:", e); throw e; } catch (Exception e) { log.error("自动注册异常:", e); - throw new ServiceException("自动注册失败,请稍后重试"); + throw new ServiceException(ResultCode.USER_AUTO_REGISTER_ERROR); } } - @Override - public Token autoRegister() { - ConnectAuthUser connectAuthUser = this.checkConnectUser(); - return this.autoRegister(connectAuthUser); - } +// @Override +// @Transactional +// public Token autoRegister() { +// ConnectAuthUser connectAuthUser = this.checkConnectUser(); +// return this.autoRegister(connectAuthUser); +// } @Override public Token refreshToken(String refreshToken) { @@ -196,34 +282,51 @@ public class MemberServiceImpl extends ServiceImpl impleme } @Override + @Transactional public Token mobilePhoneLogin(String mobilePhone) { - QueryWrapper queryWrapper = new QueryWrapper(); + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mobile", mobilePhone); - Member member = memberMapper.selectOne(queryWrapper); + Member member = this.baseMapper.selectOne(queryWrapper); //如果手机号不存在则自动注册用户 if (member == null) { member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone); - //保存会员 - this.save(member); - String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name(); - rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback()); + registerHandler(member); } loginBindUser(member); - return memberTokenGenerate.createToken(member.getUsername(), false); + return memberTokenGenerate.createToken(member, false); + } + + /** + * 注册方法抽象 + * + * @param member + */ + @Transactional + public void registerHandler(Member member) { + member.setId(SnowFlake.getIdStr()); + //保存会员 + this.save(member); + + // 发送会员注册信息 + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("new member register", rocketmqCustomProperties.getMemberTopic(), + MemberTagsEnum.MEMBER_REGISTER.name(), member)); } @Override public Member editOwn(MemberEditDTO memberEditDTO) { //查询会员信息 - Member member = this.findByUsername(UserContext.getCurrentUser().getUsername()); + Member member = this.findByUsername(Objects.requireNonNull(UserContext.getCurrentUser()).getUsername()); //传递修改会员信息 BeanUtil.copyProperties(memberEditDTO, member); //修改会员 this.updateById(member); + String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_INFO_EDIT.name(); + //发送订单变更mq消息 + rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback()); return member; } - @Override + @DemoSite public Member modifyPass(String oldPassword, String newPassword) { AuthUser tokenUser = UserContext.getCurrentUser(); if (tokenUser == null) { @@ -243,28 +346,82 @@ public class MemberServiceImpl extends ServiceImpl impleme } @Override + public boolean canInitPass() { + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + Member member = this.getById(tokenUser.getId()); + return member.getPassword().equals(DEFAULT_PASSWORD); + + } + + @Override + public void initPass(String password) { + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + Member member = this.getById(tokenUser.getId()); + if (member.getPassword().equals(DEFAULT_PASSWORD)) { + //修改会员密码 + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(Member::getId, member.getId()); + lambdaUpdateWrapper.set(Member::getPassword, new BCryptPasswordEncoder().encode(password)); + this.update(lambdaUpdateWrapper); + } + throw new ServiceException(ResultCode.UNINITIALIZED_PASSWORD); + + } + + @Override + public void cancellation(String password) { + + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + Member member = this.getById(tokenUser.getId()); + if (member.getPassword().equals(new BCryptPasswordEncoder().encode(password))) { + //删除联合登录 + connectService.deleteByMemberId(member.getId()); + //混淆用户信息 + this.confusionMember(member); + } + } + + /** + * 混淆之前的会员信息 + * + * @param member + */ + private void confusionMember(Member member) { + member.setUsername(UuidUtils.getUUID()); + member.setMobile(UuidUtils.getUUID() + member.getMobile()); + member.setNickName("用户已注销"); + member.setDisabled(false); + this.updateById(member); + } + + @Override + @Transactional public Token register(String userName, String password, String mobilePhone) { //检测会员信息 checkMember(userName, mobilePhone); //设置会员信息 Member member = new Member(userName, new BCryptPasswordEncoder().encode(password), mobilePhone); //注册成功后用户自动登录 - if (this.save(member)) { - Token token = memberTokenGenerate.createToken(member.getUsername(), false); - String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name(); - rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback()); - return token; - } - return null; + registerHandler(member); + return memberTokenGenerate.createToken(member, false); } @Override public boolean changeMobile(String mobile) { - AuthUser tokenUser = UserContext.getCurrentUser(); + AuthUser tokenUser = Objects.requireNonNull(UserContext.getCurrentUser()); Member member = this.findByUsername(tokenUser.getUsername()); //判断是否用户登录并且会员ID为当前登录会员ID - if (tokenUser == null || tokenUser.getId() != member.getId()) { + if (!Objects.equals(tokenUser.getId(), member.getId())) { throw new ServiceException(ResultCode.USER_NOT_LOGIN); } //修改会员手机号 @@ -274,6 +431,15 @@ public class MemberServiceImpl extends ServiceImpl impleme return this.update(lambdaUpdateWrapper); } + @Override + public boolean changeMobile(String memberId, String mobile) { + //修改会员手机号 + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(Member::getId, memberId); + lambdaUpdateWrapper.set(Member::getMobile, mobile); + return this.update(lambdaUpdateWrapper); + } + @Override public boolean resetByMobile(String uuid, String password) { String phone = cache.get(CachePrefix.FIND_MOBILE + uuid).toString(); @@ -283,6 +449,7 @@ public class MemberServiceImpl extends ServiceImpl impleme LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.eq(Member::getMobile, phone); lambdaUpdateWrapper.set(Member::getPassword, new BCryptPasswordEncoder().encode(password)); + cache.remove(CachePrefix.FIND_MOBILE + uuid); return this.update(lambdaUpdateWrapper); } else { throw new ServiceException(ResultCode.USER_PHONE_NOT_EXIST); @@ -291,85 +458,85 @@ public class MemberServiceImpl extends ServiceImpl impleme } @Override + @Transactional public Member addMember(MemberAddDTO memberAddDTO) { //检测会员信息 checkMember(memberAddDTO.getUsername(), memberAddDTO.getMobile()); //添加会员 - Member member = new Member(memberAddDTO.getUsername(), memberAddDTO.getPassword(), memberAddDTO.getMobile()); - if (this.save(member)) { - String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name(); - rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback()); - return member; - } - throw new ServiceException(ResultCode.ERROR); + Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), + memberAddDTO.getMobile()); + registerHandler(member); + return member; } @Override public Member updateMember(ManagerMemberEditDTO managerMemberEditDTO) { - //判断是否用户登录并且会员ID为当前登录会员ID - AuthUser tokenUser = UserContext.getCurrentUser(); - if (tokenUser == null) { - throw new ServiceException(ResultCode.USER_NOT_LOGIN); - } //过滤会员昵称敏感词 - if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(managerMemberEditDTO.getNickName())) { - managerMemberEditDTO.setNickName(SensitiveWordsFilter.filter(managerMemberEditDTO.getNickName(), CharacterConstant.WILDCARD_STAR)); + if (CharSequenceUtil.isNotBlank(managerMemberEditDTO.getNickName())) { + managerMemberEditDTO.setNickName(SensitiveWordsFilter.filter(managerMemberEditDTO.getNickName())); } //如果密码不为空则加密密码 - if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(managerMemberEditDTO.getPassword())) { + if (CharSequenceUtil.isNotBlank(managerMemberEditDTO.getPassword())) { managerMemberEditDTO.setPassword(new BCryptPasswordEncoder().encode(managerMemberEditDTO.getPassword())); } //查询会员信息 - Member member = this.findByUsername(managerMemberEditDTO.getUsername()); + Member member = this.getById(managerMemberEditDTO.getId()); //传递修改会员信息 BeanUtil.copyProperties(managerMemberEditDTO, member); - if (this.updateById(member)) { - return member; - } - throw new ServiceException(ResultCode.ERROR); + this.updateById(member); + return member; } @Override - public IPage getMemberPage(MemberSearchVO memberSearchVO, PageVO page) { + public IPage getMemberPage(MemberSearchVO memberSearchVO, PageVO page) { QueryWrapper queryWrapper = Wrappers.query(); //用户名查询 - queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername()); + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername()); //用户名查询 - queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName()); + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName()); //按照电话号码查询 - queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile()); + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile()); //按照会员状态查询 - queryWrapper.eq(StringUtils.isNotBlank(memberSearchVO.getDisabled()), "disabled", - memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name())?1:0); + queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled", + memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0); queryWrapper.orderByDesc("create_time"); - return this.page(PageUtil.initPage(page), queryWrapper); + return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper); } @Override @PointLogPoint - public Boolean updateMemberPoint(Long point, Integer type, String memberId, String content) { + @Transactional(rollbackFor = Exception.class) + public Boolean updateMemberPoint(Long point, String type, String memberId, String content) { //获取当前会员信息 Member member = this.getById(memberId); if (member != null) { //积分变动后的会员积分 long currentPoint; - if (type == 1) { - currentPoint = CurrencyUtil.add(member.getPoint(), point).longValue(); - } else { - currentPoint = CurrencyUtil.sub(member.getPoint(), point) < 0 ? 0 : new Double(CurrencyUtil.sub(member.getPoint(), point)).longValue(); + //会员总获得积分 + long totalPoint = member.getTotalPoint(); + //如果增加积分 + if (type.equals(PointTypeEnum.INCREASE.name())) { + currentPoint = member.getPoint() + point; + //如果是增加积分 需要增加总获得积分 + totalPoint = totalPoint + point; + } + //否则扣除积分 + else { + currentPoint = member.getPoint() - point < 0 ? 0 : member.getPoint() - point; } member.setPoint(currentPoint); - Boolean result = this.updateById(member); + member.setTotalPoint(totalPoint); + boolean result = this.updateById(member); if (result) { //发送会员消息 MemberPointMessage memberPointMessage = new MemberPointMessage(); memberPointMessage.setPoint(point); memberPointMessage.setType(type); memberPointMessage.setMemberId(memberId); - String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_POINT_CHANGE.name(); - rocketMQTemplate.asyncSend(destination, memberPointMessage, RocketmqSendCallbackBuilder.commonCallback()); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("update member point", + rocketmqCustomProperties.getMemberTopic(), MemberTagsEnum.MEMBER_POINT_CHANGE.name(), memberPointMessage)); return true; } return false; @@ -378,32 +545,30 @@ public class MemberServiceImpl extends ServiceImpl impleme throw new ServiceException(ResultCode.USER_NOT_EXIST); } - @Override public Boolean updateMemberStatus(List memberIds, Boolean status) { UpdateWrapper updateWrapper = Wrappers.update(); updateWrapper.set("disabled", status); updateWrapper.in("id", memberIds); + //如果是禁用 + if (Boolean.FALSE.equals(status)) { + disableMemberLogout(memberIds); + } return this.update(updateWrapper); } - @Override - public List distribution() { - List memberDistributionVOS = memberMapper.distribution(); - return memberDistributionVOS; - } - /** * 根据手机号获取会员 * * @param mobilePhone 手机号 * @return 会员 */ - private Member findByPhone(String mobilePhone) { - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("mobile", mobilePhone); - return memberMapper.selectOne(queryWrapper); + private Long findMember(String mobilePhone, String userName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mobile", mobilePhone) + .or().eq("username", userName); + return this.baseMapper.selectCount(queryWrapper); } /** @@ -411,7 +576,7 @@ public class MemberServiceImpl extends ServiceImpl impleme * * @param uuid uuid * @param type 状态 - * @return + * @return cookie中的联合登录对象 */ private ConnectAuthUser getConnectAuthUser(String uuid, String type) { Object context = cache.get(ConnectService.cacheKey(type, uuid)); @@ -421,24 +586,6 @@ public class MemberServiceImpl extends ServiceImpl impleme return null; } - /** - * 成功登录,则检测cookie中的信息,进行会员绑定 - * - * @param member 会员 - * @param unionId unionId - * @param type 状态 - */ - private void loginBindUser(Member member, String unionId, String type) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Connect::getUnionId, unionId); - queryWrapper.eq(Connect::getUnionType, type); - Connect connect = connectService.getOne(queryWrapper); - if (connect == null) { - connect = new Connect(member.getId(), unionId, type); - connectService.save(connect); - } - } - /** * 成功登录,则检测cookie中的信息,进行会员绑定 * @@ -449,18 +596,16 @@ public class MemberServiceImpl extends ServiceImpl impleme String uuid = CookieUtil.getCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpRequest()); String connectType = CookieUtil.getCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpRequest()); //如果联合登陆存储了信息 - if (StringUtils.isNotEmpty(uuid) && StringUtils.isNotEmpty(connectType)) { + if (CharSequenceUtil.isNotEmpty(uuid) && CharSequenceUtil.isNotEmpty(connectType)) { try { //获取信息 ConnectAuthUser connectAuthUser = getConnectAuthUser(uuid, connectType); if (connectAuthUser == null) { return; } - //检测是否已经绑定过用户 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Connect::getUnionId, connectAuthUser.getUuid()); - queryWrapper.eq(Connect::getUnionType, connectType); - Connect connect = connectService.getOne(queryWrapper); + Connect connect = connectService.queryConnect( + ConnectQueryDTO.builder().unionId(connectAuthUser.getUuid()).unionType(connectType).build() + ); if (connect == null) { connect = new Connect(member.getId(), connectAuthUser.getUuid(), connectType); connectService.save(connect); @@ -479,59 +624,209 @@ public class MemberServiceImpl extends ServiceImpl impleme } +// /** +// * 检测是否可以绑定第三方联合登陆 +// * 返回null原因 +// * 包含原因1:redis中已经没有联合登陆信息 2:已绑定其他账号 +// * +// * @return 返回对象则代表可以进行绑定第三方会员,返回null则表示联合登陆无法继续 +// */ +// private ConnectAuthUser checkConnectUser() { +// //获取cookie存储的信息 +// String uuid = CookieUtil.getCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpRequest()); +// String connectType = CookieUtil.getCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpRequest()); +// +// //如果联合登陆存储了信息 +// if (CharSequenceUtil.isNotEmpty(uuid) && CharSequenceUtil.isNotEmpty(connectType)) { +// //枚举 联合登陆类型获取 +// ConnectAuthEnum authInterface = ConnectAuthEnum.valueOf(connectType); +// +// ConnectAuthUser connectAuthUser = getConnectAuthUser(uuid, connectType); +// if (connectAuthUser == null) { +// throw new ServiceException(ResultCode.USER_OVERDUE_CONNECT_ERROR); +// } +// //检测是否已经绑定过用户 +// Connect connect = connectService.queryConnect( +// ConnectQueryDTO.builder().unionType(connectType).unionId(connectAuthUser.getUuid()).build() +// ); +// //没有关联则返回true,表示可以继续绑定 +// if (connect == null) { +// connectAuthUser.setConnectEnum(authInterface); +// return connectAuthUser; +// } else { +// throw new ServiceException(ResultCode.USER_CONNECT_BANDING_ERROR); +// } +// } else { +// throw new ServiceException(ResultCode.USER_CONNECT_NOT_EXIST_ERROR); +// } +// } + + @Override + public long getMemberNum(MemberSearchVO memberSearchVO) { + QueryWrapper queryWrapper = Wrappers.query(); + //用户名查询 + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername()); + //按照电话号码查询 + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile()); + //按照状态查询 + queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled", + memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0); + queryWrapper.orderByDesc("create_time"); + return this.count(queryWrapper); + } + /** - * 检测是否可以绑定第三方联合登陆 - * 返回null原因 - * 包含原因1:redis中已经没有联合登陆信息 2:已绑定其他账号 + * 获取指定会员数据 * - * @return 返回对象则代表可以进行绑定第三方会员,返回null则表示联合登陆无法继续 + * @param columns 指定获取的列 + * @param memberIds 会员ids + * @return 指定会员数据 */ - private ConnectAuthUser checkConnectUser() { - //获取cookie存储的信息 - String uuid = CookieUtil.getCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpRequest()); - String connectType = CookieUtil.getCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpRequest()); + @Override + public List> listFieldsByMemberIds(String columns, List memberIds) { + return this.listMaps(new QueryWrapper() + .select(columns) + .in(memberIds != null && !memberIds.isEmpty(), "id", memberIds)); + } - //如果联合登陆存储了信息 - if (StringUtils.isNotEmpty(uuid) && StringUtils.isNotEmpty(connectType)) { - try { - //枚举 联合登陆类型获取 - ConnectAuthEnum authInterface = ConnectAuthEnum.valueOf(connectType); + /** + * 登出 + */ + @Override + public void logout(UserEnums userEnums) { + String currentUserToken = UserContext.getCurrentUserToken(); - ConnectAuthUser connectAuthUser = getConnectAuthUser(uuid, connectType); - if (connectAuthUser == null) { - throw new ServiceException("授权信息已过期,请从新授权/登录"); - } - //检测是否已经绑定过用户 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Connect::getUnionId, connectAuthUser.getUuid()); - queryWrapper.eq(Connect::getUnionType, connectType); - Connect connect = connectService.getOne(queryWrapper); - //没有关联则返回true,表示可以继续绑定 - if (connect == null) { - connectAuthUser.setConnectEnum(authInterface); - return connectAuthUser; - } else { - throw new ServiceException("当前联合登陆方式,已绑定其他账号,需进行解绑操作"); - } - } catch (Exception e) { - throw e; - } - } else { - throw new ServiceException("暂无联合登陆信息,无法实现一键注册功能,请点击第三方登录进行授权"); + AuthUser authUser = UserContext.getAuthUser(currentUserToken); + + if (CharSequenceUtil.isNotEmpty(currentUserToken)) { + cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums, authUser.getId()) + currentUserToken); + cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) ); } } @Override - public Integer getMemberNum(MemberSearchVO memberSearchVO) { - QueryWrapper queryWrapper = Wrappers.query(); - //用户名查询 - queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername()); - //按照电话号码查询 - queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile()); - //按照电话号码查询 - queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getDisabled()), "disabled", memberSearchVO.getDisabled()); - queryWrapper.orderByDesc("create_time"); - return this.count(queryWrapper); + public void logout(String userId) { + + cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MANAGER, userId)); + cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MANAGER, userId)); + } + + /** + * 禁用会员会员token删除 + * + * @param memberIds 会员id + */ + public void disableMemberLogout(List memberIds) { + if (memberIds != null) { + memberIds.forEach(memberId -> { + cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER, memberId)); + cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MEMBER, memberId)); + }); + } + } + + /** + * 获取所有会员的手机号 + * + * @return 所有会员的手机号 + */ + @Override + public List getAllMemberMobile() { + return this.baseMapper.getAllMemberMobile(); + } + + /** + * 更新会员登录时间为最新时间 + * + * @param memberId 会员id + * @return 是否更新成功 + */ + @Override + public boolean updateMemberLoginTime(String memberId) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Member::getId, memberId); + updateWrapper.set(Member::getLastLoginDate, new Date()); + return this.update(updateWrapper); + } + + @Override + public MemberVO getMember(String id) { + return new MemberVO(this.getById(id)); + } + + @Override + public QRCodeLoginSessionVo createPcSession() { + QRCodeLoginSessionVo session = new QRCodeLoginSessionVo(); + session.setStatus(QRCodeLoginSessionStatusEnum.WAIT_SCANNING.getCode()); + //过期时间,20s + Long duration = 20 * 1000L; + session.setDuration(duration); + String token = CachePrefix.QR_CODE_LOGIN_SESSION.name() + SnowFlake.getIdStr(); + session.setToken(token); + cache.put(token, session, duration, TimeUnit.MILLISECONDS); + return session; + } + + @Override + public Object appScanner(String token) { + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(token); + if (session == null) { + return QRCodeLoginSessionStatusEnum.NO_EXIST.getCode(); + } + session.setStatus(QRCodeLoginSessionStatusEnum.SCANNING.getCode()); + cache.put(token, session, session.getDuration(), TimeUnit.MILLISECONDS); + return QRCodeLoginSessionStatusEnum.SCANNING.getCode(); + } + + @Override + public boolean appSConfirm(String token, Integer code) { + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(token); + if (session == null) { + return false; + } + if (code == 1) { + //同意 + session.setStatus(QRCodeLoginSessionStatusEnum.VERIFIED.getCode()); + session.setUserId(Long.parseLong(tokenUser.getId())); + } else { + //拒绝 + session.setStatus(QRCodeLoginSessionStatusEnum.CANCELED.getCode()); + } + cache.put(token, session, session.getDuration(), TimeUnit.MILLISECONDS); + return true; + } + + @Override + public QRLoginResultVo loginWithSession(String sessionToken) { + QRLoginResultVo result = new QRLoginResultVo(); + result.setStatus(QRCodeLoginSessionStatusEnum.NO_EXIST.getCode()); + QRCodeLoginSessionVo session = (QRCodeLoginSessionVo) cache.get(sessionToken); + if (session == null) { + return result; + } + result.setStatus(session.getStatus()); + if (QRCodeLoginSessionStatusEnum.VERIFIED.getCode().equals(session.getStatus())) { + //生成token + Member member = this.getById(session.getUserId()); + if (member == null) { + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } else { + //生成token + Token token = memberTokenGenerate.createToken(member, false); + result.setToken(token); + cache.vagueDel(sessionToken); + } + + } + return result; } /** @@ -541,28 +836,9 @@ public class MemberServiceImpl extends ServiceImpl impleme * @param mobilePhone 手机号 */ private void checkMember(String userName, String mobilePhone) { - //判断用户名是否存在 - if (findByUsername(userName) != null) { - throw new ServiceException(ResultCode.USER_NAME_EXIST); - } //判断手机号是否存在 - if (findByPhone(mobilePhone) != null) { - throw new ServiceException(ResultCode.USER_PHONE_EXIST); + if (findMember(mobilePhone, userName) > 0) { + throw new ServiceException(ResultCode.USER_EXIST); } } - - @Autowired - public void setConnectService(ConnectService connectService) { - this.connectService = connectService; - } - - @Autowired - public void setMemberTokenGenerate(MemberTokenGenerate memberTokenGenerate) { - this.memberTokenGenerate = memberTokenGenerate; - } - - @Autowired - public void setStoreTokenGenerate(StoreTokenGenerate storeTokenGenerate) { - this.storeTokenGenerate = storeTokenGenerate; - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java index bbca303c..9ec42910 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java @@ -1,94 +1,104 @@ package cn.lili.modules.member.serviceimpl; +import cn.hutool.core.util.ObjectUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.MemberTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.CurrencyUtil; import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.MemberSign; +import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.mapper.MemberSignMapper; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberSignService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.PointSetting; +import cn.lili.modules.system.entity.dto.PointSettingItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.MemberTagsEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.Date; import java.util.List; -import java.util.Map; /** * 会员签到业务层实现 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberSignServiceImpl extends ServiceImpl implements MemberSignService { - //会员签到 - private final MemberSignMapper memberSignMapper; - //RocketMQ - private final RocketMQTemplate rocketMQTemplate; - //RocketMQ 配置 - private final RocketmqCustomProperties rocketmqCustomProperties; - //配置 - private final SettingService settingService; - //会员 - private final MemberService memberService; + /** + * RocketMQ + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * RocketMQ 配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + /** + * 配置 + */ + @Autowired + private SettingService settingService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; @Override public Boolean memberSign() { //获取当前会员信息 AuthUser authUser = UserContext.getCurrentUser(); - if (authUser != null) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("member_id",authUser.getId()); - queryWrapper.between("create_time",new Date(DateUtil.startOfTodDay()*1000),DateUtil.getCurrentDayEndTime()); - //校验今天是否已经签到 - List todaySigns = memberSignMapper.getTodayMemberSign(queryWrapper); - if (todaySigns.size() > 0) { + if (ObjectUtil.isNotNull(authUser)) { + //获取当前用户当日签到日信息 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MemberSign::getMemberId, authUser.getId()); + queryWrapper.eq(MemberSign::getDay,DateUtil.getDayOfStart().intValue()); + List signSize = this.baseMapper.getTodayMemberSign(queryWrapper); + //当日签到信息不为空 + if (!signSize.isEmpty()) { throw new ServiceException(ResultCode.MEMBER_SIGN_REPEAT); } //当前签到天数的前一天日期 - List signs = memberSignMapper.getBeforeMemberSign(authUser.getId()); + List signs = this.baseMapper.getBeforeMemberSign(authUser.getId()); //构建参数 MemberSign memberSign = new MemberSign(); memberSign.setMemberId(authUser.getId()); memberSign.setMemberName(authUser.getUsername()); //如果size大于0 说明昨天已经签到过,获取昨天的签到数,反之新签到 - if (signs.size() > 0) { + if (!signs.isEmpty()) { //截止目前为止 签到总天数 不带今天 Integer signDay = signs.get(0).getSignDay(); memberSign.setSignDay(CurrencyUtil.add(signDay, 1).intValue()); } else { memberSign.setSignDay(1); } - Integer result = memberSignMapper.insert(memberSign); - //签到成功后发送消息赠送积分 - if (result > 0) { + + memberSign.setDay(DateUtil.getDayOfStart().intValue()); + try { + this.baseMapper.insert(memberSign); + //签到成功后发送消息赠送积分 String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_SING.name(); rocketMQTemplate.asyncSend(destination, memberSign, RocketmqSendCallbackBuilder.commonCallback()); return true; + } catch (Exception e) { + throw new ServiceException(ResultCode.MEMBER_SIGN_REPEAT); } - return false; } throw new ServiceException(ResultCode.USER_NOT_LOGIN); } @@ -98,7 +108,7 @@ public class MemberSignServiceImpl extends ServiceImpl pointSettingItems = pointSetting.getPointSettingItems(); + if (!pointSettingItems.isEmpty()) { + for (PointSettingItem item : pointSettingItems) { + if (item.getDay().equals(day)) { + point = item.getPoint().longValue(); content = "会员连续签到" + day + "天,赠送积分" + point + "分"; } } } //如果他不处于连续赠送阶段,则只赠送签到积分数 - if (point == -1 && pointSetting.getSignIn() != null) { + if (point == null && pointSetting.getSignIn() != null) { point = Long.valueOf(pointSetting.getSignIn().toString()); content = "会员签到第" + day + "天,赠送积分" + point + "分"; } //赠送会员积分 - memberService.updateMemberPoint(point, 1, memberId, content); + memberService.updateMemberPoint(point, PointTypeEnum.INCREASE.name(), memberId, content); } } catch (Exception e) { - e.printStackTrace(); + log.error("会员签到错误", e); } } diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberWalletServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberWalletServiceImpl.java deleted file mode 100644 index 1e461cf1..00000000 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberWalletServiceImpl.java +++ /dev/null @@ -1,277 +0,0 @@ -package cn.lili.modules.member.serviceimpl; - - -import cn.lili.common.enums.ResultCode; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.security.AuthUser; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.SnowFlake; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.entity.dos.MemberWallet; -import cn.lili.modules.member.entity.dos.MemberWithdrawApply; -import cn.lili.modules.member.entity.enums.WithdrawStatusEnum; -import cn.lili.modules.member.entity.vo.MemberWalletVO; -import cn.lili.modules.member.mapper.MemberWalletMapper; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.member.service.MemberWalletService; -import cn.lili.modules.member.service.MemberWithdrawApplyService; -import cn.lili.modules.order.trade.entity.dos.WalletLog; -import cn.lili.modules.order.trade.entity.enums.DepositServiceTypeEnum; -import cn.lili.modules.order.trade.service.WalletLogService; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.WithdrawalSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Date; - - -/** - * 会员预存款业务层实现 - * - * @author pikachu - * @date 2020-02-25 14:10:16 - */ -@Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MemberWalletServiceImpl extends ServiceImpl implements MemberWalletService { - - //预存款数据层 - private final MemberWalletMapper walletMapper; - //预存款日志 - private final WalletLogService walletLogService; - //设置 - private final SettingService settingService; - //会员 - private final MemberService memberService; - //会员提现申请 - private MemberWithdrawApplyService memberWithdrawApplyService; - - @Override - public MemberWalletVO getMemberWallet(String memberId) { - //构建查询条件 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("member_id", memberId); - //执行查询 - MemberWallet memberWallet = this.walletMapper.selectOne(queryWrapper); - //如果没有钱包,则创建钱包 - if (memberWallet == null) { - memberWallet = this.save(memberId, memberService.getById(memberId).getUsername()); - } - //返回查询数据 - return new MemberWalletVO(memberWallet.getMemberWallet(), memberWallet.getMemberFrozenWallet()); - } - - @Override - public Boolean increaseWithdrawal(Double money, String memberId, String detail, String serviceType) { - //检测会员预存款讯息是否存在,如果不存在则新建 - MemberWallet memberWallet = this.checkMemberWallet(memberId); - //余额变动 - memberWallet.setMemberWallet(CurrencyUtil.add(memberWallet.getMemberWallet(), money)); - memberWallet.setMemberFrozenWallet(CurrencyUtil.sub(memberWallet.getMemberFrozenWallet(), money)); - this.walletMapper.updateById(memberWallet); - //新增预存款日志 - WalletLog walletLog = new WalletLog(memberWallet.getMemberId(), memberWallet.getMemberName(), money, detail, serviceType); - walletLogService.save(walletLog); - return true; - } - - @Override - public Boolean increase(Double money, String memberId, String detail, String serviceType) { - //检测会员预存款讯息是否存在,如果不存在则新建 - MemberWallet memberWallet = this.checkMemberWallet(memberId); - //新增预存款 - memberWallet.setMemberWallet(CurrencyUtil.add(memberWallet.getMemberWallet(), money)); - this.walletMapper.updateById(memberWallet); - //新增预存款日志 - WalletLog walletLog = new WalletLog(memberWallet.getMemberId(), memberWallet.getMemberName(), money, detail, serviceType); - walletLogService.save(walletLog); - return true; - } - - - @Override - public Boolean reduce(Double money, String memberId, String detail, String serviceType) { - //检测会员预存款讯息是否存在,如果不存在则新建 - MemberWallet memberWallet = this.checkMemberWallet(memberId); - //减少预存款,需要校验 如果不够扣减预存款 - if (0 > CurrencyUtil.sub(memberWallet.getMemberWallet(), money)) { - return false; - } - memberWallet.setMemberWallet(CurrencyUtil.sub(memberWallet.getMemberWallet(), money)); - //保存记录 - this.walletMapper.updateById(memberWallet); - //新增预存款日志 - WalletLog walletLog = new WalletLog(memberWallet.getMemberId(), memberWallet.getMemberName(), -money, detail, serviceType); - walletLogService.save(walletLog); - return true; - } - - - @Override - public Boolean reduceWithdrawal(Double money, String memberId, String detail, String serviceType) { - //检测会员预存款讯息是否存在,如果不存在则新建 - MemberWallet memberWallet = this.checkMemberWallet(memberId); - //减少预存款,需要校验 如果不够扣减预存款 - if (0 > CurrencyUtil.sub(memberWallet.getMemberWallet(), money)) { - throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_INSUFFICIENT); - } - memberWallet.setMemberWallet(CurrencyUtil.sub(memberWallet.getMemberWallet(), money)); - memberWallet.setMemberFrozenWallet(CurrencyUtil.add(memberWallet.getMemberFrozenWallet(), money)); - //修改余额 - this.walletMapper.updateById(memberWallet); - //新增预存款日志 - WalletLog walletLog = new WalletLog(memberWallet.getMemberId(), memberWallet.getMemberName(), -money, detail, serviceType); - walletLogService.save(walletLog); - return true; - - } - - @Override - public Boolean reduceFrozen(Double money, String memberId, String detail, String serviceType) { - //检测会员预存款讯息是否存在,如果不存在则新建 - MemberWallet memberWallet = this.checkMemberWallet(memberId); - //校验此金额是否超过冻结金额 - if (0 > CurrencyUtil.sub(memberWallet.getMemberWallet(), money)) { - throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_INSUFFICIENT); - } - memberWallet.setMemberWallet(CurrencyUtil.sub(memberWallet.getMemberWallet(), money)); - this.walletMapper.updateById(memberWallet); - //新增预存款日志 - WalletLog walletLog = new WalletLog(memberWallet.getMemberId(), memberWallet.getMemberName(), -money, "提现金额已冻结,审核通过提现成功", serviceType); - walletLogService.save(walletLog); - return true; - } - - /** - * 检测会员预存款是否存在,如果不存在则新建 - * - * @param memberId 会员id - */ - private MemberWallet checkMemberWallet(String memberId) { - //获取会员预存款信息 - MemberWallet memberWallet = this.walletMapper.selectOne(new QueryWrapper().eq("member_id", memberId)); - //如果会员预存款信息不存在则同步重新建立预存款信息 - if (memberWallet == null) { - Member member = memberService.getById(memberId); - if (member != null) { - memberWallet = this.save(memberId, member.getUsername()); - } else { - throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); - } - } - return memberWallet; - } - - @Override - public void setMemberWalletPassword(Member member, String password) { - //对密码进行加密 - String pwd = new BCryptPasswordEncoder().encode(password); - //校验会员预存款是否存在 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("member_id", member.getId()); - MemberWallet memberWallet = this.walletMapper.selectOne(queryWrapper); - //如果 预存款信息不为空 执行设置密码 - if (memberWallet != null) { - memberWallet.setWalletPassword(pwd); - this.walletMapper.updateById(memberWallet); - } - } - - - @Override - public Boolean checkPassword() { - //获取当前登录会员 - AuthUser authUser = UserContext.getCurrentUser(); - //构建查询条件 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("member_id", authUser.getId()); - MemberWallet wallet = this.walletMapper.selectOne(queryWrapper); - return wallet != null && !StringUtils.isEmpty(wallet.getWalletPassword()); - } - - @Override - public MemberWallet save(String memberId, String memberName) { - MemberWallet memberWallet = new MemberWallet(); - memberWallet.setMemberId(memberId); - memberWallet.setMemberName(memberName); - memberWallet.setMemberWallet(0D); - memberWallet.setMemberFrozenWallet(0D); - this.walletMapper.insert(memberWallet); - return memberWallet; - } - - /** - * 提现方法 - * 1、先执行平台逻辑,平台逻辑成功后扣减第三方余额,顺序问题为了防止第三方提现成功,平台逻辑失败导致第三方零钱已提现,而我们商城余额未扣减 - * 2、如果余额扣减失败 则抛出异常,事务回滚 - * - * @param price 提现金额 - * @return - */ - @Override - public Boolean applyWithdrawal(Double price) { - AuthUser authUser = UserContext.getCurrentUser(); - //构建审核参数 - MemberWithdrawApply memberWithdrawApply = new MemberWithdrawApply(); - memberWithdrawApply.setMemberId(authUser.getId()); - memberWithdrawApply.setMemberName(authUser.getNickName()); - memberWithdrawApply.setApplyMoney(price); - memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.APPLY.name()); - memberWithdrawApply.setSn("W" + SnowFlake.getId()); - //校验该次提现是否需要审核,如果未进行配置 默认是需要审核 - Setting setting = settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()); - if (setting != null) { - //如果不需要审核则审核自动通过 - WithdrawalSetting withdrawalSetting = new Gson().fromJson(setting.getSettingValue(), WithdrawalSetting.class); - if (!withdrawalSetting.getApply()) { - memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.VIA_AUDITING.name()); - memberWithdrawApply.setInspectRemark("系统自动审核通过"); - //校验金额是否满足提现,因为是从余额扣减,所以校验的是余额 - MemberWalletVO memberWalletVO = this.getMemberWallet(memberWithdrawApply.getMemberId()); - if (memberWalletVO.getMemberWallet() < price) { - throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_INSUFFICIENT); - } - //微信零钱提现 - Boolean result = withdrawal(memberWithdrawApply); - if (result) { - this.reduce(price, authUser.getId(), "余额提现成功", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name()); - } - } else { - //扣减余额到冻结金额 - this.reduceWithdrawal(price, authUser.getId(), "提现金额已冻结,审核成功后到账", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name()); - } - } - return memberWithdrawApplyService.save(memberWithdrawApply); - } - - @Override - public Boolean withdrawal(MemberWithdrawApply memberWithdrawApply) { - memberWithdrawApply.setInspectTime(new Date()); - //保存或者修改零钱提现 - this.memberWithdrawApplyService.saveOrUpdate(memberWithdrawApply); - //TODO 调用自动提现接口 - boolean result = true; - //如果微信提现失败 则抛出异常 回滚数据 - if (!result) { - throw new ServiceException(ResultCode.WALLET_ERROR_INSUFFICIENT); - } - return result; - } - - @Autowired - public void setMemberWithdrawApplyService(MemberWithdrawApplyService memberWithdrawApplyService) { - this.memberWithdrawApplyService = memberWithdrawApplyService; - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreClerkRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreClerkRoleServiceImpl.java new file mode 100644 index 00000000..a37b6f7a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreClerkRoleServiceImpl.java @@ -0,0 +1,52 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.modules.member.entity.dos.StoreClerkRole; +import cn.lili.modules.member.mapper.StoreClerkRoleMapper; +import cn.lili.modules.member.service.StoreClerkRoleService; +import cn.lili.modules.permission.entity.dos.UserRole; +import cn.lili.modules.permission.mapper.UserRoleMapper; +import cn.lili.modules.permission.service.UserRoleService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用户权限业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:52 下午 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreClerkRoleServiceImpl extends ServiceImpl implements StoreClerkRoleService { + + @Override + public List listByUserId(String clerkId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("clerk_id", clerkId); + return this.baseMapper.selectList(queryWrapper); + } + + @Override + public List listId(String clerkId) { + List userRoleList = this.listByUserId(clerkId); + List strings = new ArrayList<>(); + userRoleList.forEach(item -> strings.add(item.getRoleId())); + return strings; + } + + @Override + public void updateClerkRole(String clerkId, List storeClerkRoles) { + //删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("clerk_id", clerkId); + this.remove(queryWrapper); + //保存 + this.saveBatch(storeClerkRoles); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreCollectionServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreCollectionServiceImpl.java index 52859312..4b450d6c 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreCollectionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreCollectionServiceImpl.java @@ -3,17 +3,18 @@ package cn.lili.modules.member.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dos.StoreCollection; +import cn.lili.modules.member.entity.dto.CollectionDTO; import cn.lili.modules.member.entity.vo.StoreCollectionVO; import cn.lili.modules.member.mapper.StoreCollectionMapper; import cn.lili.modules.member.service.StoreCollectionService; +import cn.lili.modules.store.service.StoreService; +import cn.lili.mybatis.util.PageUtil; 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.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,48 +25,52 @@ import java.util.Optional; * 会员店铺收藏业务层实现 * * @author Chopper - * @date 2020/11/18 2:52 下午 + * @since 2020/11/18 2:52 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreCollectionServiceImpl extends ServiceImpl implements StoreCollectionService { - private final StoreCollectionMapper storeCollectionMapper; + + @Autowired + private StoreService storeService; @Override public IPage storeCollection(PageVO pageVo) { - QueryWrapper queryWrapper = new QueryWrapper(); + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("sc.member_id", UserContext.getCurrentUser().getId()); queryWrapper.orderByDesc("sc.create_time"); - return storeCollectionMapper.storeCollectionVOList(PageUtil.initPage(pageVo), queryWrapper); + return this.baseMapper.storeCollectionVOList(PageUtil.initPage(pageVo), queryWrapper); } @Override public boolean isCollection(String storeId) { - QueryWrapper queryWrapper = new QueryWrapper(); + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("member_id", UserContext.getCurrentUser().getId()); queryWrapper.eq("store_id", storeId); - return Optional.ofNullable(this.getOne(queryWrapper)).isPresent(); + return Optional.ofNullable(this.getOne(queryWrapper, false)).isPresent(); } @Override + @Transactional(rollbackFor = Exception.class) public StoreCollection addStoreCollection(String storeId) { if (this.getOne(new LambdaUpdateWrapper() .eq(StoreCollection::getMemberId, UserContext.getCurrentUser().getId()) .eq(StoreCollection::getStoreId, storeId)) == null) { StoreCollection storeCollection = new StoreCollection(UserContext.getCurrentUser().getId(), storeId); this.save(storeCollection); + storeService.updateStoreCollectionNum(new CollectionDTO(storeId, 1)); return storeCollection; } throw new ServiceException(ResultCode.USER_COLLECTION_EXIST); } @Override + @Transactional(rollbackFor = Exception.class) public boolean deleteStoreCollection(String storeId) { - QueryWrapper queryWrapper = new QueryWrapper(); + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("member_id", UserContext.getCurrentUser().getId()); queryWrapper.eq("store_id", storeId); + storeService.updateStoreCollectionNum(new CollectionDTO(storeId, -1)); return this.remove(queryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentRoleServiceImpl.java new file mode 100644 index 00000000..17dc7de0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentRoleServiceImpl.java @@ -0,0 +1,49 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import cn.lili.modules.member.mapper.StoreDepartmentRoleMapper; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 部门角色业务层实现 + * + * @author Chopper + * @since 2020/11/22 12:08 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreDepartmentRoleServiceImpl extends ServiceImpl implements StoreDepartmentRoleService { + + + @Override + public List listByDepartmentId(String storeDepartmentId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("department_id", storeDepartmentId); + return this.baseMapper.selectList(queryWrapper); + } + + @Override + public void updateByDepartmentId(String storeDepartmentId, List storeDepartmentRoles) { + if (storeDepartmentRoles.size() > 0) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("department_id", storeDepartmentId); + this.remove(queryWrapper); + this.saveBatch(storeDepartmentRoles); + } + } + + @Override + public void deleteByDepartment(List ids) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("department_id", ids); + this.remove(queryWrapper); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentServiceImpl.java new file mode 100644 index 00000000..f9a2c1df --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentServiceImpl.java @@ -0,0 +1,112 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.member.entity.vo.StoreDepartmentVO; +import cn.lili.modules.member.mapper.StoreDepartmentMapper; +import cn.lili.modules.member.service.ClerkService; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import cn.lili.modules.member.service.StoreDepartmentService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 店铺部门业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:47 下午 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreDepartmentServiceImpl extends ServiceImpl implements StoreDepartmentService { + + @Autowired + private StoreDepartmentRoleService storeDepartmentRoleService; + + @Autowired + private ClerkService clerkService; + + @Override + public void deleteByIds(List ids) { + //校验是否有操作店铺部门权限 + List storeDepartments = this.list(new QueryWrapper() + .in("id", ids) + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + if (storeDepartments.size() != ids.size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + //校验店员是否绑定部门 + if (clerkService.count(new QueryWrapper().in("department_id", ids)) > 0) { + throw new ServiceException(ResultCode.PERMISSION_DEPARTMENT_DELETE_ERROR); + } + //删除店铺部门 + this.removeByIds(ids); + //删除店铺部门角色 + storeDepartmentRoleService.deleteByDepartment(ids); + } + + @Override + public List tree(QueryWrapper initWrapper) { + try { + List departments = this.list(initWrapper); + + List all = new ArrayList<>(); + departments.forEach(item -> all.add(new StoreDepartmentVO(item))); + + List tree = new ArrayList<>(); + all.forEach(item -> { + if ("0".equals(item.getParentId())) { + initChild(item, all); + tree.add(item); + } + }); + + return tree; + } catch (Exception e) { + log.error("部门业务错误", e); + return null; + } + } + + + /** + * 递归初始化子树 + * + * @param tree 树结构 + * @param departmentVOS 数据库对象集合 + */ + private void initChild(StoreDepartmentVO tree, List departmentVOS) { + departmentVOS.stream() + .filter(item -> (item.getParentId().equals(tree.getId()))) + .forEach(child -> { + StoreDepartmentVO childTree = new StoreDepartmentVO(child); + initChild(childTree, departmentVOS); + tree.getChildren().add(childTree); + }); + } + + @Override + public Boolean update(StoreDepartment storeDepartment) { + StoreDepartment temp = this.getById(storeDepartment); + //校验部门是否存在 + if (temp == null) { + throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); + } + //校验店铺权限 + if (!temp.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + return this.updateById(storeDepartment); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreLogisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreLogisticsServiceImpl.java new file mode 100644 index 00000000..254e178b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreLogisticsServiceImpl.java @@ -0,0 +1,98 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.mapper.StoreLogisticsMapper; +import cn.lili.modules.member.service.StoreLogisticsService; +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.store.entity.dto.StoreLogisticsCustomerDTO; +import cn.lili.modules.system.entity.vo.StoreLogisticsVO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * 物流公司业务层实现 + * + * @author Chopper + * @since 2020/11/17 8:02 下午 + */ +@Service +public class StoreLogisticsServiceImpl extends ServiceImpl implements StoreLogisticsService { + + @Override + public List getStoreLogistics(String storeId) { + return this.baseMapper.getStoreLogistics(storeId); + } + + @Override + public List getStoreSelectedLogistics(String storeId) { + return this.baseMapper.getSelectedStoreLogistics(storeId); + + } + + @Override + public List getStoreSelectedLogisticsName(String storeId) { + return this.baseMapper.getSelectedStoreLogisticsName(storeId); + } + + @Override + public List getStoreSelectedLogisticsUseFaceSheet(String storeId) { + return this.baseMapper.getSelectedStoreLogisticsUseFaceSheet(storeId); + } + + @Override + public StoreLogistics update(String logisticsId, String storeId, StoreLogisticsCustomerDTO storeLogisticsCustomerDTO) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(StoreLogistics::getLogisticsId, logisticsId); + lambdaQueryWrapper.eq(StoreLogistics::getStoreId, storeId); + this.remove(lambdaQueryWrapper); + StoreLogistics ResultstoreLogistics = new StoreLogistics(storeLogisticsCustomerDTO); + ResultstoreLogistics.setStoreId(storeId); + ResultstoreLogistics.setLogisticsId(logisticsId); + this.save(ResultstoreLogistics); + return ResultstoreLogistics; + } + + @Override + public StoreLogistics getStoreLogisticsInfo(String logisticsId) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return this.getOne(new LambdaQueryWrapper().eq(StoreLogistics::getStoreId, storeId).eq(StoreLogistics::getLogisticsId, logisticsId)); + } + + @Override + public List getOpenStoreLogistics(String storeId) { + List openStoreLogistics = this.baseMapper.getOpenStoreLogistics(storeId); + for (StoreLogisticsVO storeLogisticsVO : openStoreLogistics) { + storeLogisticsVO.setSelected("1"); + } + return openStoreLogistics; + } + + @Override + public List getCloseStoreLogistics(String storeId) { + return this.baseMapper.getCloseStroreLogistics(storeId); + } + + @Override + public StoreLogistics add(String logisticsId, String storeId, StoreLogisticsCustomerDTO storeLogisticsCustomerDTO) { + //判断是否已经选择过,如果没有选择则进行添加 + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(StoreLogistics::getLogisticsId, logisticsId); + lambdaQueryWrapper.eq(StoreLogistics::getStoreId, storeId); + StoreLogistics storeLogistics = null; + if (this.getOne(lambdaQueryWrapper) == null) { + storeLogistics = new StoreLogistics(storeLogisticsCustomerDTO); + storeLogistics.setStoreId(storeId); + storeLogistics.setLogisticsId(logisticsId); + this.save(storeLogistics); + return storeLogistics; + } + return null; + } + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java new file mode 100644 index 00000000..28e7debd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java @@ -0,0 +1,104 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import cn.lili.modules.member.mapper.StoreMenuMapper; +import cn.lili.modules.member.mapper.StoreMenuRoleMapper; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.permission.entity.dos.RoleMenu; +import cn.lili.modules.permission.entity.vo.UserMenuVO; +import cn.lili.modules.permission.mapper.MenuMapper; +import cn.lili.modules.permission.mapper.RoleMenuMapper; +import cn.lili.modules.permission.service.RoleMenuService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import groovy.util.logging.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 角色菜单业务层实现 + * + * @author Chopper + * @since 2020/11/22 11:43 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreMenuRoleServiceImpl extends ServiceImpl implements StoreMenuRoleService { + + /** + * 菜单 + */ + @Resource + private StoreMenuMapper storeMenuMapper; + + + @Autowired + private Cache cache; + + @Override + public List findByRoleId(String roleId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(StoreMenuRole::getRoleId, roleId); + return this.baseMapper.selectList(queryWrapper); + } + + @Override + public List findAllMenu(String clerkId,String memberId) { + String cacheKey = CachePrefix.STORE_USER_MENU.getPrefix() + memberId; + List menuList = (List) cache.get(cacheKey); + if (menuList == null || menuList.isEmpty()) { + menuList = storeMenuMapper.getUserRoleMenu(clerkId); + cache.put(cacheKey, menuList); + } + return menuList; + } + + + @Override + public void updateRoleMenu(String roleId, List roleMenus) { + try { + roleMenus.forEach(role -> { + role.setStoreId(UserContext.getCurrentUser().getStoreId()); + }); + //删除角色已经绑定的菜单 + this.delete(roleId); + //重新保存角色菜单关系 + this.saveBatch(roleMenus); + + cache.vagueDel(CachePrefix.MENU_USER_ID.getPrefix()); + cache.vagueDel(CachePrefix.USER_MENU.getPrefix()); + } catch (Exception e) { + log.error("修改用户权限错误", e); + } + } + + @Override + public void delete(String roleId) { + //删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("role_id", roleId); + this.remove(queryWrapper); + cache.vagueDel(CachePrefix.STORE_MENU_USER_ID.getPrefix()); + cache.vagueDel(CachePrefix.STORE_USER_MENU.getPrefix()); + } + + @Override + public void delete(List roleId) { + //删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("role_id", roleId); + this.remove(queryWrapper); + cache.vagueDel(CachePrefix.STORE_MENU_USER_ID.getPrefix()); + cache.vagueDel(CachePrefix.STORE_USER_MENU.getPrefix()); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java new file mode 100644 index 00000000..c5e0fafc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java @@ -0,0 +1,178 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.SearchVO; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.entity.vo.StoreMenuVO; +import cn.lili.modules.member.mapper.StoreMenuMapper; +import cn.lili.modules.member.service.ClerkService; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.member.service.StoreMenuService; +import cn.lili.modules.permission.entity.dto.MenuSearchParams; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 权限业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:49 下午 + */ +@Slf4j +@Service +public class StoreMenuServiceImpl extends ServiceImpl implements StoreMenuService { + /** + * 菜单角色 + */ + @Autowired + private StoreMenuRoleService storeMenuRoleService; + + @Autowired + private Cache> cache; + + /** + * 店员 + */ + @Autowired + private ClerkService clerkService; + + @Override + public void deleteIds(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("menu_id", ids); + //如果已有角色绑定菜单,则不能直接删除 + if (storeMenuRoleService.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.PERMISSION_MENU_ROLE_ERROR); + } + this.removeByIds(ids); + } + + + @Override + public List findUserTree() { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + if (Boolean.TRUE.equals(authUser.getIsSuper())) { + return this.tree(); + } + //获取当前登录用户的店员信息 + Clerk clerk = clerkService.getOne(new LambdaQueryWrapper().eq(Clerk::getMemberId, authUser.getId())); + //获取当前店员角色的菜单列表 + List userMenus = this.baseMapper.findByUserId(clerk.getId()); + return this.tree(userMenus); + } + + @Override + public List findUserList(String userId) { + String cacheKey = CachePrefix.STORE_MENU_USER_ID.getPrefix() + userId; + List menuList = cache.get(cacheKey); + if (menuList == null) { + menuList = this.baseMapper.findByUserId(userId); + cache.put(cacheKey, menuList); + } + return menuList; + } + + /** + * 添加更新菜单 + * + * @param storeMenu 菜单数据 + * @return 是否成功 + */ + @Override + public boolean saveOrUpdateMenu(StoreMenu storeMenu) { + if (CharSequenceUtil.isNotEmpty(storeMenu.getId())) { + cache.vagueDel(CachePrefix.STORE_MENU_USER_ID.getPrefix()); + } + return this.saveOrUpdate(storeMenu); + } + + @Override + public List findByRoleIds(String roleId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("role_id", roleId); + return this.list(queryWrapper); + } + + @Override + public List searchList(MenuSearchParams menuSearchParams) { + //title 需要特殊处理 + String title = null; + if (CharSequenceUtil.isNotEmpty(menuSearchParams.getTitle())) { + title = menuSearchParams.getTitle(); + menuSearchParams.setTitle(null); + } + QueryWrapper queryWrapper = PageUtil.initWrapper(menuSearchParams, new SearchVO()); + if (CharSequenceUtil.isNotEmpty(title)) { + queryWrapper.like("title", title); + } + queryWrapper.orderByDesc("sort_order"); + return this.baseMapper.selectList(queryWrapper); + } + + + @Override + public List tree() { + try { + List menus = this.list(); + return tree(menus); + } catch (Exception e) { + log.error("菜单树错误", e); + } + return Collections.emptyList(); + } + + /** + * 传入自定义菜单集合 + * + * @param menus 自定义菜单集合 + * @return 修改后的自定义菜单集合 + */ + private List tree(List menus) { + List tree = new ArrayList<>(); + menus.forEach(item -> { + if (item.getLevel() == 0) { + StoreMenuVO treeItem = new StoreMenuVO(item); + initChild(treeItem, menus); + tree.add(treeItem); + } + }); + //对一级菜单排序 + tree.sort(Comparator.comparing(StoreMenu::getSortOrder)); + return tree; + } + + /** + * 递归初始化子树 + * + * @param tree 树结构 + * @param menus 数据库对象集合 + */ + private void initChild(StoreMenuVO tree, List menus) { + if (menus == null) { + return; + } + menus.stream() + .filter(item -> (item.getParentId().equals(tree.getId()))) + .forEach(child -> { + StoreMenuVO childTree = new StoreMenuVO(child); + initChild(childTree, menus); + tree.getChildren().add(childTree); + }); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreRoleServiceImpl.java new file mode 100644 index 00000000..af2e7a47 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreRoleServiceImpl.java @@ -0,0 +1,106 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.member.mapper.StoreRoleMapper; +import cn.lili.modules.member.service.StoreClerkRoleService; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.member.service.StoreRoleService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 角色业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:50 下午 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreRoleServiceImpl extends ServiceImpl implements StoreRoleService { + + /** + * 部门角色 + */ + @Autowired + private StoreDepartmentRoleService storeDepartmentRoleService; + /** + * 用户权限 + */ + @Autowired + private StoreClerkRoleService storeClerkRoleService; + + @Autowired + private StoreMenuRoleService storeMenuRoleService; + + @Override + public List findByDefaultRole(Boolean defaultRole) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("default_role", true); + return baseMapper.selectList(queryWrapper); + } + + @Override + public void deleteRoles(List roleIds) { + //校验是否为当前店铺 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id", roleIds); + List roles = this.baseMapper.selectList(queryWrapper); + roles.forEach(role -> { + if (!role.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + }); + queryWrapper = new QueryWrapper<>(); + queryWrapper.in("role_id", roleIds); + //校验是否绑定店铺部门 + if (storeDepartmentRoleService.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.PERMISSION_DEPARTMENT_ROLE_ERROR); + } + //校验是否绑定店员 + if (storeClerkRoleService.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.PERMISSION_USER_ROLE_ERROR); + } + //删除角色 + this.removeByIds(roleIds); + //删除角色与菜单关联 + storeMenuRoleService.remove(queryWrapper); + } + + @Override + public Boolean update(StoreRole storeRole) { + StoreRole storeRoleTemp = this.getById(storeRole.getId()); + //校验店铺角色是否存在 + if (storeRoleTemp == null) { + throw new ServiceException(ResultCode.PERMISSION_ROLE_NOT_FOUND_ERROR); + } + //校验店铺角色是否属于当前店铺 + if (!storeRoleTemp.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.PERMISSION_ROLE_NOT_FOUND_ERROR); + } + return updateById(storeRole); + } + + + @Override + public Boolean saveStoreRole(StoreRole storeRole) { + storeRole.setStoreId(UserContext.getCurrentUser().getStoreId()); + return save(storeRole); + } + + @Override + public List list(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.in("id", ids); + return this.baseMapper.selectList(queryWrapper); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/token/MemberTokenGenerate.java b/framework/src/main/java/cn/lili/modules/member/token/MemberTokenGenerate.java new file mode 100644 index 00000000..ad5e0089 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/token/MemberTokenGenerate.java @@ -0,0 +1,77 @@ +package cn.lili.modules.member.token; + +import cn.lili.common.context.ThreadContextHolder; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; +import cn.lili.common.security.token.TokenUtil; +import cn.lili.common.security.token.base.AbstractTokenGenerate; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.MemberTagsEnum; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 会员token生成 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/16 10:50 + */ +@Component +public class MemberTokenGenerate extends AbstractTokenGenerate { + @Autowired + private TokenUtil tokenUtil; + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Override + public Token createToken(Member member, Boolean longTerm) { + + + ClientTypeEnum clientTypeEnum; + try { + //获取客户端类型 + String clientType = ThreadContextHolder.getHttpRequest().getHeader("clientType"); + //如果客户端为空,则缺省值为PC,pc第三方登录时不会传递此参数 + if (clientType == null) { + clientTypeEnum = ClientTypeEnum.PC; + } else { + clientTypeEnum = ClientTypeEnum.valueOf(clientType); + } + } catch (Exception e) { + clientTypeEnum = ClientTypeEnum.UNKNOWN; + } + //记录最后登录时间,客户端类型 + member.setLastLoginDate(new Date()); + member.setClientEnum(clientTypeEnum.name()); + String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_LOGIN.name(); + rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback()); + + AuthUser authUser = AuthUser.builder() + .username(member.getUsername()) + .face(member.getFace()) + .id(member.getId()) + .role(UserEnums.MEMBER) + .nickName(member.getNickName()) + .longTerm(longTerm) + .build(); + //登陆成功生成token + return tokenUtil.createToken(authUser); + } + + @Override + public Token refreshToken(String refreshToken) { + return tokenUtil.refreshToken(refreshToken); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java new file mode 100644 index 00000000..9d4b08fc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java @@ -0,0 +1,166 @@ +package cn.lili.modules.member.token; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.PermissionEnum; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; +import cn.lili.common.security.token.TokenUtil; +import cn.lili.common.security.token.base.AbstractTokenGenerate; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import cn.lili.modules.member.service.ClerkService; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.modules.store.service.StoreService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 商家token生成 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/16 10:51 + */ +@Component +public class StoreTokenGenerate extends AbstractTokenGenerate { + @Autowired + private StoreService storeService; + @Autowired + private TokenUtil tokenUtil; + @Autowired + private StoreMenuRoleService storeMenuRoleService; + @Autowired + private Cache cache; + @Autowired + private ClerkService clerkService; + + @Override + public Token createToken(Member member, Boolean longTerm) { + if (Boolean.FALSE.equals(member.getHaveStore())) { + throw new ServiceException(ResultCode.STORE_NOT_OPEN); + } + //根据会员id查询店员信息 + Clerk clerk = clerkService.getClerkByMemberId(member.getId()); + + if (clerk == null) { + throw new ServiceException(ResultCode.CLERK_NOT_FOUND_ERROR); + } + if (!clerk.getStatus()) { + throw new ServiceException(ResultCode.CLERK_DISABLED_ERROR); + } + //获取当前用户权限 + List storeUserMenuVOS = storeMenuRoleService.findAllMenu(clerk.getId(), member.getId()); + //缓存权限列表 + cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + member.getId(), this.permissionList(storeUserMenuVOS)); + //查询店铺信息 + Store store = storeService.getById(clerk.getStoreId()); + if (store == null) { + throw new ServiceException(ResultCode.STORE_NOT_OPEN); + } + //构建对象 + AuthUser authUser = AuthUser.builder() + .username(member.getUsername()) + .id(member.getId()) + .role(UserEnums.STORE) + .nickName(member.getNickName()) + .isSuper(clerk.getIsSuper()) + .clerkId(clerk.getId()) + .face(store.getStoreLogo()) + .storeId(store.getId()) + .storeName(store.getStoreName()) + .longTerm(longTerm) + .build(); + return tokenUtil.createToken(authUser); + } + + @Override + public Token refreshToken(String refreshToken) { + return tokenUtil.refreshToken(refreshToken); + } + + /** + * 获取用户权限 + * + * @param userMenuVOList + * @return + */ + private Map> permissionList(List userMenuVOList) { + Map> permission = new HashMap<>(2); + + List superPermissions = new ArrayList<>(); + List queryPermissions = new ArrayList<>(); + initPermission(superPermissions, queryPermissions); + + //循环权限菜单 + if (userMenuVOList != null && !userMenuVOList.isEmpty()) { + userMenuVOList.forEach(menu -> { + //循环菜单,赋予用户权限 + if (CharSequenceUtil.isNotEmpty(menu.getPermission())) { + //获取路径集合 + String[] permissionUrl = menu.getPermission().split(","); + //for循环路径集合 + for (String url : permissionUrl) { + //如果是超级权限 则计入超级权限 + if (Boolean.TRUE.equals(menu.getSuper())) { + //如果已有超级权限,则这里就不做权限的累加 + if (!superPermissions.contains(url)) { + superPermissions.add(url); + } + } + //否则计入浏览权限 + else { + //没有权限,则累加。 + if (!queryPermissions.contains(url)) { + queryPermissions.add(url); + } + } + } + } + //去除重复的权限 + queryPermissions.removeAll(superPermissions); + }); + } + permission.put(PermissionEnum.SUPER.name(), superPermissions); + permission.put(PermissionEnum.QUERY.name(), queryPermissions); + return permission; + } + + + /** + * 初始赋予的权限,查看权限包含首页流量统计权限, + * 超级权限包含个人信息维护,密码修改权限 + * + * @param superPermissions 超级权限 + * @param queryPermissions 查询权限 + */ + void initPermission(List superPermissions, List queryPermissions) { + //菜单管理 + superPermissions.add("/store/menu*"); + //退出权限 + superPermissions.add("/store/passport/login/logout*"); + //修改 + superPermissions.add("/store/passport/login*"); + + + //店铺设置 + queryPermissions.add("/store/settings/storeSettings*"); + //文章接口 + queryPermissions.add("/store/other/article*"); + //首页统计 + queryPermissions.add("/store/statistics/index*"); + + + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberMessage.java b/framework/src/main/java/cn/lili/modules/message/entity/dos/MemberMessage.java similarity index 73% rename from framework/src/main/java/cn/lili/modules/member/entity/dos/MemberMessage.java rename to framework/src/main/java/cn/lili/modules/message/entity/dos/MemberMessage.java index d0ce5fa6..2134f166 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberMessage.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/dos/MemberMessage.java @@ -1,24 +1,20 @@ -package cn.lili.modules.member.entity.dos; +package cn.lili.modules.message.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import cn.lili.modules.message.entity.enums.MessageStatusEnum; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; /** - * 会员消息 + * 会员接受消息对象 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_message") @TableName("li_member_message") @ApiModel(value = "会员消息") public class MemberMessage extends BaseEntity { @@ -37,10 +33,13 @@ public class MemberMessage extends BaseEntity { @ApiModelProperty(value = "消息内容") private String content; + @ApiModelProperty(value = "关联消息id") + private String messageId; + /** * @see MessageStatusEnum */ - @ApiModelProperty(value = "状态 0默认未读 1已读 2回收站") + @ApiModelProperty(value = "状态") private String status = MessageStatusEnum.UN_READY.name(); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/Message.java b/framework/src/main/java/cn/lili/modules/message/entity/dos/Message.java index 5be9f77f..d373c049 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/Message.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/dos/Message.java @@ -1,24 +1,22 @@ package cn.lili.modules.message.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import cn.lili.modules.message.entity.enums.RangeEnum; +import cn.lili.modules.message.entity.enums.MessageSendClient; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; -import javax.persistence.Transient; /** + * 管理段发送消息对象 + * * @author lili */ @Data -@Entity -@Table(name = "li_message") @TableName("li_message") @ApiModel(value = "消息") public class Message extends BaseEntity { @@ -37,15 +35,16 @@ public class Message extends BaseEntity { @ApiModelProperty(value = "发送范围") private String messageRange; - @ApiModelProperty(value = "发送客户端 商家和会员") + /** + * @see MessageSendClient + */ + @ApiModelProperty(value = "发送客户端 商家或者会员") private String messageClient; - @Transient @TableField(exist = false) @ApiModelProperty(value = "发送指定用户id") private String[] userIds; - @Transient @TableField(exist = false) @ApiModelProperty(value = "发送指定用户名称") private String[] userNames; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/NoticeMessage.java b/framework/src/main/java/cn/lili/modules/message/entity/dos/NoticeMessage.java index 817aff46..c8661143 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/NoticeMessage.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/dos/NoticeMessage.java @@ -1,47 +1,53 @@ package cn.lili.modules.message.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; /** - * 站内消息模板设置 + * 通知类站内信模版对象 * * @author Bulbasaur * @version v4.1 - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ @Data -@Entity -@Table(name = "li_notice_message") @TableName("li_notice_message") -@ApiModel(value = "站内消息模板") +@ApiModel(value = "通知类消息模板") public class NoticeMessage extends BaseEntity { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "站内信节点") + @NotEmpty(message = "站内信节点不能为空") + @Length(max = 50, message = "站内信节点名称太长,不能超过50") private String noticeNode; @ApiModelProperty(value = "站内信标题") + @NotEmpty(message = "站内信标题不能为空") + @Length(max = 50, message = "站内信标题名称太长,不能超过50") private String noticeTitle; @ApiModelProperty(value = "站内信内容") + @NotEmpty(message = "站内信内容不能为空") + @Length(max = 200, message = "站内信内容名称太长,不能超过200") private String noticeContent; /** * @see cn.lili.common.enums.SwitchEnum */ + @NotEmpty(message = "站内信状态不能为空") @ApiModelProperty(value = "站内信是否开启") private String noticeStatus; /** * @see cn.lili.modules.message.entity.enums.NoticeMessageParameterEnum */ @ApiModelProperty(value = "消息变量") + @NotEmpty(message = "站内信状态不能为空") private String variable; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/ShortLink.java b/framework/src/main/java/cn/lili/modules/message/entity/dos/ShortLink.java index 3dfbfa3f..f179c057 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/ShortLink.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/dos/ShortLink.java @@ -1,23 +1,20 @@ package cn.lili.modules.message.entity.dos; -import cn.lili.base.IdEntity; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; /** + * 短链接/暂时只用于小程序二维码业务 * @author Chopper */ @Data -@Entity -@Table(name = "li_short_link") @TableName("li_short_link") @ApiModel(value = "短链接/暂时只用于小程序二维码业务") -public class ShortLink extends IdEntity { +public class ShortLink extends BaseIdEntity { private static final long serialVersionUID = 1L; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/StoreMessage.java b/framework/src/main/java/cn/lili/modules/message/entity/dos/StoreMessage.java index 12479e53..75a5af8f 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/StoreMessage.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/dos/StoreMessage.java @@ -1,9 +1,9 @@ package cn.lili.modules.message.entity.dos; import cn.lili.modules.message.entity.enums.MessageStatusEnum; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -13,30 +13,21 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.*; import java.util.Date; /** - * 店铺消息 + * 店铺接收消息对象 + * * @author Chopper - * @date 2021/1/30 4:13 下午 + * @since 2021/1/30 4:13 下午 */ @Data -@Entity -@Table(name = "li_store_message") @TableName("li_store_message") @ApiModel(value = "店铺消息") -public class StoreMessage { +public class StoreMessage extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建者", hidden = true) @@ -65,12 +56,10 @@ public class StoreMessage { private String status = MessageStatusEnum.UN_READY.name(); - @Transient @TableField(exist = false) @ApiModelProperty(value = "消息标题") private String title; - @Transient @TableField(exist = false) @ApiModelProperty(value = "消息内容") private String content; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDTO.java b/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDTO.java index 473ab68a..835e3394 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDTO.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDTO.java @@ -9,7 +9,7 @@ import java.util.Map; /** * 站内信消息 * @author Chopper - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ @Data public class NoticeMessageDTO { diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDetailDTO.java b/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDetailDTO.java index 9ef8195a..0aaea8ee 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDetailDTO.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/dto/NoticeMessageDetailDTO.java @@ -9,7 +9,7 @@ import java.util.List; /** * 站内信消息DTO * @author Chopper - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ @Data public class NoticeMessageDetailDTO extends NoticeMessage { diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageRangeEnum.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageRangeEnum.java index 2b2cc7d1..322c5818 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageRangeEnum.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageRangeEnum.java @@ -1,16 +1,20 @@ package cn.lili.modules.message.entity.enums; /** - * 发送消息范围 + * 发送消息范围枚举 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum MessageRangeEnum { - + /** + * 所有用户 + */ ALL("所有用户"), - + /** + * 指定用户 + */ USER("指定用户"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageSendClient.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageSendClient.java new file mode 100644 index 00000000..c9dd51eb --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageSendClient.java @@ -0,0 +1,27 @@ +package cn.lili.modules.message.entity.enums; + +/** + * 消息发送客户端 + * + * @author pikachu + * @since 2020/12/8 9:46 + */ +public enum MessageSendClient { + + //全部用户 + MEMBER("会员"), + //指定用户 + STORE("店铺"); + + private final String description; + + MessageSendClient(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageShowType.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageShowType.java index 319ca812..cb0b15b5 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageShowType.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageShowType.java @@ -4,7 +4,7 @@ package cn.lili.modules.message.entity.enums; * 消息展示类型 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum MessageShowType { diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageStatusEnum.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageStatusEnum.java index 11e107cf..592de0ff 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.message.entity.enums; * 消息状态枚举 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum MessageStatusEnum { diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTemplateType.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTemplateType.java index 3783a2e5..5a15e175 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTemplateType.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTemplateType.java @@ -4,7 +4,7 @@ package cn.lili.modules.message.entity.enums; * 消息模板类型 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum MessageTemplateType { diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTitle.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTitle.java index 7bd5612d..36152245 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTitle.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/MessageTitle.java @@ -1,14 +1,20 @@ package cn.lili.modules.message.entity.enums; + /** * 消息标题 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum MessageTitle { + /** + * 您有新的订单,请您关注 + */ NEW_ORDER("您有新的订单,请您关注"), - + /** + * 您有订单被支付,请您及时进行发货处理 + */ PAY_ORDER("您有订单被支付,请您及时进行发货处理"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageNodeEnum.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageNodeEnum.java index 55552f6b..34e61632 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageNodeEnum.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageNodeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.message.entity.enums; * 消息编码枚举 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum NoticeMessageNodeEnum { @@ -48,9 +48,11 @@ public enum NoticeMessageNodeEnum { * 用户余额 */ WALLET_CHANGE("余额账户变更通知"), - WALLET_WITHDRAWAL_CREATE("提现申请提交成功通知"), - WALLET_WITHDRAWAL_SUCCESS("提现成功通知"), - WALLET_WITHDRAWAL_ERROR("提现申请驳回通知"); + WALLET_WITHDRAWAL_CREATE("余额提现申请提交成功通知"), + WALLET_WITHDRAWAL_SUCCESS("余额提现成功通知"), + WALLET_WITHDRAWAL_ERROR("余额提现申请失败通知"), + WALLET_WITHDRAWAL_AUDIT_ERROR("余额提现申请驳回通知"), + WALLET_WITHDRAWAL_AUDIT_SUCCESS("余额提现申请通过通知"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageParameterEnum.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageParameterEnum.java index 15be4c22..1e28ee15 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageParameterEnum.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/NoticeMessageParameterEnum.java @@ -4,18 +4,42 @@ package cn.lili.modules.message.entity.enums; * 消息编码枚举 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum NoticeMessageParameterEnum { - + /** + * 商品名称 + */ GOODS("goods", "商品名称"), + /** + * 消费积分 + */ EXPENDITURE_POINTS("expenditure_points", "消费积分"), + /** + * 获得积分 + */ INCOME_POINTS("income_points", "获得积分"), + /** + * 支出金额 + */ EXPENDITURE("expenditure", "支出金额"), + /** + * 收入金额 + */ INCOME("income", "收入金额"), + /** + * 拒绝原因 + */ REFUSE("refuse", "拒绝原因"), - CANCEL_REASON("cancel_reason","取消原因"); + /** + * 取消原因 + */ + CANCEL_REASON("cancel_reason", "取消原因"), + /** + * 金额 + */ + PRICE("price", "金额"); private final String type; private final String description; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/RangeEnum.java b/framework/src/main/java/cn/lili/modules/message/entity/enums/RangeEnum.java index 0f622253..f1fad9b6 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/RangeEnum.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/enums/RangeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.message.entity.enums; * 消息发送类型 * * @author pikachu - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public enum RangeEnum { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberMessageQueryVO.java b/framework/src/main/java/cn/lili/modules/message/entity/vos/MemberMessageQueryVO.java similarity index 66% rename from framework/src/main/java/cn/lili/modules/member/entity/vo/MemberMessageQueryVO.java rename to framework/src/main/java/cn/lili/modules/message/entity/vos/MemberMessageQueryVO.java index 4264facf..435555d7 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberMessageQueryVO.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/vos/MemberMessageQueryVO.java @@ -1,17 +1,19 @@ -package cn.lili.modules.member.entity.vo; +package cn.lili.modules.message.entity.vos; import cn.lili.modules.message.entity.enums.MessageStatusEnum; +import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** - * 会员消息查询 + * 会员接收消息查询vo * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020/12/2 17:50 */ @Data +@ApiModel(value = "会员接收消息查询vo") public class MemberMessageQueryVO { private static final long serialVersionUID = 1L; @@ -22,6 +24,9 @@ public class MemberMessageQueryVO { @ApiModelProperty(value = "状态") private String status; + @ApiModelProperty(value = "消息id") + private String messageId; + @ApiModelProperty(value = "消息标题") private String title; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageShowVO.java b/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageShowVO.java index 577f9779..2d306f58 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageShowVO.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageShowVO.java @@ -12,7 +12,7 @@ import lombok.NoArgsConstructor; * 消息 * * @author Chopper - * @date 2020/12/2 17:50 + * @since 2020/12/2 17:50 */ @Data @ApiModel(value = "消息") diff --git a/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageVO.java b/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageVO.java index 8221dcdf..d534c21f 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageVO.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/vos/MessageVO.java @@ -10,7 +10,7 @@ import lombok.Data; /** * 消息 * @author Chopper - * @date 2020/12/2 17:50 + * @since 2020/12/2 17:50 * */ @Data diff --git a/framework/src/main/java/cn/lili/modules/message/entity/vos/StoreMessageQueryVO.java b/framework/src/main/java/cn/lili/modules/message/entity/vos/StoreMessageQueryVO.java index fc746773..62cfdcfc 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/vos/StoreMessageQueryVO.java +++ b/framework/src/main/java/cn/lili/modules/message/entity/vos/StoreMessageQueryVO.java @@ -10,7 +10,7 @@ import lombok.Data; * 店铺消息查询 * * @author Chopper - * @date 2020/12/2 17:50 + * @since 2020/12/2 17:50 */ @Data @ApiModel(value = "消息") diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/MemberMessageMapper.java b/framework/src/main/java/cn/lili/modules/message/mapper/MemberMessageMapper.java new file mode 100644 index 00000000..8f843a03 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/message/mapper/MemberMessageMapper.java @@ -0,0 +1,16 @@ +package cn.lili.modules.message.mapper; + + +import cn.lili.modules.message.entity.dos.MemberMessage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + + +/** + * 会员接收到消息数据处理层 + * + * @author lili + * @since 2020-02-25 14:10:16 + */ +public interface MemberMessageMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/MessageMapper.java b/framework/src/main/java/cn/lili/modules/message/mapper/MessageMapper.java index 64df8a05..9bad1ed7 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/MessageMapper.java +++ b/framework/src/main/java/cn/lili/modules/message/mapper/MessageMapper.java @@ -4,9 +4,9 @@ import cn.lili.modules.message.entity.dos.Message; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** - * 消息内容数据处理层 + * 管理端发送消息内容数据处理层 * @author Chopper - * @date 2020/12/2 17:50 + * @since 2020/12/2 17:50 */ public interface MessageMapper extends BaseMapper { } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/NoticeMessageTemplateMapper.java b/framework/src/main/java/cn/lili/modules/message/mapper/NoticeMessageTemplateMapper.java index 38f1c3d6..64c8066f 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/NoticeMessageTemplateMapper.java +++ b/framework/src/main/java/cn/lili/modules/message/mapper/NoticeMessageTemplateMapper.java @@ -4,10 +4,10 @@ import cn.lili.modules.message.entity.dos.NoticeMessage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** - * 消息模板数据处理层 + * 通知类消息模板数据处理层 * * @author Bulbasaur - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public interface NoticeMessageTemplateMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/StoreMessageMapper.java b/framework/src/main/java/cn/lili/modules/message/mapper/StoreMessageMapper.java index 4c580c00..80b91dc1 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/StoreMessageMapper.java +++ b/framework/src/main/java/cn/lili/modules/message/mapper/StoreMessageMapper.java @@ -9,13 +9,20 @@ import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; /** - * 消息发送数据处理层 + * 店铺接收到消息发送数据处理层 * * @author Chopper - * @date 2021/1/30 4:17 下午 + * @since 2021/1/30 4:17 下午 */ public interface StoreMessageMapper extends BaseMapper { + /** + * 店铺消息分页 + * + * @param page 分页 + * @param queryWrapper 查询参数 + * @return 店铺消息分页 + */ @Select("select me.title,me.content,me.create_time,sp.store_name,sp.store_id,sp.id,sp.status from li_message me inner join li_store_message sp on me.id = sp.message_id ${ew.customSqlSegment} ") IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberMessageService.java b/framework/src/main/java/cn/lili/modules/message/service/MemberMessageService.java similarity index 69% rename from framework/src/main/java/cn/lili/modules/member/service/MemberMessageService.java rename to framework/src/main/java/cn/lili/modules/message/service/MemberMessageService.java index b271110f..e0d92ef6 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberMessageService.java +++ b/framework/src/main/java/cn/lili/modules/message/service/MemberMessageService.java @@ -1,16 +1,18 @@ -package cn.lili.modules.member.service; +package cn.lili.modules.message.service; import cn.lili.common.vo.PageVO; -import cn.lili.modules.member.entity.dos.MemberMessage; -import cn.lili.modules.member.entity.vo.MemberMessageQueryVO; +import cn.lili.modules.message.entity.dos.MemberMessage; +import cn.lili.modules.message.entity.vos.MemberMessageQueryVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** - * 消息发送业务层 + * 会员消息发送业务层 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ public interface MemberMessageService extends IService { @@ -41,4 +43,13 @@ public interface MemberMessageService extends IService { Boolean deleteMessage(String messageId); + /** + * 保存消息信息 + * + * @param messages 消息 + * @return + */ + boolean save(List messages); + + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/service/MessageService.java b/framework/src/main/java/cn/lili/modules/message/service/MessageService.java index f5189caf..425d0eaf 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/MessageService.java +++ b/framework/src/main/java/cn/lili/modules/message/service/MessageService.java @@ -7,10 +7,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; /** - * 消息内容业务层 + * 管理端发送消息内容业务层 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ public interface MessageService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/message/service/NoticeMessageService.java b/framework/src/main/java/cn/lili/modules/message/service/NoticeMessageService.java index fabf2576..4b73cdb7 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/NoticeMessageService.java +++ b/framework/src/main/java/cn/lili/modules/message/service/NoticeMessageService.java @@ -7,10 +7,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; /** - * 消息模板业务层 + * 通知类消息模板业务层 * * @author Bulbasaur - * @date 2020/12/8 9:47 + * @since 2020/12/8 9:47 */ public interface NoticeMessageService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/message/service/ShortLinkService.java b/framework/src/main/java/cn/lili/modules/message/service/ShortLinkService.java index 3789ff56..07caf8c6 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/ShortLinkService.java +++ b/framework/src/main/java/cn/lili/modules/message/service/ShortLinkService.java @@ -1,12 +1,22 @@ package cn.lili.modules.message.service; -import com.baomidou.mybatisplus.extension.service.IService; import cn.lili.modules.message.entity.dos.ShortLink; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; /** * 短链接 业务层 + * * @author Chopper */ public interface ShortLinkService extends IService { + /** + * 根据模型,查询返回的集合 + * + * @param shortLink 短链接模型 + * @return 端链接集合 + */ + List queryShortLinks(ShortLink shortLink); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/service/StoreMessageService.java b/framework/src/main/java/cn/lili/modules/message/service/StoreMessageService.java index ad700035..81b32d14 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/StoreMessageService.java +++ b/framework/src/main/java/cn/lili/modules/message/service/StoreMessageService.java @@ -9,10 +9,10 @@ import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** - * 消息发送业务层 + * 店铺接收消息业务层 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ public interface StoreMessageService extends IService { @@ -20,21 +20,22 @@ public interface StoreMessageService extends IService { /** * 通过消息id删除 * - * @param messageId + * @param messageId 消息ID + * @return 操作结果 */ boolean deleteByMessageId(String messageId); /** * 多条件分页获取 * - * @param storeMessageQueryVO - * @param pageVO - * @return + * @param storeMessageQueryVO 店铺消息查询VO + * @param pageVO 分页 + * @return 店铺消息分页 */ IPage getPage(StoreMessageQueryVO storeMessageQueryVO, PageVO pageVO); /** - * 保存消息信息 + * 保存店铺消息信息 * * @param messages 消息 * @return diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberMessageServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/MemberMessageServiceImpl.java similarity index 62% rename from framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberMessageServiceImpl.java rename to framework/src/main/java/cn/lili/modules/message/serviceimpl/MemberMessageServiceImpl.java index db131c08..98c7e85e 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberMessageServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/MemberMessageServiceImpl.java @@ -1,39 +1,43 @@ -package cn.lili.modules.member.serviceimpl; +package cn.lili.modules.message.serviceimpl; -import cn.lili.common.utils.PageUtil; +import cn.lili.mybatis.util.PageUtil; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; -import cn.lili.modules.member.entity.dos.MemberMessage; -import cn.lili.modules.member.entity.vo.MemberMessageQueryVO; -import cn.lili.modules.member.mapper.MemberMessageMapper; -import cn.lili.modules.member.service.MemberMessageService; +import cn.lili.modules.message.entity.dos.MemberMessage; +import cn.lili.modules.message.mapper.MemberMessageMapper; +import cn.lili.modules.message.service.MemberMessageService; +import cn.lili.modules.message.entity.vos.MemberMessageQueryVO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** - * 会员消息业务层实现 + * 会员接收消息业务层实现 * * @author Chopper - * @date 2020/11/17 3:48 下午 + * @since 2020/11/17 3:48 下午 */ @Service -@Transactional public class MemberMessageServiceImpl extends ServiceImpl implements MemberMessageService { @Override public IPage getPage(MemberMessageQueryVO memberMessageQueryVO, PageVO pageVO) { QueryWrapper queryWrapper = new QueryWrapper<>(); + //消息id + queryWrapper.eq(StringUtils.isNotEmpty(memberMessageQueryVO.getMessageId()), "message_id", memberMessageQueryVO.getMessageId()); //消息标题 queryWrapper.like(StringUtils.isNotEmpty(memberMessageQueryVO.getTitle()), "title", memberMessageQueryVO.getTitle()); //会员id - queryWrapper.like(StringUtils.isNotEmpty(memberMessageQueryVO.getMemberId()), "member_id", memberMessageQueryVO.getMemberId()); + queryWrapper.eq(StringUtils.isNotEmpty(memberMessageQueryVO.getMemberId()), "member_id", memberMessageQueryVO.getMemberId()); //消息状态 - queryWrapper.like(StringUtils.isNotEmpty(memberMessageQueryVO.getStatus()), "status", memberMessageQueryVO.getStatus()); + queryWrapper.eq(StringUtils.isNotEmpty(memberMessageQueryVO.getStatus()), "status", memberMessageQueryVO.getStatus()); + //倒序 + queryWrapper.orderByDesc("create_time"); //构建查询 return this.page(PageUtil.initPage(pageVO), queryWrapper); } @@ -61,4 +65,9 @@ public class MemberMessageServiceImpl extends ServiceImpl messages) { + return saveBatch(messages); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/MessageServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/MessageServiceImpl.java index 1af5539b..0f057d1a 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/MessageServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/MessageServiceImpl.java @@ -1,41 +1,34 @@ package cn.lili.modules.message.serviceimpl; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.OtherTagsEnum; -import cn.lili.common.utils.PageUtil; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.message.entity.dos.Message; import cn.lili.modules.message.entity.vos.MessageVO; import cn.lili.modules.message.mapper.MessageMapper; -import cn.lili.modules.message.mapper.StoreMessageMapper; import cn.lili.modules.message.service.MessageService; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.OtherTagsEnum; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** - * 消息内容业务层实现 + * 管理端发送消息内容业务层实现 * * @author Chopper - * @date 2020/11/17 3:48 下午 + * @since 2020/11/17 3:48 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MessageServiceImpl extends ServiceImpl implements MessageService { - private final MessageMapper messageMapper; - - private final StoreMessageMapper storeMessageMapper; - private final SimpMessagingTemplate messagingTemplate; - private final RocketMQTemplate rocketMQTemplate; - private final RocketmqCustomProperties rocketmqCustomProperties; + @Autowired + private RocketMQTemplate rocketMQTemplate; + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; @Override @@ -45,12 +38,11 @@ public class MessageServiceImpl extends ServiceImpl impl @Override + @Transactional(rollbackFor = Exception.class) public Boolean sendMessage(Message message) { //保存站内信信息 this.save(message); //发送站内信消息提醒 - String destination = rocketmqCustomProperties.getOtherTopic() + ":" + OtherTagsEnum.MESSAGE.name(); - rocketMQTemplate.asyncSend(destination, message, RocketmqSendCallbackBuilder.commonCallback()); String noticeSendDestination = rocketmqCustomProperties.getNoticeSendTopic() + ":" + OtherTagsEnum.MESSAGE.name(); rocketMQTemplate.asyncSend(noticeSendDestination, message, RocketmqSendCallbackBuilder.commonCallback()); return true; diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/NoticeMessageServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/NoticeMessageServiceImpl.java index 2aded459..90a6a4e2 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/NoticeMessageServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/NoticeMessageServiceImpl.java @@ -1,47 +1,44 @@ package cn.lili.modules.message.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.SwitchEnum; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; -import cn.lili.modules.member.entity.dos.MemberNotice; -import cn.lili.modules.member.service.MemberNoticeService; +import cn.lili.modules.message.entity.dos.MemberMessage; import cn.lili.modules.message.entity.dos.NoticeMessage; import cn.lili.modules.message.entity.dto.NoticeMessageDTO; +import cn.lili.modules.message.entity.enums.MessageStatusEnum; import cn.lili.modules.message.entity.enums.NoticeMessageParameterEnum; import cn.lili.modules.message.mapper.NoticeMessageTemplateMapper; +import cn.lili.modules.message.service.MemberMessageService; import cn.lili.modules.message.service.NoticeMessageService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.Map; /** - * 消息模板业务层实现 + * 通知类消息模板业务层实现 * * @author Bulbasaur - * @date 2020/12/8 9:48 + * @since 2020/12/8 9:48 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class NoticeMessageServiceImpl extends ServiceImpl implements NoticeMessageService { - - private final MemberNoticeService memberNoticeService; + @Autowired + private MemberMessageService memberMessageService; @Override public IPage getMessageTemplate(PageVO pageVO, String type) { //构建查询参数 QueryWrapper messageTemplateQueryWrapper = new QueryWrapper<>(); //消息模板类型 - messageTemplateQueryWrapper.eq(!StringUtils.isEmpty(type), "type", type); + messageTemplateQueryWrapper.eq(!CharSequenceUtil.isEmpty(type), "type", type); messageTemplateQueryWrapper.orderByDesc("create_time"); //查询数据返回 return this.page(PageUtil.initPage(pageVO), messageTemplateQueryWrapper); @@ -53,21 +50,29 @@ public class NoticeMessageServiceImpl extends ServiceImpl().eq(NoticeMessage::getNoticeNode, noticeMessageDTO.getNoticeMessageNodeEnum().getDescription().trim())); - //如果通知类站内信开启的情况下 - if (noticeMessage != null && noticeMessage.getNoticeStatus().equals(SwitchEnum.OPEN.name())) { - MemberNotice memberNotice = new MemberNotice(); - memberNotice.setMemberId(noticeMessageDTO.getMemberId()); - memberNotice.setTitle(noticeMessage.getNoticeTitle()); - memberNotice.setContent(noticeMessage.getNoticeContent()); - //参数不为空,替换内容 - if (noticeMessageDTO.getParameter() != null) { - memberNotice.setContent(replaceNoticeContent(noticeMessage.getNoticeContent(), noticeMessageDTO.getParameter())); - } else { - memberNotice.setContent(noticeMessage.getNoticeContent()); + try { + NoticeMessage noticeMessage = this.getOne( + new LambdaQueryWrapper() + .eq(NoticeMessage::getNoticeNode + , noticeMessageDTO.getNoticeMessageNodeEnum().getDescription().trim()),false); + //如果通知类站内信开启的情况下 + if (noticeMessage != null && noticeMessage.getNoticeStatus().equals(SwitchEnum.OPEN.name())) { + MemberMessage memberMessage = new MemberMessage(); + memberMessage.setMemberId(noticeMessageDTO.getMemberId()); + memberMessage.setTitle(noticeMessage.getNoticeTitle()); + memberMessage.setContent(noticeMessage.getNoticeContent()); + //参数不为空,替换内容 + if (noticeMessageDTO.getParameter() != null) { + memberMessage.setContent(replaceNoticeContent(noticeMessage.getNoticeContent(), noticeMessageDTO.getParameter())); + } else { + memberMessage.setContent(noticeMessage.getNoticeContent()); + } + memberMessage.setStatus(MessageStatusEnum.UN_READY.name()); + //添加站内信 + memberMessageService.save(memberMessage); } - //添加站内信 - memberNoticeService.save(memberNotice); + } catch (Exception e) { + log.error("站内信发送失败:", e); } } @@ -80,10 +85,10 @@ public class NoticeMessageServiceImpl extends ServiceImpl parameter) { - for (String key : parameter.keySet()) { - String description = NoticeMessageParameterEnum.getValueByType(key); - if (description != null && parameter.get(key) != null) { - noticeContent = noticeContent.replace("#{" + description + "}".trim(), parameter.get(key)); + for (Map.Entry entry : parameter.entrySet()) { + String description = NoticeMessageParameterEnum.getValueByType(entry.getKey()); + if (description != null && entry.getValue() != null) { + noticeContent = noticeContent.replace("#{" + description + "}".trim(), entry.getValue()); } } return noticeContent; diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/ShortLinkServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/ShortLinkServiceImpl.java index b69519df..6ab973e5 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/ShortLinkServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/ShortLinkServiceImpl.java @@ -1,22 +1,24 @@ package cn.lili.modules.message.serviceimpl; -import cn.lili.modules.message.mapper.ShortLinkMapper; import cn.lili.modules.message.entity.dos.ShortLink; +import cn.lili.modules.message.mapper.ShortLinkMapper; import cn.lili.modules.message.service.ShortLinkService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** * 短链接 业务实现 + * * @author Chopper */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ShortLinkServiceImpl extends ServiceImpl implements ShortLinkService { - private final ShortLinkMapper shortLinkMapper; + @Override + public List queryShortLinks(ShortLink shortLink) { + return this.list(PageUtil.initWrapper(shortLink)); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/StoreMessageServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/StoreMessageServiceImpl.java index 6a72d6b1..104685e7 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/StoreMessageServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/StoreMessageServiceImpl.java @@ -1,23 +1,20 @@ package cn.lili.modules.message.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.modules.message.entity.dos.StoreMessage; import cn.lili.modules.message.entity.vos.StoreMessageQueryVO; import cn.lili.modules.message.mapper.StoreMessageMapper; import cn.lili.modules.message.service.StoreMessageService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.elasticsearch.ResourceNotFoundException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -25,21 +22,16 @@ import java.util.List; * 消息发送业务层实现 * * @author Chopper - * @date 2020/11/17 3:48 下午 + * @since 2020/11/17 3:48 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreMessageServiceImpl extends ServiceImpl implements StoreMessageService { - private final StoreMessageMapper storeMessageMapper; - @Override public boolean deleteByMessageId(String messageId) { StoreMessage storeMessage = this.getById(messageId); if (storeMessage != null) { - int result = storeMessageMapper.deleteById(messageId); - return result > 0; + return this.removeById(messageId); } return false; @@ -50,11 +42,11 @@ public class StoreMessageServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); //消息id查询 - if (StringUtils.isNotEmpty(storeMessageQueryVO.getMessageId())) { + if (CharSequenceUtil.isNotEmpty(storeMessageQueryVO.getMessageId())) { queryWrapper.eq("message_id", storeMessageQueryVO.getMessageId()); } //商家id - if (StringUtils.isNotEmpty(storeMessageQueryVO.getStoreId())) { + if (CharSequenceUtil.isNotEmpty(storeMessageQueryVO.getStoreId())) { queryWrapper.eq("store_id", storeMessageQueryVO.getStoreId()); } //状态查询 @@ -62,7 +54,7 @@ public class StoreMessageServiceImpl extends ServiceImpl 0; + return this.updateById(storeMessage); } return false; } diff --git a/framework/src/main/java/cn/lili/modules/message/util/WechatMessageUtil.java b/framework/src/main/java/cn/lili/modules/message/util/WechatMessageUtil.java deleted file mode 100644 index ad3e8d87..00000000 --- a/framework/src/main/java/cn/lili/modules/message/util/WechatMessageUtil.java +++ /dev/null @@ -1,294 +0,0 @@ -package cn.lili.modules.message.util; - -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.connect.entity.Connect; -import cn.lili.modules.connect.entity.enums.ConnectEnum; -import cn.lili.modules.connect.service.ConnectService; -import cn.lili.modules.message.entity.dos.WechatMPMessage; -import cn.lili.modules.message.entity.dos.WechatMessage; -import cn.lili.modules.message.entity.enums.WechatMessageItemEnums; -import cn.lili.modules.message.service.WechatMPMessageService; -import cn.lili.modules.message.service.WechatMessageService; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.dos.OrderItem; -import cn.lili.modules.order.order.service.OrderItemService; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.system.utils.HttpUtils; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * 微信消息 - * - * @author Chopper - * @version v1.0 - * 2020-12-10 19:12 - */ -@Slf4j -@Component -public class WechatMessageUtil { - - @Autowired - private ConnectService connectService; - @Autowired - private OrderService orderService; - @Autowired - private OrderItemService orderItemService; - @Autowired - private WechatAccessTokenUtil wechatAccessTokenUtil; - @Autowired - private WechatMessageService wechatMessageService; - - @Autowired - private WechatMPMessageService wechatMPMessageService; - - public void sendWechatMessage(String sn) { - try { - this.wechatMessage(sn); - } catch (Exception e) { - log.error("微信公众号消息异常:", e); - } - try { - this.wechatMpMessage(sn); - } catch (Exception e) { - log.error("小程序消息订阅异常:", e); - } - - } - - /** - * 发送微信消息 - * - * @param sn - */ - public void wechatMessage(String sn) { - - Order order = orderService.getBySn(sn); - //获取微信消息 - LambdaQueryWrapper wechatMessageQueryWrapper = new LambdaQueryWrapper(); - wechatMessageQueryWrapper.eq(WechatMessage::getOrderStatus, order.getOrderStatus()); - WechatMessage wechatMessage = wechatMessageService.getOne(wechatMessageQueryWrapper); - if (wechatMessage == null) { - return; - } - - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("user_id", order.getMemberId()); - queryWrapper.eq("union_type", ConnectEnum.WECHAT_OPEN_ID.name()); - - Connect connect = connectService.getOne(queryWrapper); - if (connect == null) { - return; - } - - log.info("微信消息发送消息:", order.getMemberId() + "-" + sn); - //获取token - String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.H5); - - //发送url - String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token; - - Map map = new HashMap<>(); - // 用户id - map.put("touser", connect.getUnionId()); - //模版id - map.put("template_id", wechatMessage.getCode()); - //模版中所需数据 - String postParams = createData(order, wechatMessage); - map.put("data", postParams); - - log.info("参数内容:" + JSONUtil.toJsonStr(map)); - String content = HttpUtils.doPostWithJson(url, map); - JSONObject json = new JSONObject(content); - log.info("微信消息发送结果:" + content); - String errorMessage = json.getStr("errmsg"); - String errcode = json.getStr("errcode"); - //发送失败 - if (!"0".equals(errcode)) { - log.error("消息发送失败:" + errorMessage); - log.error("消息发送请求token:" + token); - log.error("消息发送请求:" + postParams); - } - } - - /** - * 发送微信消息 - * - * @param sn - */ - public void wechatMpMessage(String sn) { - - log.error("发送消息订阅"); - Order order = orderService.getBySn(sn); - //获取微信消息 - LambdaQueryWrapper wechatMPMessageQueryWrapper = new LambdaQueryWrapper(); - wechatMPMessageQueryWrapper.eq(WechatMPMessage::getOrderStatus, order.getOrderStatus()); - WechatMPMessage wechatMPMessage = wechatMPMessageService.getOne(wechatMPMessageQueryWrapper); - if (wechatMPMessage == null) { - log.error("未配置微信消息订阅"); - return; - } - - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("user_id", order.getMemberId()); - queryWrapper.eq("union_type", ConnectEnum.WECHAT_MP_OPEN_ID.name()); - - Connect connect = connectService.getOne(queryWrapper); - if (connect == null) { - return; - } - - log.info("微信消息订阅消息发送:", order.getMemberId() + "-" + sn); - //获取token - String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); - - //发送url - String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token; - - Map map = new HashMap<>(); - // 用户id - map.put("touser", connect.getUnionId()); - //模版id - map.put("template_id", wechatMPMessage.getCode()); - //模版中所需数据 - Map> postParams = createData(order, wechatMPMessage); - map.put("data", postParams); - map.put("page", "pages/order/orderDetail?sn="+order.getSn()); - log.info("参数内容:" + JSONUtil.toJsonStr(map)); - String content = null; - try { - content = HttpUtil.post(url, JSONUtil.toJsonStr(map)); - } catch (Exception e) { - e.printStackTrace(); - } - JSONObject json = new JSONObject(content); - log.info("微信消息发送结果:" + content); - String errorMessage = json.getStr("errmsg"); - String errcode = json.getStr("errcode"); - //发送失败 - if (!"0".equals(errcode)) { - log.error("消息发送失败:" + errorMessage); - log.error("消息发送请求token:" + token); - log.error("消息发送请求:" + postParams); - } - } - - /** - * 构造数据中所需的内容 - * - * @param order - * @param wechatMessage - * @return - */ - private String createData(Order order, WechatMessage wechatMessage) { - WechatMessageData wechatMessageData = new WechatMessageData(); - wechatMessageData.setFirst(wechatMessage.getFirst()); - wechatMessageData.setRemark(wechatMessage.getRemark()); - String[] paramArray = wechatMessage.getKeywords().split(","); - LinkedList params = new LinkedList(); - - for (String param : paramArray) { - WechatMessageItemEnums wechatMessageItemEnums = WechatMessageItemEnums.valueOf(param); - //初始化参数内容 - String val = getParams(wechatMessageItemEnums, order); - params.add(val); - } - wechatMessageData.setMessageData(params); - return wechatMessageData.createData(); - } - - /** - * 构造数据中所需的内容 - * - * @param order - * @param wechatMPMessage - * @return - */ - private Map> createData(Order order, WechatMPMessage wechatMPMessage) { - WechatMessageData wechatMessageData = new WechatMessageData(); - List paramArray = JSONUtil.toList(wechatMPMessage.getKeywords(), String.class); - List texts = JSONUtil.toList(wechatMPMessage.getKeywordsText(), String.class); - Map params = new LinkedHashMap<>(); - for (int i = 0; i < paramArray.size(); i++) { - WechatMessageItemEnums wechatMessageItemEnums = WechatMessageItemEnums.valueOf(paramArray.get(i)); - //初始化参数内容 - String val = getParams(wechatMessageItemEnums, order); - val = StringUtils.subStringLength(val, 20); - params.put(texts.get(i), val); - } - wechatMessageData.setMpMessageData(params); - return wechatMessageData.createMPData(); - } - - /** - * 获取具体参数 - * - * @param itemEnums - * @param order - * @return - */ - private String getParams(WechatMessageItemEnums itemEnums, Order order) { - switch (itemEnums) { - case PRICE: - return order.getPriceDetailDTO().getFlowPrice().toString(); - case ORDER_SN: - return order.getSn(); - case SHOP_NAME: - return order.getStoreName(); - case GOODS_INFO: - List orderItems = orderItemService.getByOrderSn(order.getSn()); - StringBuffer stringBuffer = new StringBuffer(); - orderItems.forEach(orderItem -> { - stringBuffer.append(orderItem.getGoodsName() + "*" + orderItem.getNum() + " "); - }); - return stringBuffer.toString(); - case MEMBER_NAME: - return order.getMemberName(); - case LOGISTICS_NO: - return order.getLogisticsNo(); - case LOGISTICS_NAME: - return order.getLogisticsName(); - case LOGISTICS_TIME: - return DateUtil.toString(order.getLogisticsTime(), DateUtil.STANDARD_FORMAT); - - } - return ""; - } - - /** - * 如果返回信息有错误 - * - * @param jsonObject - */ - public static void wechatHandler(JSONObject jsonObject) { - if (jsonObject.containsKey("errmsg")) { - if (jsonObject.getStr("errmsg").equals("ok")) { - return; - } - throw new ServiceException("微信接口异常,请联系管理员:错误码" + jsonObject.get("errcode") + "," + jsonObject.getStr("errmsg")); - } - } - - /** - * 如果返回信息有错误 - * - * @param string - */ - public static String wechatHandler(String string) { - JSONObject jsonObject = new JSONObject(); - wechatHandler(jsonObject); - return string; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleLogPoint.java b/framework/src/main/java/cn/lili/modules/order/aftersale/aop/AfterSaleLogPoint.java similarity index 69% rename from framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleLogPoint.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/aop/AfterSaleLogPoint.java index abd8a8fa..5cbfde6a 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleLogPoint.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/aop/AfterSaleLogPoint.java @@ -1,4 +1,4 @@ -package cn.lili.modules.order.order.aop; +package cn.lili.modules.order.aftersale.aop; import java.lang.annotation.*; @@ -6,7 +6,7 @@ import java.lang.annotation.*; * 售后日志AOP注解 * * @author Chopper - * @date 2020/11/17 7:22 下午 + * @since 2020/11/17 7:22 下午 */ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @@ -27,4 +27,11 @@ public @interface AfterSaleLogPoint { */ String sn(); + + /** + * + * @return 售后状态 + */ + String serviceStatus() default ""; + } diff --git a/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleOperationLogAspect.java b/framework/src/main/java/cn/lili/modules/order/aftersale/aop/AfterSaleOperationLogAspect.java similarity index 79% rename from framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleOperationLogAspect.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/aop/AfterSaleOperationLogAspect.java index ecd11da7..660d76b2 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleOperationLogAspect.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/aop/AfterSaleOperationLogAspect.java @@ -1,13 +1,14 @@ -package cn.lili.modules.order.order.aop; +package cn.lili.modules.order.aftersale.aop; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.SpelUtil; import cn.lili.common.utils.ThreadPoolUtil; -import cn.lili.modules.order.trade.entity.dos.AfterSaleLog; -import cn.lili.modules.order.order.service.AfterSaleLogService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog; +import cn.lili.modules.order.aftersale.service.AfterSaleLogService; +import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; @@ -23,18 +24,17 @@ import java.util.Map; * 订单操作日志 * * @author Chopper - * @date 2020/11/17 7:22 下午 + * @since 2020/11/17 7:22 下午 */ @Slf4j @Aspect @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class AfterSaleOperationLogAspect { + @Autowired + private AfterSaleLogService afterSaleLogService; - private final AfterSaleLogService afterSaleLogService; - - @AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.order.order.aop.AfterSaleLogPoint)") + @AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.order.aftersale.aop.AfterSaleLogPoint)") public void afterReturning(JoinPoint joinPoint, Object rvt) { try { AuthUser auth = UserContext.getCurrentUser(); @@ -52,7 +52,7 @@ public class AfterSaleOperationLogAspect { //调用线程保存 ThreadPoolUtil.getPool().execute(new SaveAfterSaleLogThread(afterSaleLog, afterSaleLogService)); } catch (Exception e) { - e.printStackTrace(); + log.error("售后日志错误",e); } } @@ -64,11 +64,14 @@ public class AfterSaleOperationLogAspect { */ public static Map spelFormat(JoinPoint joinPoint, Object rvt) { - Map result = new HashMap<>(); + Map result = new HashMap<>(2); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); AfterSaleLogPoint afterSaleLogPoint = signature.getMethod().getAnnotation(AfterSaleLogPoint.class); String description = SpelUtil.compileParams(joinPoint, rvt, afterSaleLogPoint.description()); String sn = SpelUtil.compileParams(joinPoint, rvt, afterSaleLogPoint.sn()); + if (CharSequenceUtil.isNotEmpty(afterSaleLogPoint.serviceStatus())) { + description += AfterSaleStatusEnum.valueOf(SpelUtil.compileParams(joinPoint, rvt, afterSaleLogPoint.serviceStatus())).description(); + } result.put("description", description); result.put("sn", sn); return result; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/AfterSale.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSale.java similarity index 91% rename from framework/src/main/java/cn/lili/modules/order/order/entity/dos/AfterSale.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSale.java index c93d1bdc..212c4f3c 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/AfterSale.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSale.java @@ -1,6 +1,8 @@ -package cn.lili.modules.order.order.entity.dos; +package cn.lili.modules.order.aftersale.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -8,20 +10,15 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** * 售后 * * @author Chopper - * @date 2020/11/17 7:30 下午 + * @since 2020/11/17 7:30 下午 */ @Data -@Entity -@Table(name = "li_after_sale") @TableName("li_after_sale") @ApiModel(value = "售后") public class AfterSale extends BaseEntity { @@ -46,6 +43,7 @@ public class AfterSale extends BaseEntity { private String memberId; @ApiModelProperty(value = "会员名称") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; @ApiModelProperty(value = "商家ID") @@ -68,7 +66,6 @@ public class AfterSale extends BaseEntity { private String goodsName; @ApiModelProperty(value = "规格json") - @Column(columnDefinition = "TEXT") private String specs; @ApiModelProperty(value = "实际金额") private Double flowPrice; @@ -97,7 +94,7 @@ public class AfterSale extends BaseEntity { @ApiModelProperty(value = "售后单状态", allowableValues = "APPLY,PASS,REFUSE,BUYER_RETURN,SELLER_RE_DELIVERY,BUYER_CONFIRM,SELLER_CONFIRM,COMPLETE") private String serviceStatus; - // 退款信息 + //退款信息 /** * @see cn.lili.modules.order.trade.entity.enums.AfterSaleRefundWayEnum @@ -135,7 +132,9 @@ public class AfterSale extends BaseEntity { @ApiModelProperty(value = "退款时间") private Date refundTime; - // 买家物流信息 + /** + * 买家物流信息 + */ @ApiModelProperty(value = "发货单号") private String mLogisticsNo; diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/AfterSaleLog.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSaleLog.java similarity index 79% rename from framework/src/main/java/cn/lili/modules/order/trade/entity/dos/AfterSaleLog.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSaleLog.java index a70e8abd..af5bb3e1 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/AfterSaleLog.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSaleLog.java @@ -1,9 +1,9 @@ -package cn.lili.modules.order.trade.entity.dos; +package cn.lili.modules.order.aftersale.entity.dos; import cn.lili.common.security.enums.UserEnums; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -14,32 +14,19 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 售后日志 * * @author Bulbasaur - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 */ @Data -@Entity -@Table(name = "li_after_sale_log") @TableName("li_after_sale_log") @ApiModel(value = "售后日志") @NoArgsConstructor -public class AfterSaleLog { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class AfterSaleLog extends BaseIdEntity { @CreatedBy @TableField(fill = FieldFill.INSERT) diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/AfterSaleReason.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSaleReason.java similarity index 77% rename from framework/src/main/java/cn/lili/modules/order/order/entity/dos/AfterSaleReason.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSaleReason.java index 88cc7ab9..e0370f1e 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/AfterSaleReason.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dos/AfterSaleReason.java @@ -1,18 +1,20 @@ -package cn.lili.modules.order.order.entity.dos; +package cn.lili.modules.order.aftersale.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotNull; +/** + * 售后原因 + * + * @author Bulbasaur + * @since 2021/7/9 1:39 上午 + */ @Data -@Entity -@Table(name = "li_after_sale_reason") @TableName("li_after_sale_reason") @ApiModel(value = "售后原因") public class AfterSaleReason extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/AfterSaleDTO.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dto/AfterSaleDTO.java similarity index 95% rename from framework/src/main/java/cn/lili/modules/order/order/entity/dto/AfterSaleDTO.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/dto/AfterSaleDTO.java index e2fba22b..09c39259 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/AfterSaleDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dto/AfterSaleDTO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.order.order.entity.dto; +package cn.lili.modules.order.aftersale.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 售后dto * * @author Chopper - * @date 2021/3/20 10:48 + * @since 2021/3/20 10:48 */ @Data public class AfterSaleDTO { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/AfterSalePriceDetailDTO.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dto/AfterSalePriceDetailDTO.java similarity index 92% rename from framework/src/main/java/cn/lili/modules/order/order/entity/dto/AfterSalePriceDetailDTO.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/dto/AfterSalePriceDetailDTO.java index 613912f5..f18d6bd5 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/AfterSalePriceDetailDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/dto/AfterSalePriceDetailDTO.java @@ -1,7 +1,7 @@ -package cn.lili.modules.order.order.entity.dto; +package cn.lili.modules.order.aftersale.entity.dto; -import cn.lili.modules.promotion.entity.dto.BasePromotion; +import cn.lili.modules.promotion.entity.dos.BasePromotions; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -13,7 +13,7 @@ import java.util.List; * 商城退款流水 * * @author Chopper - * @date 2020/11/17 7:25 下午 + * @since 2020/11/17 7:25 下午 */ @Data public class AfterSalePriceDetailDTO implements Serializable { @@ -74,7 +74,7 @@ public class AfterSalePriceDetailDTO implements Serializable { * 参与的促销活动 */ @ApiModelProperty(value = "参与的促销活动") - private List joinPromotion; + private List joinPromotion; public AfterSalePriceDetailDTO() { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/ComplaintStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/enums/ComplaintStatusEnum.java similarity index 90% rename from framework/src/main/java/cn/lili/modules/order/order/entity/enums/ComplaintStatusEnum.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/enums/ComplaintStatusEnum.java index e2f4c1a3..67d173bf 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/ComplaintStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/enums/ComplaintStatusEnum.java @@ -1,10 +1,10 @@ -package cn.lili.modules.order.order.entity.enums; +package cn.lili.modules.order.aftersale.entity.enums; /** * 交易投诉状态 * * @author paulG - * @date 2020/12/4 + * @since 2020/12/4 **/ public enum ComplaintStatusEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleAllowOperation.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleAllowOperation.java similarity index 88% rename from framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleAllowOperation.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleAllowOperation.java index 566a29c3..cc449ad1 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleAllowOperation.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleAllowOperation.java @@ -1,6 +1,6 @@ -package cn.lili.modules.order.order.entity.vo; +package cn.lili.modules.order.aftersale.entity.vo; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,7 +9,7 @@ import lombok.Data; * 售后可操作类型 * * @author Chopper - * @date 2021/3/12 10:33 上午 + * @since 2021/3/12 10:33 上午 */ @Data public class AfterSaleAllowOperation { @@ -18,7 +18,7 @@ public class AfterSaleAllowOperation { private Boolean confirm = false; @ApiModelProperty(value = "可以回寄物流") - private Boolean return_goods = false; + private Boolean returnGoods = false; @ApiModelProperty(value = "可以收货") private Boolean rog = false; @@ -27,7 +27,7 @@ public class AfterSaleAllowOperation { private Boolean refund = false; @ApiModelProperty(value = "买家确认收货") - private Boolean buyer_confirm; + private Boolean buyerConfirm; @ApiModelProperty(value = "可以取消") private Boolean cancel; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleApplyVO.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleApplyVO.java similarity index 78% rename from framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleApplyVO.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleApplyVO.java index 5259e528..9d6577af 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleApplyVO.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleApplyVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.order.order.entity.vo; +package cn.lili.modules.order.aftersale.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 售后申请VO * * @author Chopper - * @date 2021/3/12 10:33 上午 + * @since 2021/3/12 10:33 上午 */ @Data public class AfterSaleApplyVO { @@ -47,4 +47,17 @@ public class AfterSaleApplyVO { */ @ApiModelProperty(value = "账号类型", allowableValues = "ALIPAY,WECHATPAY,MEMBERWALLET,BANKTRANSFER") private String accountType; + + @ApiModelProperty(value = "是否支持退货") + private Boolean returnGoods; + + @ApiModelProperty(value = "是否支持退款") + private Boolean returnMoney; + + @ApiModelProperty(value = "会员ID") + private String memberId; + + + + } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleSearchParams.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleSearchParams.java similarity index 65% rename from framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleSearchParams.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleSearchParams.java index 6243455b..66e91231 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleSearchParams.java @@ -1,12 +1,13 @@ -package cn.lili.modules.order.order.entity.vo; +package cn.lili.modules.order.aftersale.entity.vo; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; @@ -15,8 +16,9 @@ import java.util.Date; * 售后搜索参数 * * @author paulG - * @date 2020/12/4 + * @since 2020/12/4 **/ +@EqualsAndHashCode(callSuper = true) @Data public class AfterSaleSearchParams extends PageVO { @@ -44,6 +46,9 @@ public class AfterSaleSearchParams extends PageVO { @ApiModelProperty(value = "实际退款金额,可以为范围,如10_1000") private String actualRefundPrice; + @ApiModelProperty(value = "总价格,可以为范围,如10_1000") + private String flowPrice; + /** * @see cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum */ @@ -66,71 +71,76 @@ public class AfterSaleSearchParams extends PageVO { public QueryWrapper queryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); - if (StringUtils.isNotEmpty(sn)) { + if (CharSequenceUtil.isNotEmpty(sn)) { queryWrapper.like("sn", sn); } - if (StringUtils.isNotEmpty(orderSn)) { + if (CharSequenceUtil.isNotEmpty(orderSn)) { queryWrapper.like("order_sn", orderSn); } - // 按买家查询 - if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MEMBER.name())) { + //按买家查询 + if (CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MEMBER.name())) { queryWrapper.eq("member_id", UserContext.getCurrentUser().getId()); } - // 按卖家查询 - if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name())) { + //按卖家查询 + if (CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name())) { queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); } - if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MANAGER.name()) - && StringUtils.isNotEmpty(storeId) + if (CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MANAGER.name()) + && CharSequenceUtil.isNotEmpty(storeId) ) { - queryWrapper.eq("store_id", storeId); } - if (StringUtils.isNotEmpty(memberName)) { + if (CharSequenceUtil.isNotEmpty(memberName)) { queryWrapper.like("member_name", memberName); } - if (StringUtils.isNotEmpty(storeName)) { + if (CharSequenceUtil.isNotEmpty(storeName)) { queryWrapper.like("store_name", storeName); } - if (StringUtils.isNotEmpty(goodsName)) { + if (CharSequenceUtil.isNotEmpty(goodsName)) { queryWrapper.like("goods_name", goodsName); } - // 按时间查询 + //按时间查询 if (startDate != null) { queryWrapper.ge("create_time", startDate); } if (endDate != null) { queryWrapper.le("create_time", endDate); } - if (StringUtils.isNotEmpty(serviceStatus)) { + if (CharSequenceUtil.isNotEmpty(serviceStatus)) { queryWrapper.eq("service_status", serviceStatus); } - if (StringUtils.isNotEmpty(serviceType)) { + if (CharSequenceUtil.isNotEmpty(serviceType)) { queryWrapper.eq("service_type", serviceType); } this.betweenWrapper(queryWrapper); queryWrapper.eq("delete_flag", false); - - queryWrapper.orderByDesc("create_time"); return queryWrapper; } private void betweenWrapper(QueryWrapper queryWrapper) { - if (StringUtils.isNotEmpty(applyRefundPrice)) { + if (CharSequenceUtil.isNotEmpty(applyRefundPrice)) { String[] s = applyRefundPrice.split("_"); if (s.length > 1) { - queryWrapper.ge("apply_refund_price", s[1]); + queryWrapper.between("apply_refund_price", s[0], s[1]); } else { - queryWrapper.le("apply_refund_price", s[0]); + queryWrapper.ge("apply_refund_price", s[0]); } } - if (StringUtils.isNotEmpty(actualRefundPrice)) { + if (CharSequenceUtil.isNotEmpty(actualRefundPrice)) { String[] s = actualRefundPrice.split("_"); if (s.length > 1) { - queryWrapper.ge("actual_refund_price", s[1]); + queryWrapper.between("actual_refund_price", s[0], s[1]); } else { - queryWrapper.le("actual_refund_price", s[0]); + queryWrapper.ge("actual_refund_price", s[0]); + } + } + if (CharSequenceUtil.isNotEmpty(flowPrice)) { + String[] s = flowPrice.split("_"); + if (s.length > 1) { + queryWrapper.between("flow_price", s[0], s[1]); + } else { + queryWrapper.ge("flow_price", s[0]); } } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleVO.java b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleVO.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleVO.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleVO.java index 060bce3e..28766e48 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AfterSaleVO.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/entity/vo/AfterSaleVO.java @@ -1,19 +1,19 @@ -package cn.lili.modules.order.order.entity.vo; +package cn.lili.modules.order.aftersale.entity.vo; -import cn.lili.modules.order.order.entity.dos.AfterSale; -import jdk.nashorn.internal.objects.annotations.Getter; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import lombok.Data; /** * 售后VO * * @author Chopper - * @date 2021/3/12 10:32 上午 + * @since 2021/3/12 10:32 上午 */ +@Data public class AfterSaleVO extends AfterSale { /** * 初始化自身状态 */ - @Getter public AfterSaleAllowOperation getAfterSaleAllowOperationVO() { //设置订单的可操作状态 diff --git a/framework/src/main/java/cn/lili/modules/order/trade/mapper/AfterSaleLogMapper.java b/framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleLogMapper.java similarity index 57% rename from framework/src/main/java/cn/lili/modules/order/trade/mapper/AfterSaleLogMapper.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleLogMapper.java index 8315d63d..a1f59f19 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/mapper/AfterSaleLogMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleLogMapper.java @@ -1,13 +1,13 @@ -package cn.lili.modules.order.trade.mapper; +package cn.lili.modules.order.aftersale.mapper; -import cn.lili.modules.order.trade.entity.dos.AfterSaleLog; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 售后日志数据处理层 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface AfterSaleLogMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/AfterSaleMapper.java b/framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleMapper.java similarity index 60% rename from framework/src/main/java/cn/lili/modules/order/order/mapper/AfterSaleMapper.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleMapper.java index 5a039982..7cad30d5 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/AfterSaleMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleMapper.java @@ -1,7 +1,7 @@ -package cn.lili.modules.order.order.mapper; +package cn.lili.modules.order.aftersale.mapper; -import cn.lili.modules.order.order.entity.dos.AfterSale; -import cn.lili.modules.order.order.entity.vo.AfterSaleVO; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -13,13 +13,26 @@ import org.apache.ibatis.annotations.Select; * 售后数据处理层 * * @author Chopper - * @date 2020/11/17 7:34 下午 + * @since 2020/11/17 7:34 下午 */ public interface AfterSaleMapper extends BaseMapper { + /** + * 获取售后VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 售后VO分页 + */ @Select("SELECT * FROM li_after_sale ${ew.customSqlSegment}") IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 根据售后编号获取售后VO + * + * @param sn 售后编号 + * @return 售后VO + */ @Select("SELECT * FROM li_after_sale WHERE sn=#{sn}") AfterSaleVO getAfterSaleVO(String sn); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/AfterSaleReasonMapper.java b/framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleReasonMapper.java similarity index 57% rename from framework/src/main/java/cn/lili/modules/order/order/mapper/AfterSaleReasonMapper.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleReasonMapper.java index 2e0f2d7b..a1298b83 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/AfterSaleReasonMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/mapper/AfterSaleReasonMapper.java @@ -1,13 +1,13 @@ -package cn.lili.modules.order.order.mapper; +package cn.lili.modules.order.aftersale.mapper; -import cn.lili.modules.order.order.entity.dos.AfterSaleReason; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 售后原因数据处理层 * * @author Chopper - * @date 2020/11/17 7:34 下午 + * @since 2020/11/17 7:34 下午 */ public interface AfterSaleReasonMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleLogService.java b/framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleLogService.java similarity index 71% rename from framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleLogService.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleLogService.java index 9cd4bd68..dc7ddf71 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleLogService.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleLogService.java @@ -1,6 +1,6 @@ -package cn.lili.modules.order.order.service; +package cn.lili.modules.order.aftersale.service; -import cn.lili.modules.order.trade.entity.dos.AfterSaleLog; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -9,7 +9,7 @@ import java.util.List; * 订单日志业务层 * * @author Chopper - * @date 2020/11/17 7:37 下午 + * @since 2020/11/17 7:37 下午 */ public interface AfterSaleLogService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleReasonService.java b/framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleReasonService.java similarity index 78% rename from framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleReasonService.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleReasonService.java index cdd65be7..eee8437e 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleReasonService.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleReasonService.java @@ -1,6 +1,6 @@ -package cn.lili.modules.order.order.service; +package cn.lili.modules.order.aftersale.service; -import cn.lili.modules.order.order.entity.dos.AfterSaleReason; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -9,7 +9,7 @@ import java.util.List; * 售后原因业务层 * * @author Chopper - * @date 2020/11/17 7:37 下午 + * @since 2020/11/17 7:37 下午 */ public interface AfterSaleReasonService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleService.java b/framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleService.java similarity index 70% rename from framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleService.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleService.java index 41baf6ff..9a16a4cb 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleService.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/service/AfterSaleService.java @@ -1,25 +1,24 @@ -package cn.lili.modules.order.order.service; +package cn.lili.modules.order.aftersale.service; -import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.order.entity.dos.AfterSale; -import cn.lili.modules.order.order.entity.dto.AfterSaleDTO; -import cn.lili.modules.order.order.entity.vo.AfterSaleApplyVO; -import cn.lili.modules.order.order.entity.vo.AfterSaleSearchParams; -import cn.lili.modules.order.order.entity.vo.AfterSaleVO; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO; import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; import cn.lili.modules.system.entity.vo.Traces; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Date; +import java.util.List; /** * 售后业务层 * * @author Chopper - * @date 2020/11/17 7:36 下午 + * @since 2020/11/17 7:36 下午 */ public interface AfterSaleService extends IService { @@ -31,6 +30,14 @@ public interface AfterSaleService extends IService { */ IPage getAfterSalePages(AfterSaleSearchParams saleSearchParams); + /** + * 查询导出售后信息 + * + * @param saleSearchParams 查询参数 + * @return 分页售后信息 + */ + List exportAfterSaleOrder(AfterSaleSearchParams saleSearchParams); + /** * 查询售后信息 * @@ -45,7 +52,7 @@ public interface AfterSaleService extends IService { * @param sn 订单编号 * @return */ - AfterSaleApplyVO getAfterSaleDTO(String sn); + AfterSaleApplyVO getAfterSaleVO(String sn); /** * 售后申请 @@ -61,19 +68,25 @@ public interface AfterSaleService extends IService { * @param afterSaleSn 售后编号 * @param serviceStatus 状态 PASS:审核通过,REFUSE:审核未通过 * @param remark 商家备注 + * @param actualRefundPrice 退款金额 + * @return 售后 */ - AfterSale review(String afterSaleSn, String serviceStatus, String remark,Double actualRefundPrice); + AfterSale review(String afterSaleSn, String serviceStatus, String remark, Double actualRefundPrice); /** * 买家退货,物流填写 * - * @param afterSaleSn 售后服务单号 - * @param logisticsNo 物流单号 - * @param logisticsId 物流公司ID + * @param afterSaleSn 售后服务单号 + * @param logisticsNo 物流单号 + * @param logisticsId 物流公司ID + * @param mDeliverTime 买家退货发货时间 + * @return 售后 */ AfterSale buyerDelivery(String afterSaleSn, String logisticsNo, String logisticsId, Date mDeliverTime); - /* 获取买家退货物流踪迹 + /** + * 获取买家退货物流踪迹 + * * @param afterSaleSn 售后服务单号 * @return 物流踪迹 */ @@ -114,13 +127,6 @@ public interface AfterSaleService extends IService { */ AfterSale cancel(String afterSaleSn); - /** - * 获取待处理售后数量 - * - * @param serviceType 售后类型 - * @return 待处理售后数量 - */ - Integer applyNum(String serviceType); /** * 根据售后单号获取店铺退货收货地址信息 @@ -130,12 +136,4 @@ public interface AfterSaleService extends IService { */ StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO(String sn); - /** - * 获取统计的售后 - * - * @param statisticsQueryParam 统计搜索参数 - * @param pageVO 分页 - * @return 售后分页列表 - */ - IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleLogServiceImpl.java similarity index 65% rename from framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleLogServiceImpl.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleLogServiceImpl.java index 565bca53..0f17546f 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleLogServiceImpl.java @@ -1,13 +1,12 @@ -package cn.lili.modules.order.order.serviceimpl; +package cn.lili.modules.order.aftersale.serviceimpl; -import cn.lili.modules.order.order.service.AfterSaleLogService; -import cn.lili.modules.order.trade.entity.dos.AfterSaleLog; -import cn.lili.modules.order.trade.mapper.AfterSaleLogMapper; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog; +import cn.lili.modules.order.aftersale.mapper.AfterSaleLogMapper; +import cn.lili.modules.order.aftersale.service.AfterSaleLogService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -15,10 +14,9 @@ import java.util.List; * 订单日志业务层实现 * * @author Chopper - * @date 2020/11/17 7:37 下午 + * @since 2020/11/17 7:37 下午 */ @Service -@Transactional public class AfterSaleLogServiceImpl extends ServiceImpl implements AfterSaleLogService { @Override diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleReasonServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleReasonServiceImpl.java similarity index 80% rename from framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleReasonServiceImpl.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleReasonServiceImpl.java index df63cafe..283872d0 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleReasonServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleReasonServiceImpl.java @@ -1,25 +1,23 @@ -package cn.lili.modules.order.order.serviceimpl; +package cn.lili.modules.order.aftersale.serviceimpl; -import cn.lili.modules.order.order.entity.dos.AfterSaleReason; -import cn.lili.modules.order.order.mapper.AfterSaleReasonMapper; -import cn.lili.modules.order.order.service.AfterSaleReasonService; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason; +import cn.lili.modules.order.aftersale.mapper.AfterSaleReasonMapper; +import cn.lili.modules.order.aftersale.service.AfterSaleReasonService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import javax.transaction.Transactional; import java.util.List; /** * 售后原因业务层实现 * * @author Chopper - * @date 2020/11/17 7:38 下午 + * @since 2020/11/17 7:38 下午 */ @Service -@Transactional public class AfterSaleReasonServiceImpl extends ServiceImpl implements AfterSaleReasonService { diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleServiceImpl.java similarity index 56% rename from framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleServiceImpl.java rename to framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleServiceImpl.java index aae3910e..4d319d36 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/aftersale/serviceimpl/AfterSaleServiceImpl.java @@ -1,137 +1,175 @@ -package cn.lili.modules.order.order.serviceimpl; +package cn.lili.modules.order.aftersale.serviceimpl; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.json.JSONUtil; -import cn.lili.common.aop.syslog.annotation.SystemLogPoint; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.AfterSaleTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.utils.*; -import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; -import cn.lili.modules.order.order.aop.AfterSaleLogPoint; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.utils.SnowFlake; +import cn.lili.modules.order.aftersale.aop.AfterSaleLogPoint; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO; +import cn.lili.modules.order.aftersale.mapper.AfterSaleMapper; +import cn.lili.modules.order.aftersale.service.AfterSaleService; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.OrderItem; -import cn.lili.modules.order.order.entity.dto.AfterSaleDTO; import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.order.order.entity.vo.AfterSaleApplyVO; -import cn.lili.modules.order.order.entity.vo.AfterSaleSearchParams; -import cn.lili.modules.order.order.entity.vo.AfterSaleVO; -import cn.lili.modules.order.order.mapper.AfterSaleMapper; -import cn.lili.modules.order.order.service.AfterSaleService; import cn.lili.modules.order.order.service.OrderItemService; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.trade.entity.enums.AfterSaleRefundWayEnum; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.RefundSupport; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.util.StatisticsDateUtil; import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; -import cn.lili.modules.store.entity.enums.StoreStatusEnum; import cn.lili.modules.store.service.StoreDetailService; +import cn.lili.modules.system.aspect.annotation.SystemLogPoint; import cn.lili.modules.system.entity.dos.Logistics; import cn.lili.modules.system.entity.vo.Traces; import cn.lili.modules.system.service.LogisticsService; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.AfterSaleTagsEnum; 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.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import javax.transaction.Transactional; import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * 售后业务层实现 * * @author Chopper - * @date 2020/11/17 7:38 下午 + * @since 2020/11/17 7:38 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class AfterSaleServiceImpl extends ServiceImpl implements AfterSaleService { - //订单 - private final OrderService orderService; - //订单货物 - private final OrderItemService orderItemService; - //物流公司 - private final LogisticsService logisticsService; - //店铺详情 - private final StoreDetailService storeDetailService; - //售后支持,这里用于退款操作 + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 订单货物 + */ + @Autowired + private OrderItemService orderItemService; + /** + * 物流公司 + */ + @Autowired + private LogisticsService logisticsService; + /** + * 店铺详情 + */ + @Autowired + private StoreDetailService storeDetailService; + /** + * 售后支持,这里用于退款操作 + */ + @Autowired private RefundSupport refundSupport; - //RocketMQ配置 - private final RocketmqCustomProperties rocketmqCustomProperties; - //RocketMQ - private final RocketMQTemplate rocketMQTemplate; + /** + * RocketMQ配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + /** + * RocketMQ + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; @Override public IPage getAfterSalePages(AfterSaleSearchParams saleSearchParams) { return baseMapper.queryByParams(PageUtil.initPage(saleSearchParams), saleSearchParams.queryWrapper()); } + @Override + public List exportAfterSaleOrder(AfterSaleSearchParams saleSearchParams) { + return this.list(saleSearchParams.queryWrapper()); + } + @Override public AfterSaleVO getAfterSale(String sn) { return this.baseMapper.getAfterSaleVO(sn); } @Override - public AfterSaleApplyVO getAfterSaleDTO(String sn) { + public AfterSaleApplyVO getAfterSaleVO(String sn) { AfterSaleApplyVO afterSaleApplyVO = new AfterSaleApplyVO(); //获取订单货物判断是否可申请售后 OrderItem orderItem = orderItemService.getBySn(sn); - //未申请售后订单货物才能进行申请 - if (!orderItem.getAfterSaleStatus().equals(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name())) { + //未申请售后订单货物或部分售后才能进行申请 + if (!orderItem.getAfterSaleStatus().equals(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name()) + && !orderItem.getAfterSaleStatus().equals(OrderItemAfterSaleStatusEnum.PART_AFTER_SALE.name())) { throw new ServiceException(ResultCode.AFTER_SALES_BAN); } //获取售后类型 - Order order = orderService.getBySn(orderItem.getOrderSn()); + Order order = OperationalJudgment.judgment(orderService.getBySn(orderItem.getOrderSn())); //订单未支付,不能申请申请售后 if (order.getPaymentMethod() == null) { throw new ServiceException(ResultCode.AFTER_SALES_NOT_PAY_ERROR); } //判断支付方式是否为线上支付 - if (order.getPaymentMethod().equals(PaymentMethodEnum.BANK_TRANSFER)) { + if (order.getPaymentMethod().equals(PaymentMethodEnum.BANK_TRANSFER.name())) { afterSaleApplyVO.setRefundWay(AfterSaleRefundWayEnum.OFFLINE.name()); } else { afterSaleApplyVO.setRefundWay(AfterSaleRefundWayEnum.ORIGINAL.name()); } + //判断订单类型,虚拟订单只支持退款 + if (order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name())) { + afterSaleApplyVO.setReturnMoney(true); + afterSaleApplyVO.setReturnGoods(false); + } else { + afterSaleApplyVO.setReturnMoney(true); + afterSaleApplyVO.setReturnGoods(true); + } afterSaleApplyVO.setAccountType(order.getPaymentMethod()); - afterSaleApplyVO.setApplyRefundPrice(CurrencyUtil.sub(orderItem.getFlowPrice(), orderItem.getNum())); + afterSaleApplyVO.setApplyRefundPrice(CurrencyUtil.div(orderItem.getFlowPrice(), orderItem.getNum())); afterSaleApplyVO.setNum(orderItem.getNum()); afterSaleApplyVO.setGoodsId(orderItem.getGoodsId()); afterSaleApplyVO.setGoodsName(orderItem.getGoodsName()); afterSaleApplyVO.setImage(orderItem.getImage()); afterSaleApplyVO.setGoodsPrice(orderItem.getGoodsPrice()); afterSaleApplyVO.setSkuId(orderItem.getSkuId()); + afterSaleApplyVO.setMemberId(order.getMemberId()); return afterSaleApplyVO; } @Override @AfterSaleLogPoint(sn = "#rvt.sn", description = "'售后申请:售后编号['+#rvt.sn+']'") @SystemLogPoint(description = "售后-售后申请", customerLog = "'售后申请:售后编号['+#rvt.sn+']'") + @Transactional(rollbackFor = Exception.class) public AfterSale saveAfterSale(AfterSaleDTO afterSaleDTO) { //检查当前订单是否可申请售后 @@ -141,24 +179,30 @@ public class AfterSaleServiceImpl extends ServiceImpl queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(AfterSale::getServiceStatus, StoreStatusEnum.APPLYING.name()); - queryWrapper.eq(StringUtils.isNotEmpty(serviceType), AfterSale::getServiceType, serviceType); - queryWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), - AfterSale::getStoreId, UserContext.getCurrentUser().getStoreId()); - return this.count(queryWrapper); - } - @Override public StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO(String sn) { - return storeDetailService.getStoreAfterSaleAddressDTO(this.getBySn(sn).getStoreId()); - } - - @Override - public IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); - queryWrapper.between(AfterSale::getCreateTime, dates[0], dates[1]); - queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()), AfterSale::getStoreId, statisticsQueryParam.getStoreId()); - - return this.page(PageUtil.initPage(pageVO), queryWrapper); + return storeDetailService.getStoreAfterSaleAddressDTO(OperationalJudgment.judgment(this.getBySn(sn)).getStoreId()); } /** @@ -347,7 +378,7 @@ public class AfterSaleServiceImpl extends ServiceImpl() + .eq(OrderItem::getOrderSn, afterSale.getOrderSn()) + .eq(OrderItem::getSkuId, afterSale.getSkuId())); + AfterSaleStatusEnum afterSaleStatusEnum = AfterSaleStatusEnum.valueOf(afterSale.getServiceStatus()); + + switch (afterSaleStatusEnum) { + //判断当前售后的状态---申请中 + case APPLY: { +// 买家申请售后时已经输入了订单售后数量,这里不需要(+x)处理 + orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() + afterSale.getNum()); + //修改orderItem订单 + this.updateOrderItem(orderItem); + break; + } + + //判断当前售后的状态---已拒绝,买家取消售后,卖家终止售后 + case REFUSE: + case BUYER_CANCEL: + case SELLER_TERMINATION: { + orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() - afterSale.getNum()); + //修改orderItem订单 + this.updateOrderItem(orderItem); + break; + } + default: + break; + } + } + + /** * 检查当前订单状态是否为可申请当前售后类型的状态 * @@ -405,18 +485,24 @@ public class AfterSaleServiceImpl extends ServiceImpl (orderItem.getNum() - orderItem.getReturnGoodsNumber())) { + throw new ServiceException(ResultCode.AFTER_GOODS_NUMBER_ERROR); + } + + //获取售后类型 Order order = orderService.getBySn(orderItem.getOrderSn()); AfterSaleTypeEnum afterSaleTypeEnum = AfterSaleTypeEnum.valueOf(afterSaleDTO.getServiceType()); @@ -429,8 +515,9 @@ public class AfterSaleServiceImpl extends ServiceImpl queryWrapper = Wrappers.lambdaUpdate(); queryWrapper.eq(AfterSale::getSn, afterSaleSn); this.update(afterSale, queryWrapper); } - @Autowired - public void setRefundSupport(RefundSupport refundSupport) { - this.refundSupport = refundSupport; - } - /** * 发送售后消息 * @@ -499,4 +582,76 @@ public class AfterSaleServiceImpl extends ServiceImpl afterSaleList) { + //根据售后状态获取不是已结束的售后记录 + List implementList = afterSaleList.stream() + .filter(afterSale -> afterSale.getServiceStatus().equals(AfterSaleStatusEnum.APPLY.name()) + || afterSale.getServiceStatus().equals(AfterSaleStatusEnum.PASS.name()) + || afterSale.getServiceStatus().equals(AfterSaleStatusEnum.BUYER_RETURN.name()) + || afterSale.getServiceStatus().equals(AfterSaleStatusEnum.SELLER_CONFIRM.name()) + || afterSale.getServiceStatus().equals(AfterSaleStatusEnum.WAIT_REFUND.name()) + || afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name())) + .collect(Collectors.toList()); + + if (!implementList.isEmpty()) { + //遍历售后记录获取售后商品数量 + implementList.forEach(a -> orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() + a.getNum())); + } + + //获取已完成售后订单数量 + List completeList = afterSaleList.stream() + .filter(afterSale -> afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name())) + .collect(Collectors.toList()); + + if (!completeList.isEmpty()) { + //遍历售后记录获取已完成售后商品数量 + completeList.forEach(a -> orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() + a.getNum())); + } + } + + /** + * 功能描述: 修改orderItem订单 + * + * @param orderItem + * @return void + * @author ftyy + **/ + private void updateOrderItem(OrderItem orderItem) { + //订单状态不能为新订单,已失效订单或未申请订单才可以去修改订单信息 + OrderItemAfterSaleStatusEnum afterSaleTypeEnum = OrderItemAfterSaleStatusEnum.valueOf(orderItem.getAfterSaleStatus()); + switch (afterSaleTypeEnum) { + //售后状态为:未申请 部分售后 已申请 + case NOT_APPLIED: + case PART_AFTER_SALE: + case ALREADY_APPLIED: { + //通过正在售后商品总数修改订单售后状态 + if (orderItem.getReturnGoodsNumber().equals(orderItem.getNum())) { + //修改订单的售后状态--已申请 + orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.ALREADY_APPLIED.name()); + } else if (orderItem.getReturnGoodsNumber().equals(0)) { + //修改订单的售后状态--未申请 + orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name()); + } else { + //修改订单的售后状态--部分售后 + orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.PART_AFTER_SALE.name()); + } + break; + } + + default: + break; + } + orderItemService.update(new LambdaUpdateWrapper() + .eq(OrderItem::getSn, orderItem.getSn()) + .set(OrderItem::getAfterSaleStatus, orderItem.getAfterSaleStatus()) + .set(OrderItem::getReturnGoodsNumber, orderItem.getReturnGoodsNumber())); + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/MemberCouponDTO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/MemberCouponDTO.java index 413956d5..2f70401d 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/MemberCouponDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/MemberCouponDTO.java @@ -10,7 +10,7 @@ import java.util.Map; * 用于计算优惠券结算详情 * * @author Chopper - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 */ @Data public class MemberCouponDTO implements Serializable { @@ -19,7 +19,7 @@ public class MemberCouponDTO implements Serializable { private static final long serialVersionUID = 8276369124551043085L; /** * 在整比交易中时: key 为店铺id,value 为每个店铺跨店优惠 结算金额 - * 在购物车中时: key为sku id ,value为每个商品结算时的金额 + * 在购物车中时:key为sku id ,value为每个商品结算时的金额 */ private Map skuDetail; @@ -28,13 +28,6 @@ public class MemberCouponDTO implements Serializable { */ private MemberCoupon memberCoupon; - public MemberCouponDTO() { - } - - public MemberCouponDTO(MemberCoupon memberCoupon) { - this.memberCoupon = memberCoupon; - } - public MemberCouponDTO(Map skuDetail, MemberCoupon memberCoupon) { this.skuDetail = skuDetail; this.memberCoupon = memberCoupon; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/StoreRemarkDTO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/StoreRemarkDTO.java index f9d2d981..a016057e 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/StoreRemarkDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/StoreRemarkDTO.java @@ -9,13 +9,13 @@ import java.io.Serializable; * 店铺备注 * * @author Chopper - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 */ @Data public class StoreRemarkDTO implements Serializable { private static final long serialVersionUID = -6793274046513576434L; - @ApiModelProperty(value = "商家id") + @ApiModelProperty(value = "店铺id") private String storeId; @ApiModelProperty(value = "备注") diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java index fb9ae4e9..d522286e 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java @@ -1,14 +1,17 @@ package cn.lili.modules.order.cart.entity.dto; import cn.lili.modules.member.entity.dos.MemberAddress; -import cn.lili.modules.order.cart.entity.enums.SuperpositionPromotionEnum; -import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; -import cn.lili.modules.order.order.entity.vo.OrderVO; -import cn.lili.modules.order.order.entity.vo.ReceiptVO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; +import cn.lili.modules.order.cart.entity.enums.SuperpositionPromotionEnum; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.entity.vo.PriceDetailVO; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.order.order.entity.vo.OrderVO; +import cn.lili.modules.order.order.entity.vo.ReceiptVO; +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.vos.MemberCouponVO; +import cn.lili.modules.store.entity.dos.StoreAddress; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -17,12 +20,13 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 购物车视图 * * @author Chopper - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 */ @Data public class TradeDTO implements Serializable { @@ -53,22 +57,16 @@ public class TradeDTO implements Serializable { @ApiModelProperty(value = "是否需要发票") private Boolean needReceipt; + + @ApiModelProperty(value = "不支持配送方式") + private List notSupportFreight; + /** * 购物车类型 */ private CartTypeEnum cartTypeEnum; - /** - * key 为商家id - * value 为商家优惠券 - * 商家优惠券 - */ - private Map storeCoupons; - - /** - * key 为商家id - * value 为商家优惠券 - * 商家优惠券 + * 店铺备注 */ private List storeRemark; @@ -87,11 +85,33 @@ public class TradeDTO implements Serializable { */ private MemberCouponDTO platformCoupon; + /** + * key 为商家id + * value 为商家优惠券 + * 店铺优惠券 + */ + private Map storeCoupons; + + /** + * 可用优惠券列表 + */ + private List canUseCoupons; + + /** + * 无法使用优惠券无法使用的原因 + */ + private List cantUseCoupons; + /** * 收货地址 */ private MemberAddress memberAddress; + /** + * 自提地址 + */ + private StoreAddress storeAddress; + /** * 客户端类型 */ @@ -118,17 +138,36 @@ public class TradeDTO implements Serializable { private List orderVO; public TradeDTO(CartTypeEnum cartTypeEnum) { + this.cartTypeEnum = cartTypeEnum; + this.skuList = new ArrayList<>(); this.cartList = new ArrayList<>(); this.skuPromotionDetail = new HashMap<>(); this.storeCoupons = new HashMap<>(); - this.storeCoupons = new HashMap<>(); this.priceDetailDTO = new PriceDetailDTO(); - this.cartTypeEnum = cartTypeEnum; + this.cantUseCoupons = new ArrayList<>(); + this.canUseCoupons = new ArrayList<>(); this.needReceipt = false; } public TradeDTO() { this(CartTypeEnum.CART); } + + /** + * 过滤购物车中已选择的sku + * + * @return + */ + public List getCheckedSkuList() { + if (skuList != null && !skuList.isEmpty()) { + return skuList.stream().filter(CartSkuVO::getChecked).collect(Collectors.toList()); + } + return skuList; + } + + public void removeCoupon() { + this.canUseCoupons = new ArrayList<>(); + this.cantUseCoupons = new ArrayList<>(); + } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java index 054f5e1c..2a6073b7 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.cart.entity.enums; * 购物车类型 * * @author Chopper - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 */ public enum CartTypeEnum { @@ -16,6 +16,10 @@ public enum CartTypeEnum { * 立即购买 */ BUY_NOW, + /** + * 虚拟商品 + */ + VIRTUAL, /** * 拼团 */ @@ -24,5 +28,13 @@ public enum CartTypeEnum { * 积分 */ POINTS, + /** + * 砍价商品 + */ + KANJIA; + + public String getPrefix() { + return "{" + this.name() + "}_"; + } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/DeliveryMethodEnum.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/DeliveryMethodEnum.java index 01c58035..c329cba9 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/DeliveryMethodEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/DeliveryMethodEnum.java @@ -4,12 +4,21 @@ package cn.lili.modules.order.cart.entity.enums; * 配送方式 * * @author paulG - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 **/ public enum DeliveryMethodEnum { + /** + * "自提" + */ SELF_PICK_UP("自提"), + /** + * "同城配送" + */ LOCAL_TOWN_DELIVERY("同城配送"), + /** + * "物流" + */ LOGISTICS("物流"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/RenderStepEnums.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/RenderStepEnums.java new file mode 100644 index 00000000..2f429923 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/RenderStepEnums.java @@ -0,0 +1,31 @@ +package cn.lili.modules.order.cart.entity.enums; + +/** + * 购物车渲染枚举 + */ +public enum RenderStepEnums { + + /** + * 购物车渲染枚举 + */ + CHECK_DATA("校验商品"), + CHECKED_FILTER("选择商品过滤"), + COUPON("优惠券价格渲染"), + SKU_PROMOTION("商品促销计算"), + FULL_DISCOUNT("满减计算"), + SKU_FREIGHT("运费计算"), + DISTRIBUTION("分配需要分配的促销金额"), + PLATFORM_COMMISSION("平台佣金"), + CART_PRICE("购物车金额计算"), + CART_SN("交易编号创建"); + + private String distribution; + + public String getDistribution() { + return distribution; + } + + RenderStepEnums(String distribution) { + this.distribution = distribution; + } +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/SuperpositionPromotionEnum.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/SuperpositionPromotionEnum.java index 9c7f793e..eaa97222 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/SuperpositionPromotionEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/SuperpositionPromotionEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.cart.entity.enums; * 活动叠加 * * @author Chopper - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 */ public enum SuperpositionPromotionEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/TradeCacheEnum.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/TradeCacheEnum.java deleted file mode 100644 index 6a98ed64..00000000 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/TradeCacheEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.lili.modules.order.cart.entity.enums; - -/** - * 交易缓存枚举 - * - * @author Chopper - * @date 2020-03-25 2:30 下午 - */ -public enum TradeCacheEnum { - - //================交易================= - - /** - * 拼团 - */ - PINTUAN, - /** - * 购物车原始数据 - */ - CART_DATA, - /** - * 立即购买购物车原始数据 - */ - BUY_NOW_CART_DATA; - - - public String getPrefix() { - return "{" + this.name() + "}_"; - } -} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartBase.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartBase.java index 50eea20a..515d1925 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartBase.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartBase.java @@ -10,7 +10,7 @@ import java.io.Serializable; * 购物车基础 * * @author Chopper - * @date 2020-03-24 10:33 上午 + * @since 2020-03-24 10:33 上午 */ @Data public class CartBase implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java index 29d2be87..938c9fb3 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java @@ -1,25 +1,28 @@ package cn.lili.modules.order.cart.entity.vo; +import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.distribution.entity.dos.DistributionGoods; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; +import cn.lili.modules.promotion.tools.PromotionTools; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import java.io.Serializable; -import java.util.Date; -import java.util.List; +import java.util.Map; /** * 购物车中的产品 * * @author Chopper - * @date 2020-03-24 10:33 上午 + * @since 2020-03-24 10:33 上午 */ @Data @NoArgsConstructor +@EqualsAndHashCode(callSuper = true) public class CartSkuVO extends CartBase implements Serializable { @@ -45,19 +48,18 @@ public class CartSkuVO extends CartBase implements Serializable { @ApiModelProperty(value = "小记") private Double subTotal; + + @ApiModelProperty(value = "小记") + private Double utilPrice; /** * 是否选中,要去结算 0:未选中 1:已选中,默认 */ @ApiModelProperty(value = "是否选中,要去结算") private Boolean checked; - @ApiModelProperty(value = "是否免运费") private Boolean isFreeFreight; - @ApiModelProperty(value = "积分购买 积分数量") - private Integer point; - @ApiModelProperty(value = "是否失效 ") private Boolean invalid; @@ -67,16 +69,21 @@ public class CartSkuVO extends CartBase implements Serializable { @ApiModelProperty(value = "是否可配送") private Boolean isShip; - @ApiModelProperty(value = - "拼团id 如果是拼团购买 此值为拼团活动id," + - "当pintuanId为空,则表示普通购买(或者拼团商品,单独购买)") + @ApiModelProperty(value = "拼团id 如果是拼团购买 此值为拼团活动id," + + "当pintuanId为空,则表示普通购买(或者拼团商品,单独购买)") private String pintuanId; - @ApiModelProperty(value = "可参与的单品活动") - private List promotions; + @ApiModelProperty(value = "砍价ID") + private String kanjiaId; - @ApiModelProperty(value = "参与促销活动更新时间(一天更新一次) 例如时间为:2020-01-01 00:00:01") - private Date updatePromotionTime; + @ApiModelProperty(value = "积分兑换ID") + private String pointsId; + + @ApiModelProperty(value = "积分购买 积分数量") + private Long point; + + @ApiModelProperty("商品促销活动集合,key 为 促销活动类型,value 为 促销活动实体信息 ") + private Map promotionMap; /** * @see CartTypeEnum @@ -84,20 +91,59 @@ public class CartSkuVO extends CartBase implements Serializable { @ApiModelProperty(value = "购物车类型") private CartTypeEnum cartType; + /** + * @see DeliveryMethodEnum + */ + @ApiModelProperty(value = "配送方式") + private String deliveryMethod; + /** * 在构造器里初始化促销列表,规格列表 */ public CartSkuVO(GoodsSku goodsSku) { this.goodsSku = goodsSku; + if (goodsSku.getUpdateTime() == null) { + this.goodsSku.setUpdateTime(goodsSku.getCreateTime()); + } this.checked = true; this.invalid = false; //默认时间为0,让系统为此商品更新缓存 - this.updatePromotionTime = new Date(0); this.errorMessage = ""; this.isShip = true; - this.purchasePrice = goodsSku.getIsPromotion() != null && goodsSku.getIsPromotion() ? goodsSku.getPromotionPrice() : goodsSku.getPrice(); + this.purchasePrice = goodsSku.getPromotionFlag() != null && goodsSku.getPromotionFlag() ? goodsSku.getPromotionPrice() : goodsSku.getPrice(); this.isFreeFreight = false; + this.utilPrice = goodsSku.getPromotionFlag() != null && goodsSku.getPromotionFlag() ? goodsSku.getPromotionPrice() : goodsSku.getPrice(); this.setStoreId(goodsSku.getStoreId()); this.setStoreName(goodsSku.getStoreName()); } + + /** + * 在构造器里初始化促销列表,规格列表 + */ + public CartSkuVO(GoodsSku goodsSku, Map promotionMap) { + this(goodsSku); + if (promotionMap != null && !promotionMap.isEmpty()) { + this.promotionMap = promotionMap; + } + } + + public void rebuildBySku(GoodsSku goodsSku) { + this.goodsSku = goodsSku; + this.purchasePrice = goodsSku.getPromotionFlag() != null && goodsSku.getPromotionFlag() ? goodsSku.getPromotionPrice() : goodsSku.getPrice(); + this.utilPrice = goodsSku.getPromotionFlag() != null && goodsSku.getPromotionFlag() ? goodsSku.getPromotionPrice() : goodsSku.getPrice(); + + + //计算购物车小计 + this.subTotal = CurrencyUtil.mul(this.getPurchasePrice(), this.getNum()); + this.setStoreId(goodsSku.getStoreId()); + this.setStoreName(goodsSku.getStoreName()); + } + + public Map getPromotionMap() { + return PromotionTools.filterInvalidPromotionsMap(this.promotionMap); + } + + public Map getNotFilterPromotionMap() { + return this.promotionMap; + } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java index f93fd268..e5ca96b6 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java @@ -2,23 +2,27 @@ package cn.lili.modules.order.cart.entity.vo; import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.vos.CouponVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * 购物车展示VO * * @author Chopper - * @date 2020-03-24 10:33 上午 + * @since 2020-03-24 10:33 上午 */ @Data @ApiModel(description = "购物车") +@NoArgsConstructor public class CartVO extends CartBase implements Serializable { private static final long serialVersionUID = -5651775413457562422L; @@ -44,6 +48,8 @@ public class CartVO extends CartBase implements Serializable { @ApiModelProperty(value = "使用的优惠券列表") private List couponList; + @ApiModelProperty(value = "使用的优惠券列表") + private List canReceiveCoupon; @ApiModelProperty(value = "赠品列表") private List giftList; @@ -72,16 +78,15 @@ public class CartVO extends CartBase implements Serializable { @ApiModelProperty(value = "已参与的的促销活动提示,直接展示给客户") private String promotionNotice; - public CartVO() { - } - public CartVO(CartSkuVO cartSkuVO) { this.setStoreId(cartSkuVO.getStoreId()); this.setStoreName(cartSkuVO.getStoreName()); + this.setDeliveryMethod(cartSkuVO.getDeliveryMethod()); this.setSkuList(new ArrayList<>()); this.setCouponList(new ArrayList<>()); this.setGiftList(new ArrayList<>()); this.setGiftCouponList(new ArrayList<>()); + this.setCanReceiveCoupon(new ArrayList<>()); this.setChecked(false); this.isFull = false; this.weight = 0d; @@ -89,11 +94,25 @@ public class CartVO extends CartBase implements Serializable { this.remark = ""; } - public void add(Integer goodsNum) { + public void addGoodsNum(Integer goodsNum) { if (this.goodsNum == null) { this.goodsNum = goodsNum; } else { this.goodsNum += goodsNum; } } + + + /** + * 过滤购物车中已选择的sku + * + * @return + */ + public List getCheckedSkuList() { + if (skuList != null && !skuList.isEmpty()) { + return skuList.stream().filter(CartSkuVO::getChecked).collect(Collectors.toList()); + } + return skuList; + } + } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/FullDiscountVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/FullDiscountVO.java index 8422fdf3..27b061b6 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/FullDiscountVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/FullDiscountVO.java @@ -1,8 +1,12 @@ package cn.lili.modules.order.cart.entity.vo; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.modules.promotion.entity.dos.FullDiscount; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.beans.BeanUtils; import java.util.List; @@ -10,30 +14,63 @@ import java.util.List; * 满额活动VO * * @author Chopper - * @date 2020-04-01 10:42 上午 + * @since 2020-04-01 10:42 上午 */ +@EqualsAndHashCode(callSuper = true) @Data +@NoArgsConstructor public class FullDiscountVO extends FullDiscount { private static final long serialVersionUID = -2330552735874105354L; + /** * 促销关联的商品 */ private List promotionGoodsList; - private Integer number; + /** + * 赠品skuId + */ + private String giftSkuId; + + /** + * 赠品名称 + */ + private String giftSkuName; + + /** + * 赠品路径 + */ + private String giftSkuThumbnail; + + + public FullDiscountVO(FullDiscount fullDiscount) { + BeanUtils.copyProperties(fullDiscount, this); + } public String notice() { StringBuilder stringBuffer = new StringBuilder(); - if (Boolean.TRUE.equals(this.getIsFreeFreight())) { - stringBuffer.append("免运费 "); + if (Boolean.TRUE.equals(this.getFullMinusFlag())) { + stringBuffer.append(" 减").append(this.getFullMinus()).append("元 "); } - if (Boolean.TRUE.equals(this.getIsFullMinus())) { - stringBuffer.append("减").append(this.getFullMinus()).append("元 "); + if (Boolean.TRUE.equals(this.getFullRateFlag())) { + stringBuffer.append(" 打").append(this.getFullRate()).append("折 "); } - if (Boolean.TRUE.equals(this.getIsFullRate())) { - stringBuffer.append("打").append(this.getFullRate()).append("折 "); + + if (Boolean.TRUE.equals(this.getFreeFreightFlag())) { + stringBuffer.append(" 免运费 "); } + + if (Boolean.TRUE.equals(this.getPointFlag())) { + stringBuffer.append(" 赠").append(this.getPoint()).append("积分 "); + } + if (Boolean.TRUE.equals(this.getCouponFlag())) { + stringBuffer.append(" 赠").append("优惠券 "); + } + if (Boolean.TRUE.equals(this.getGiftFlag() && CharSequenceUtil.isNotEmpty(giftSkuName))) { + stringBuffer.append(" 赠品[").append(giftSkuName).append("]"); + } + return stringBuffer.toString(); } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/GoodsPromotionVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/GoodsPromotionVO.java index 197faede..263340c7 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/GoodsPromotionVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/GoodsPromotionVO.java @@ -1,5 +1,6 @@ package cn.lili.modules.order.cart.entity.vo; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -12,7 +13,7 @@ import java.util.Date; * 商品促销VO * * @author Chopper - * @date 2020-04-01 10:42 上午 + * @since 2020-04-01 10:42 上午 */ @Data @ApiModel(description = "购物车中") @@ -30,7 +31,7 @@ public class GoodsPromotionVO implements Serializable { private String promotionId; /** - * @see cn.lili.modules.promotion.entity.enums.PromotionTypeEnum + * @see PromotionTypeEnum */ @ApiModelProperty(value = "活动工具类型") private String promotionType; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/PriceDetailVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/PriceDetailVO.java index 2dbb4082..47d5ebf9 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/PriceDetailVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/PriceDetailVO.java @@ -10,7 +10,7 @@ import java.io.Serializable; * 订单价格详情 * * @author Chopper - * @date 2020-04-01 10:42 上午 + * @since 2020-04-01 10:42 上午 */ @Data public class PriceDetailVO implements Serializable { @@ -27,7 +27,7 @@ public class PriceDetailVO implements Serializable { private Double discountPrice; @ApiModelProperty(value = "支付积分") - private Integer payPoint; + private Long payPoint; @ApiModelProperty(value = "最终成交金额") private Double finalePrice; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeParams.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeParams.java index 29c3cd9c..f7be7645 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeParams.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeParams.java @@ -1,5 +1,6 @@ package cn.lili.modules.order.cart.entity.vo; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.modules.order.cart.entity.dto.StoreRemarkDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -11,7 +12,7 @@ import java.util.List; * 交易参数 * * @author paulG - * @date 2021/2/23 + * @since 2021/2/23 **/ @Data public class TradeParams implements Serializable { @@ -22,7 +23,7 @@ public class TradeParams implements Serializable { private String way; /** - * @see cn.lili.modules.base.entity.enums.ClientTypeEnum + * @see ClientTypeEnum */ @ApiModelProperty(value = "客户端:H5/移动端 PC/PC端,WECHAT_MP/小程序端,APP/移动应用端") private String client; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeVO.java index b57806c4..ec3dd3ba 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/TradeVO.java @@ -10,7 +10,7 @@ import java.util.List; * 整比交易对象 * * @author Chopper - * @date 2020-04-01 10:42 上午 + * @since 2020-04-01 10:42 上午 */ @Data public class TradeVO implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java b/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java index 1fcccf63..a8bd6d6e 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java @@ -1,21 +1,30 @@ package cn.lili.modules.order.cart.render; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; /** * 购物车渲染 * * @author Chopper - * @date 2020-04-01 10:27 上午 + * @since 2020-04-01 10:27 上午 */ public interface CartRenderStep { /** - * 渲染一笔交易 - * 0-> 校验商品 1-》 满优惠渲染 2->渲染优惠 3->优惠券渲染 4->计算运费 5->计算价格 6->分销渲染 7->其他渲染 + * 渲染价格步骤 * - * @param tradeDTO + * @return 渲染枚举 + */ + RenderStepEnums step(); + + /** + * 渲染一笔交易 + * + * @param tradeDTO 交易DTO */ void render(TradeDTO tradeDTO); + + } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/RenderStepStatement.java b/framework/src/main/java/cn/lili/modules/order/cart/render/RenderStepStatement.java new file mode 100644 index 00000000..c03d1456 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/RenderStepStatement.java @@ -0,0 +1,97 @@ +package cn.lili.modules.order.cart.render; + +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; + +/** + * 价格渲染 步骤声明 + * + * @author Chopper + * @version v1.0 + * 2021-08-13 16:15 + */ +public class RenderStepStatement { + + /** + * 购物车购物车渲染 + * 校验商品 》 满优惠渲染 》 渲染优惠 》计算价格 + */ + public static RenderStepEnums[] cartRender = { + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.FULL_DISCOUNT, + RenderStepEnums.CART_PRICE}; + + /** + * 结算页渲染 + * 过滤选择的商品 》 校验商品 》 满优惠渲染 》 渲染优惠 》 + * 优惠券渲染 》 计算运费 》 计算价格 + */ + public static RenderStepEnums[] checkedRender = { + RenderStepEnums.CHECKED_FILTER, + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.FULL_DISCOUNT, + RenderStepEnums.COUPON, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE, + }; + + + /** + * 单个商品优惠,不需要渲染满减优惠 + * 用于特殊场景:例如积分商品,拼团商品,虚拟商品等等 + */ + public static RenderStepEnums[] checkedSingleRender = { + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.COUPON, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE + }; + + /** + * 交易创建前渲染 + * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染 + */ + public static RenderStepEnums[] singleTradeRender = { + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE, + RenderStepEnums.CART_SN, + RenderStepEnums.DISTRIBUTION, + RenderStepEnums.PLATFORM_COMMISSION + }; + + /** + * 交易创建前渲染 + * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染 + */ + public static RenderStepEnums[] pintuanTradeRender = { + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.COUPON, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE, + RenderStepEnums.CART_SN, + RenderStepEnums.DISTRIBUTION, + RenderStepEnums.PLATFORM_COMMISSION + }; + + /** + * 交易创建前渲染 + * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染 + */ + public static RenderStepEnums[] tradeRender = { + RenderStepEnums.CHECKED_FILTER, + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.FULL_DISCOUNT, + RenderStepEnums.COUPON, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE, + RenderStepEnums.CART_SN, + RenderStepEnums.DISTRIBUTION, + RenderStepEnums.PLATFORM_COMMISSION + }; +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java index 19429c73..ba6b18f6 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java @@ -1,63 +1,54 @@ package cn.lili.modules.order.cart.render; +import cn.lili.common.exception.ServiceException; import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.vo.CartSkuVO; -import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; +import cn.lili.modules.order.cart.service.CartService; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.service.TradeService; -import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; -import cn.lili.modules.order.cart.service.CartService; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** - * TradeBuilder + * 交易构造&&创建 * * @author Chopper - * @date2020-04-01 9:47 下午 + * @since2020-04-01 9:47 下午 */ @Service @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class TradeBuilder { - //购物车渲染 - private final List cartRenderSteps; - //交易 - private final TradeService tradeService; /** - * 渲染整比交易 + * 购物车渲染步骤 */ - int[] defaultRender = {0, 1, 2, 4, 5, 6, 7}; - + @Autowired + private List cartRenderSteps; /** - * 购物车购物车渲染 + * 交易 */ - int[] cartRender = {0, 1, 2, 5}; - + @Autowired + private TradeService tradeService; /** - * 0-> 校验商品 1-》 满优惠渲染 2->渲染优惠 3->优惠券渲染 4->计算运费 5->计算价格 6->分销渲染 7->扩展操作 + * 购物车业务 */ + @Autowired private CartService cartService; - @Autowired - public void setCartService(CartService cartService) { - this.cartService = cartService; - } /** * 构造购物车 + * 购物车与结算信息不一致的地方主要是优惠券计算和运费计算,其他规则都是一致都 * * @param checkedWay 购物车类型 * @return 购物车展示信息 */ public TradeDTO buildCart(CartTypeEnum checkedWay) { + //读取对应购物车的商品信息 TradeDTO tradeDTO = cartService.readDTO(checkedWay); //购物车需要将交易中的优惠券取消掉 @@ -67,54 +58,82 @@ public class TradeBuilder { } //按照计划进行渲染 - for (int index : cartRender) { - try { - cartRenderSteps.get(index).render(tradeDTO); - } catch (Exception e) { - log.error("购物车渲染异常:", e); - } - } + renderCartBySteps(tradeDTO, RenderStepStatement.cartRender); return tradeDTO; } /** - * 构造一笔交易 - * - * @param checkedWay 购物车类型 - * @return 购物车展示信息 + * 构造结算页面 */ - public TradeDTO buildTrade(CartTypeEnum checkedWay) { + public TradeDTO buildChecked(CartTypeEnum checkedWay) { + //读取对应购物车的商品信息 TradeDTO tradeDTO = cartService.readDTO(checkedWay); - List collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); - if (checkedWay.equals(CartTypeEnum.PINTUAN)) { - for (CartSkuVO cartSkuVO : collect) { - cartSkuVO.setPintuanId(""); - } + //需要对购物车渲染 + if (isSingle(checkedWay)) { + renderCartBySteps(tradeDTO, RenderStepStatement.checkedSingleRender); + } else if (checkedWay.equals(CartTypeEnum.PINTUAN)) { + renderCartBySteps(tradeDTO, RenderStepStatement.pintuanTradeRender); + } else { + renderCartBySteps(tradeDTO, RenderStepStatement.checkedRender); } - tradeDTO.setSkuList(collect); - //按照计划进行渲染 - for (int index : defaultRender) { - cartRenderSteps.get(index).render(tradeDTO); - } - List cartVOList = new ArrayList<>(); - for (CartVO i : tradeDTO.getCartList()) { - i.setSkuList(i.getSkuList().stream().filter(j -> Boolean.TRUE.equals(j.getChecked())).collect(Collectors.toList())); - cartVOList.add(i); - } - tradeDTO.setCartList(cartVOList); + return tradeDTO; } /** * 创建一笔交易 + * 1.构造交易 + * 2.创建交易 * - * @param checkedWay 购物车类型 - * @param parentOrderSn 是否为其他订单下的订单,如果是则为依赖订单的sn,否则为空 + * @param tradeDTO 交易模型 * @return 交易信息 */ - public Trade createTrade(CartTypeEnum checkedWay, String parentOrderSn) { - TradeDTO tradeDTO = this.buildTrade(checkedWay); - tradeDTO.setParentOrderSn(parentOrderSn); + public Trade createTrade(TradeDTO tradeDTO) { + + //需要对购物车渲染 + if (isSingle(tradeDTO.getCartTypeEnum())) { + renderCartBySteps(tradeDTO, RenderStepStatement.singleTradeRender); + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) { + renderCartBySteps(tradeDTO, RenderStepStatement.pintuanTradeRender); + } else { + renderCartBySteps(tradeDTO, RenderStepStatement.tradeRender); + } + + //添加order订单及order_item子订单并返回 return tradeService.createTrade(tradeDTO); } + + /** + * 是否为单品渲染 + * + * @param checkedWay 购物车类型 + * @return 返回是否单品 + */ + private boolean isSingle(CartTypeEnum checkedWay) { + //拼团 积分 砍价商品 + + return (checkedWay.equals(CartTypeEnum.POINTS) || checkedWay.equals(CartTypeEnum.KANJIA)); + } + + /** + * 根据渲染步骤,渲染购物车信息 + * + * @param tradeDTO 交易DTO + * @param defaultRender 渲染枚举 + */ + private void renderCartBySteps(TradeDTO tradeDTO, RenderStepEnums[] defaultRender) { + for (RenderStepEnums step : defaultRender) { + for (CartRenderStep render : cartRenderSteps) { + try { + if (render.step().equals(step)) { + render.render(tradeDTO); + } + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("购物车{}渲染异常:", render.getClass(), e); + } + } + } + } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java index 91286e04..4f443f6b 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java @@ -1,22 +1,15 @@ package cn.lili.modules.order.cart.render.impl; -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.utils.CurrencyUtil; -import cn.lili.modules.goods.service.CategoryService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.render.CartRenderStep; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.stream.Collectors; /** * 购物车渲染,将购物车中的各个商品,拆分到每个商家,形成购物车VO @@ -24,41 +17,35 @@ import java.util.Map; * @author Chopper * @see CartVO */ -@Order(5) @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CartPriceRender implements CartRenderStep { - - //商品分类 - private final CategoryService categoryService; + @Override + public RenderStepEnums step() { + return RenderStepEnums.CART_PRICE; + } @Override public void render(TradeDTO tradeDTO) { - // 构造cartVO - this.buildCart(tradeDTO); - this.buildCartPrice(tradeDTO); - this.buildTradePrice(tradeDTO); + //价格过滤 在购物车商品失效时,需要对价格进行初始化操作 + initPriceDTO(tradeDTO); + + + //构造cartVO + buildCartPrice(tradeDTO); + buildTradePrice(tradeDTO); + } /** - * 购物车价格 + * 特殊情况下对购物车金额进行护理 * - * @param tradeDTO 购物车展示信息 + * @param tradeDTO */ - void buildCart(TradeDTO tradeDTO) { - for (CartVO cart : tradeDTO.getCartList()) { - for (CartSkuVO sku : cart.getSkuList()) { - if (Boolean.FALSE.equals(sku.getChecked())) { - continue; - } - cart.setGoodsNum(sku.getNum()); - if (cart.getStoreId().equals(sku.getStoreId()) && !cart.getSkuList().contains(sku)) { - cart.getSkuList().add(sku); - } - } - } + private void initPriceDTO(TradeDTO tradeDTO) { + tradeDTO.getCartList().forEach(cartVO -> cartVO.setPriceDetailDTO(new PriceDetailDTO())); + tradeDTO.setPriceDetailDTO(new PriceDetailDTO()); } /** @@ -67,56 +54,21 @@ public class CartPriceRender implements CartRenderStep { * @param tradeDTO 购物车展示信息 */ void buildCartPrice(TradeDTO tradeDTO) { - List cartSkuVOList = tradeDTO.getSkuList(); //购物车列表 List cartVOS = tradeDTO.getCartList(); - // key store id - // value 商品列表 - Map> map = new HashMap<>(); - for (CartSkuVO cartSkuVO : cartSkuVOList) { - // 如果存在商家id - if (map.containsKey(cartSkuVO.getGoodsSku().getStoreId())) { - List list = map.get(cartSkuVO.getGoodsSku().getStoreId()); - list.add(cartSkuVO); - } else { - List list = new ArrayList<>(); - list.add(cartSkuVO); - map.put(cartSkuVO.getGoodsSku().getStoreId(), list); + cartVOS.forEach(cartVO -> { + + cartVO.getPriceDetailDTO().accumulationPriceDTO( + cartVO.getCheckedSkuList().stream().filter(CartSkuVO::getChecked) + .map(CartSkuVO::getPriceDetailDTO).collect(Collectors.toList()) + ); + List skuNum = cartVO.getSkuList().stream().filter(CartSkuVO::getChecked) + .map(CartSkuVO::getNum).collect(Collectors.toList()); + for (Integer num : skuNum) { + cartVO.addGoodsNum(num); } - } - - //计算购物车价格 - for (CartVO cart : cartVOS) { - List cartSkuVOS = map.get(cart.getStoreId()); - List priceDetailDTOS = new ArrayList<>(); - if (Boolean.TRUE.equals(cart.getChecked())) { - //累加价格 - for (CartSkuVO cartSkuVO : cartSkuVOS) { - if (Boolean.TRUE.equals(cartSkuVO.getChecked())) { - PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO(); - // 流水金额(入账 出帐金额) = goodsPrice + freight - discountPrice - couponPrice - double flowPrice = CurrencyUtil.sub(CurrencyUtil.add(priceDetailDTO.getGoodsPrice(), priceDetailDTO.getFreightPrice()), CurrencyUtil.add(priceDetailDTO.getDiscountPrice(), priceDetailDTO.getCouponPrice() != null ? priceDetailDTO.getCouponPrice() : 0)); - priceDetailDTO.setFlowPrice(flowPrice); - - // 最终结算金额 = flowPrice - platFormCommission - distributionCommission - double billPrice = CurrencyUtil.sub(CurrencyUtil.sub(flowPrice, priceDetailDTO.getPlatFormCommission()), priceDetailDTO.getDistributionCommission()); - priceDetailDTO.setBillPrice(billPrice); - - // 平台佣金 - String categoryId = cartSkuVO.getGoodsSku().getCategoryPath().substring( - cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1 - ); - if (CharSequenceUtil.isNotEmpty(categoryId)) { - Double platFormCommission = CurrencyUtil.div(CurrencyUtil.mul(flowPrice, categoryService.getById(categoryId).getCommissionRate()), 100); - priceDetailDTO.setPlatFormCommission(platFormCommission); - } - priceDetailDTOS.add(priceDetailDTO); - } - } - cart.setPriceDetailDTO(PriceDetailDTO.accumulationPriceDTO(priceDetailDTOS, cart.getPriceDetailDTO())); - } - } + }); } @@ -126,14 +78,8 @@ public class CartPriceRender implements CartRenderStep { * @param tradeDTO 购物车展示信息 */ void buildTradePrice(TradeDTO tradeDTO) { - //购物车列表 - List cartVOS = tradeDTO.getCartList(); - - List priceDetailDTOS = new ArrayList<>(); - for (CartVO cart : cartVOS) { - priceDetailDTOS.add(cart.getPriceDetailDTO()); - } - tradeDTO.setPriceDetailDTO(PriceDetailDTO.accumulationPriceDTO(priceDetailDTOS, tradeDTO.getPriceDetailDTO())); + tradeDTO.getPriceDetailDTO().accumulationPriceDTO( + tradeDTO.getCartList().stream().map(CartVO::getPriceDetailDTO).collect(Collectors.toList())); } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java index 90ba8c93..bfc0f962 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java @@ -3,6 +3,7 @@ package cn.lili.modules.order.cart.render.impl; import cn.lili.common.utils.SnowFlake; import cn.lili.modules.order.cart.entity.dto.StoreRemarkDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.render.CartRenderStep; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; @@ -11,12 +12,16 @@ import org.springframework.stereotype.Service; * sn 生成 * * @author Chopper - * @date 2020-07-02 14:47 + * @since 2020-07-02 14:47 */ -@Order(7) @Service public class CartSnRender implements CartRenderStep { + @Override + public RenderStepEnums step() { + return RenderStepEnums.CART_SN; + } + @Override public void render(TradeDTO tradeDTO) { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java index ce35b594..e5cd8981 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java @@ -1,64 +1,291 @@ package cn.lili.modules.order.cart.render.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dos.Wholesale; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.goods.service.WholesaleService; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.render.CartRenderStep; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.promotion.entity.dos.Coupon; +import cn.lili.modules.promotion.entity.dos.Pintuan; +import cn.lili.modules.promotion.entity.dos.PointsGoods; +import cn.lili.modules.promotion.entity.vos.CouponVO; +import cn.lili.modules.promotion.service.PromotionGoodsService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + /** * 商品有效性校验 * * @author Chopper - * @date 2020-07-02 14:47 + * @since 2020-07-02 14:47 */ -@Order(0) @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Slf4j public class CheckDataRender implements CartRenderStep { - private final GoodsSkuService goodsSkuService; + @Autowired + private GoodsSkuService goodsSkuService; + + @Autowired + private OrderService orderService; + + @Autowired + private MemberService memberService; + + @Autowired + private WholesaleService wholesaleService; + + /** + * 商品索引 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.CHECK_DATA; + } @Override public void render(TradeDTO tradeDTO) { - for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + + + //校验商品有效性 + checkData(tradeDTO); + + //预校验 + preCalibration(tradeDTO); + + //批量销售预处理 + preSaleModel(tradeDTO); + + //店铺分组数据初始化 + groupStore(tradeDTO); + + } + + /** + * 校验商品属性 + * + * @param tradeDTO 购物车视图 + */ + private void checkData(TradeDTO tradeDTO) { + List cartSkuVOS = tradeDTO.getSkuList(); + + //循环购物车中的商品 + for (CartSkuVO cartSkuVO : cartSkuVOS) { + + //如果失效,确认sku为未选中状态 + if (Boolean.TRUE.equals(cartSkuVO.getInvalid())) { + //设置购物车未选中 + cartSkuVO.setChecked(false); + } + + //缓存中的商品信息 GoodsSku dataSku = goodsSkuService.getGoodsSkuByIdFromCache(cartSkuVO.getGoodsSku().getId()); - if (dataSku == null || dataSku.getUpdateTime().before(cartSkuVO.getGoodsSku().getUpdateTime())) { + + //商品上架状态判定 sku为空、sku非上架状态、sku审核不通过 + boolean checkGoodsStatus = dataSku == null || !GoodsAuthEnum.PASS.name().equals(dataSku.getAuthFlag()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable()); + //商品有效性判定 sku不为空且sku的更新时间不为空且sku的更新时间在购物车sku的更新时间之后 + boolean checkGoodsValid = dataSku != null && dataSku.getUpdateTime() != null && dataSku.getUpdateTime().after(cartSkuVO.getGoodsSku().getUpdateTime()); + + + if (checkGoodsStatus || checkGoodsValid) { + if (checkGoodsValid) { + cartSkuVO.rebuildBySku(dataSku); + } + if (checkGoodsStatus) { + //设置购物车未选中 + cartSkuVO.setChecked(false); + //设置购物车此sku商品已失效 + cartSkuVO.setInvalid(true); + //设置失效消息 + cartSkuVO.setErrorMessage("商品已下架"); + continue; + } + + } + + //商品库存判定 + if (dataSku.getQuantity() < cartSkuVO.getNum()) { //设置购物车未选中 cartSkuVO.setChecked(false); - //设置购物车此sku商品已失效 - cartSkuVO.setInvalid(true); //设置失效消息 - cartSkuVO.setErrorMessage("商品信息发生变化,已失效"); - continue; + cartSkuVO.setErrorMessage("商品库存不足,现有库存数量[" + dataSku.getQuantity() + "]"); } - if (!GoodsAuthEnum.PASS.name().equals(dataSku.getIsAuth()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable())) { - //设置购物车未选中 - cartSkuVO.setChecked(false); - //设置购物车此sku商品已失效 - cartSkuVO.setInvalid(true); - //设置失效消息 - cartSkuVO.setErrorMessage("商品已下架"); - continue; + //如果存在商品促销活动,则判定商品促销状态 + if (!cartSkuVO.getCartType().equals(CartTypeEnum.POINTS) && (CollUtil.isNotEmpty(cartSkuVO.getNotFilterPromotionMap()) || Boolean.TRUE.equals(cartSkuVO.getGoodsSku().getPromotionFlag()))) { + //获取当前最新的促销信息 + cartSkuVO.setPromotionMap(this.promotionGoodsService.getCurrentGoodsPromotion(cartSkuVO.getGoodsSku(), tradeDTO.getCartTypeEnum().name())); + //设定商品价格 + Double goodsPrice = cartSkuVO.getGoodsSku().getPromotionFlag() != null && cartSkuVO.getGoodsSku().getPromotionFlag() ? cartSkuVO.getGoodsSku().getPromotionPrice() : cartSkuVO.getGoodsSku().getPrice(); + cartSkuVO.setPurchasePrice(goodsPrice); + cartSkuVO.setUtilPrice(goodsPrice); + cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); } - //商品库存不足 - if (dataSku.getQuantity() <= 0) { - //设置购物车未选中 - cartSkuVO.setChecked(false); - //设置购物车此sku商品已失效 - cartSkuVO.setInvalid(true); - //设置失效消息 - cartSkuVO.setErrorMessage("商品库存不足"); + + } + } + + /** + * 店铺分组 + * + * @param tradeDTO + */ + private void groupStore(TradeDTO tradeDTO) { + //渲染的购物车 + List cartList = new ArrayList<>(); + if (tradeDTO.getCartList() == null || tradeDTO.getCartList().size() == 0) { + //根据店铺分组 + Map> storeCollect = tradeDTO.getSkuList().stream().collect(Collectors.groupingBy(CartSkuVO::getStoreId)); + for (Map.Entry> storeCart : storeCollect.entrySet()) { + if (!storeCart.getValue().isEmpty()) { + CartVO cartVO = new CartVO(storeCart.getValue().get(0)); + if (CharSequenceUtil.isEmpty(cartVO.getDeliveryMethod())) { + cartVO.setDeliveryMethod(DeliveryMethodEnum.LOGISTICS.name()); + } + cartVO.setSkuList(storeCart.getValue()); + try { + //筛选属于当前店铺的优惠券 + storeCart.getValue().forEach(i -> i.getPromotionMap().forEach((key, value) -> { + if (key.contains(PromotionTypeEnum.COUPON.name())) { + JSONObject promotionsObj = JSONUtil.parseObj(value); + Coupon coupon = JSONUtil.toBean(promotionsObj, Coupon.class); + if (key.contains(PromotionTypeEnum.COUPON.name()) && coupon.getStoreId().equals(storeCart.getKey())) { + cartVO.getCanReceiveCoupon().add(new CouponVO(coupon)); + } + } + })); + } catch (Exception e) { + log.error("筛选属于当前店铺的优惠券发生异常!", e); + } + storeCart.getValue().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).findFirst().ifPresent(cartSkuVO -> cartVO.setChecked(true)); + cartList.add(cartVO); + } } - //写入初始价格 - cartSkuVO.getPriceDetailDTO().setGoodsPrice(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); + tradeDTO.setCartList(cartList); + } + + } + + /** + * 订单预校验 + * 1、自己拼团自己创建都拼团判定、拼团限购 + * 2、积分购买,积分足够与否 + * + * @param tradeDTO + */ + private void preCalibration(TradeDTO tradeDTO) { + + //拼团订单预校验 + if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) { + //拼团判定,不能参与自己创建的拼团 + if (tradeDTO.getParentOrderSn() != null) { + //订单接收 + Order parentOrder = orderService.getBySn(tradeDTO.getParentOrderSn()); + //参与活动判定 + if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { + throw new ServiceException(ResultCode.PINTUAN_JOIN_ERROR); + } + } + //判断拼团商品的限购数量 + if (tradeDTO.getSkuList().get(0).getPromotionMap() != null && !tradeDTO.getSkuList().get(0).getPromotionMap().isEmpty()) { + Optional> pintuanPromotions = tradeDTO.getSkuList().get(0).getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.PINTUAN.name())).findFirst(); + if (pintuanPromotions.isPresent()) { + JSONObject promotionsObj = JSONUtil.parseObj(pintuanPromotions.get().getValue()); + Pintuan pintuan = promotionsObj.toBean(Pintuan.class); + Integer limitNum = pintuan.getLimitNum(); + for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { + throw new ServiceException(ResultCode.PINTUAN_LIMIT_NUM_ERROR); + } + } + } + } + //积分商品,判断用户积分是否满足 + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS) && tradeDTO.getSkuList().get(0).getPromotionMap() != null && !tradeDTO.getSkuList().get(0).getPromotionMap().isEmpty()) { + //获取积分商品VO + Optional> pointsPromotions = tradeDTO.getSkuList().get(0).getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.POINTS_GOODS.name())).findFirst(); + if (pointsPromotions.isPresent()) { + JSONObject promotionsObj = JSONUtil.parseObj(pointsPromotions.get().getValue()); + PointsGoods pointsGoods = promotionsObj.toBean(PointsGoods.class); + if (pointsGoods == null) { + throw new ServiceException(ResultCode.POINT_GOODS_ERROR); + } + Member member = memberService.getUserInfo(); + if (member.getPoint() < pointsGoods.getPoints()) { + throw new ServiceException(ResultCode.USER_POINTS_ERROR); + } + } + + } + + } + + + /** + * 商品销售模式特殊处理 + * + * @param tradeDTO 交易信息 + */ + private void preSaleModel(TradeDTO tradeDTO) { + // 寻找同goods下销售模式为批发的商品 + Map> goodsGroup = tradeDTO.getCheckedSkuList().stream().filter(i -> i.getGoodsSku().getSalesModel().equals(GoodsSalesModeEnum.WHOLESALE.name())).collect(Collectors.groupingBy(i -> i.getGoodsSku().getGoodsId())); + if (CollUtil.isNotEmpty(goodsGroup)) { + goodsGroup.forEach((k, v) -> { + // 获取购买总数 + int sum = v.stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).mapToInt(CartSkuVO::getNum).sum(); + int fSum = v.stream().filter(i -> Boolean.FALSE.equals(i.getChecked())).mapToInt(CartSkuVO::getNum).sum(); + // 匹配符合的批发规则 + Wholesale match = wholesaleService.match(k, sum); + if (match != null) { + v.forEach(i -> { + // 将符合规则的商品设置批发价格 + if (Boolean.TRUE.equals(i.getChecked())) { + i.setPurchasePrice(match.getPrice()); + i.getGoodsSku().setPrice(match.getPrice()); + i.getGoodsSku().setCost(match.getPrice()); + i.setUtilPrice(match.getPrice()); + i.setSubTotal(CurrencyUtil.mul(i.getPurchasePrice(), i.getNum())); + } else { + i.setPurchasePrice(wholesaleService.match(k, fSum).getPrice()); + i.getGoodsSku().setPrice(i.getPurchasePrice()); + i.getGoodsSku().setCost(i.getPurchasePrice()); + i.setUtilPrice(i.getPurchasePrice()); + i.setSubTotal(CurrencyUtil.mul(i.getPurchasePrice(), i.getNum())); + } + }); + } + }); } } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckedFilterRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckedFilterRender.java new file mode 100644 index 00000000..6580d706 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckedFilterRender.java @@ -0,0 +1,46 @@ +package cn.lili.modules.order.cart.render.impl; + +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; +import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.cart.render.CartRenderStep; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 勾选商品过滤 + * + * @author Chopper + * @see CartVO + */ +@Service +public class CheckedFilterRender implements CartRenderStep { + + @Override + public RenderStepEnums step() { + return RenderStepEnums.CHECKED_FILTER; + } + + @Override + public void render(TradeDTO tradeDTO) { + //将购物车到sku未选择信息过滤 + List collect = tradeDTO.getSkuList().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); + tradeDTO.setSkuList(collect); + + //购物车信息过滤 + List cartVOList = new ArrayList<>(); + //循环购物车信息 + for (CartVO cartVO : tradeDTO.getCartList()) { + //如果商品选中,则加入到对应购物车 + cartVO.setSkuList(cartVO.getCheckedSkuList()); + cartVOList.add(cartVO); + } + tradeDTO.setCartList(cartVOList); + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java new file mode 100644 index 00000000..8d35dbaf --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java @@ -0,0 +1,97 @@ +package cn.lili.modules.order.cart.render.impl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.modules.goods.service.CategoryService; +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; +import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.cart.render.CartRenderStep; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dos.PointsGoods; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * 佣金计算 + * + * @author Chopper + * @see CartVO + */ +@Service +public class CommissionRender implements CartRenderStep { + + + /** + * 商品分类 + */ + @Autowired + private CategoryService categoryService; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.PLATFORM_COMMISSION; + } + + @Override + public void render(TradeDTO tradeDTO) { + buildCartPrice(tradeDTO); + } + + /** + * 购物车佣金计算 + * + * @param tradeDTO 购物车展示信息 + */ + void buildCartPrice(TradeDTO tradeDTO) { + //购物车列表 + List cartVOS = tradeDTO.getCartList(); + + //计算购物车价格 + for (CartVO cart : cartVOS) { + //累加价格 + for (CartSkuVO cartSkuVO : cart.getCheckedSkuList()) { + + PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO(); + //平台佣金根据分类计算 + String categoryId = cartSkuVO.getGoodsSku().getCategoryPath() + .substring(cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1); + if (CharSequenceUtil.isNotEmpty(categoryId)) { + Double commissionRate = categoryService.getCategoryById(categoryId).getCommissionRate(); + priceDetailDTO.setPlatFormCommissionPoint(commissionRate); + } + + //如果积分订单 积分订单,单独操作订单结算金额和商家结算字段 + if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS) && tradeDTO.getSkuList().get(0).getPromotionMap() != null && !tradeDTO.getSkuList().get(0).getPromotionMap().isEmpty()) { + Optional> pointsPromotions = tradeDTO.getSkuList().get(0).getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.POINTS_GOODS.name())).findFirst(); + if (pointsPromotions.isPresent()) { + JSONObject promotionsObj = JSONUtil.parseObj(pointsPromotions.get().getValue()); + PointsGoods pointsGoods = JSONUtil.toBean(promotionsObj, PointsGoods.class); + priceDetailDTO.setSettlementPrice(pointsGoods.getSettlementPrice()); + } + } + //如果砍价订单 计算金额,单独操作订单结算金额和商家结算字段 + else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA) && tradeDTO.getSkuList().get(0).getPromotionMap() != null && !tradeDTO.getSkuList().get(0).getPromotionMap().isEmpty()) { + Optional> kanjiaPromotions = tradeDTO.getSkuList().get(0).getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.KANJIA.name())).findFirst(); + if (kanjiaPromotions.isPresent()) { + JSONObject promotionsObj = JSONUtil.parseObj(kanjiaPromotions.get().getValue()); + KanjiaActivityGoods kanjiaActivityGoods = JSONUtil.toBean(promotionsObj, KanjiaActivityGoods.class); + priceDetailDTO.setSettlementPrice(CurrencyUtil.add(kanjiaActivityGoods.getSettlementPrice(),priceDetailDTO.getBillPrice())); + } + } + } + } + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java index 0ef09132..36d0423a 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java @@ -1,32 +1,206 @@ package cn.lili.modules.order.cart.render.impl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.utils.StringUtils; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.render.CartRenderStep; +import cn.lili.modules.order.cart.render.util.PromotionPriceUtil; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; -import org.springframework.core.annotation.Order; +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.enums.CouponTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.vos.MemberCouponVO; +import cn.lili.modules.promotion.service.MemberCouponService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 购物促销信息渲染实现 * * @author Chopper - * @date 2020-07-02 14:47 + * @since 2020-07-02 14:47 */ -@Order(3) @Service public class CouponRender implements CartRenderStep { + @Autowired + private MemberCouponService memberCouponService; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.COUPON; + } + @Override public void render(TradeDTO tradeDTO) { + //优惠券列表 + this.renderCouponRule(tradeDTO); //主要渲染各个优惠的价格 - // this.renderCoupon(tradeDTO); + this.renderCoupon(tradeDTO); + } + + /** + * 渲染优惠券规则 + * + * @param tradeDTO 交易dto + */ + private void renderCouponRule(TradeDTO tradeDTO) { + // 清除之前的优惠券 + tradeDTO.removeCoupon(); + + List memberCouponList = memberCouponService.getMemberCoupons(tradeDTO.getMemberId()); + + //获取最新优惠券 + memberCouponList = memberCouponList.stream() + .filter(item -> item.getStartTime().before(new Date()) && item.getEndTime().after(new Date())) + .collect(Collectors.toList()); + + if (!memberCouponList.isEmpty()) { + this.checkMemberExistCoupon(tradeDTO, memberCouponList); + } else { + tradeDTO.setPlatformCoupon(null); + tradeDTO.setStoreCoupons(new HashMap<>()); + } + memberCouponList.forEach(memberCoupon -> available(tradeDTO, memberCoupon)); + } + + /** + * 检查使用中的优惠券是否存在与用户的优惠券中 + * + * @param tradeDTO 交易dto + * @param memberCouponList 会员优惠券列表 + */ + private void checkMemberExistCoupon(TradeDTO tradeDTO, List memberCouponList) { + if (tradeDTO.getPlatformCoupon() != null && tradeDTO.getPlatformCoupon().getMemberCoupon() != null) { + boolean b = memberCouponList.stream().anyMatch(i -> i.getId().equals(tradeDTO.getPlatformCoupon().getMemberCoupon().getId())); + if (!b) { + tradeDTO.setPlatformCoupon(null); + } + } + if (!tradeDTO.getStoreCoupons().isEmpty()) { + for (Map.Entry entry : tradeDTO.getStoreCoupons().entrySet()) { + if (entry.getValue().getMemberCoupon() != null && memberCouponList.stream().noneMatch(i -> i.getId().equals(entry.getValue().getMemberCoupon().getId()))) { + tradeDTO.getStoreCoupons().remove(entry.getKey()); + } + } + } + } + + /** + * 判定优惠券是否可用 + * + * @param tradeDTO 交易dto + * @param memberCoupon 会员优惠券 + */ + private void available(TradeDTO tradeDTO, MemberCoupon memberCoupon) { + if (memberCoupon == null) { + return; + } + List filterSku = filterSkuVo(tradeDTO.getCheckedSkuList(), memberCoupon); + if (filterSku == null || filterSku.isEmpty()) { + tradeDTO.getCantUseCoupons().add(new MemberCouponVO(memberCoupon, + "购物车中没有满足优惠券使用范围的优惠券")); + return; + } + List priceDetailDTOS = + filterSku.stream().map(CartSkuVO::getPriceDetailDTO).collect(Collectors.toList()); + + PriceDetailDTO totalPrice = new PriceDetailDTO(); + totalPrice.accumulationPriceDTO(priceDetailDTOS); + + //满足条件判定 + if (totalPrice.getGoodsPrice() >= memberCoupon.getConsumeThreshold()) { + tradeDTO.getCanUseCoupons().add(memberCoupon); + } else { + tradeDTO.getCantUseCoupons().add(new MemberCouponVO(memberCoupon, + "优惠券使用门槛不足,还差" + + StringUtils.toFen(CurrencyUtil.sub(memberCoupon.getConsumeThreshold(), totalPrice.getGoodsPrice())) + + "元")); + } + + } + + /** + * 过滤购物车商品信息,按照优惠券的适用范围过滤 + * + * @param cartSkuVOS 购物车中的产品列表 + * @param memberCoupon 会员优惠券 + * @return 按照优惠券的适用范围过滤的购物车商品信息 + */ + private List filterSkuVo(List cartSkuVOS, MemberCoupon memberCoupon) { + + List filterSku; + //平台店铺过滤 + if (Boolean.TRUE.equals(memberCoupon.getPlatformFlag())) { + filterSku = cartSkuVOS; + } else { + filterSku = cartSkuVOS.stream().filter(cartSkuVO -> cartSkuVO.getStoreId().equals(memberCoupon.getStoreId())).collect(Collectors.toList()); + } + if (filterSku == null || filterSku.isEmpty()) { + return Collections.emptyList(); + } + //优惠券类型判定 + switch (PromotionsScopeTypeEnum.valueOf(memberCoupon.getScopeType())) { + case ALL: + return filterSku; + case PORTION_GOODS: + //按照商品过滤 + filterSku = filterSku.stream().filter(cartSkuVO -> memberCoupon.getScopeId().contains(cartSkuVO.getGoodsSku().getId())).collect(Collectors.toList()); + break; + + case PORTION_SHOP_CATEGORY: + //按照店铺分类过滤 + filterSku = this.filterPromotionShopCategory(filterSku, memberCoupon); + break; + + case PORTION_GOODS_CATEGORY: + + //按照店铺分类过滤 + filterSku = filterSku.stream().filter(cartSkuVO -> { + //平台分类获取 + String[] categoryPath = cartSkuVO.getGoodsSku().getCategoryPath().split(","); + //平台三级分类 + String categoryId = categoryPath[categoryPath.length - 1]; + return memberCoupon.getScopeId().contains(categoryId); + }).collect(Collectors.toList()); + break; + default: + return Collections.emptyList(); + } + return filterSku; + } + + /** + * 优惠券按照店铺分类过滤 + * + * @param filterSku 过滤的购物车商品信息 + * @param memberCoupon 会员优惠 + * @return 优惠券按照店铺分类过滤的购物车商品信息 + */ + private List filterPromotionShopCategory(List filterSku, MemberCoupon memberCoupon) { + return filterSku.stream().filter(cartSkuVO -> { + if (CharSequenceUtil.isNotEmpty(cartSkuVO.getGoodsSku().getStoreCategoryPath())) { + //获取店铺分类 + String[] storeCategoryPath = cartSkuVO.getGoodsSku().getStoreCategoryPath().split(","); + for (String category : storeCategoryPath) { + //店铺分类只要有一项吻合,即可返回true + if (memberCoupon.getScopeId().contains(category)) { + return true; + } + } + } + return false; + }).collect(Collectors.toList()); } /** @@ -36,35 +210,75 @@ public class CouponRender implements CartRenderStep { */ private void renderCoupon(TradeDTO tradeDTO) { MemberCouponDTO platformCoupon = tradeDTO.getPlatformCoupon(); + //如果有勾选平台优惠券 if (platformCoupon != null) { - //计算平台优惠券 - for (CartSkuVO item : tradeDTO.getSkuList()) { - //如果这个sku涉及到平台优惠券价格计算 则操作这个sku的价格 - if (platformCoupon.getSkuDetail().containsKey(item.getGoodsSku().getId())) { - PriceDetailDTO priceDetailDTO = item.getPriceDetailDTO(); - priceDetailDTO.setSiteCouponPoint(platformCoupon.getMemberCoupon().getStoreCommission()); - priceDetailDTO.setSiteCouponPrice(platformCoupon.getSkuDetail().get(item.getGoodsSku().getId())); - priceDetailDTO.setSiteCouponCommission(CurrencyUtil.mul(priceDetailDTO.getSiteCouponPoint(), priceDetailDTO.getSiteCouponPrice())); - } - } + renderSku(tradeDTO, platformCoupon); } - //计算商家优惠券 Map map = tradeDTO.getStoreCoupons(); if (map != null && map.size() > 0) { - for (MemberCouponDTO coupon : map.values()) { - for (CartSkuVO item : tradeDTO.getSkuList()) { - if (coupon.getSkuDetail().containsKey(item.getGoodsSku().getId())) { - PriceDetailDTO priceDetailDTO = item.getPriceDetailDTO(); - //写入商品折扣金额 - priceDetailDTO.setDiscountPrice( - CurrencyUtil.add( - priceDetailDTO.getDiscountPrice(), - coupon.getSkuDetail().get( - item.getGoodsSku().getId() - ) - ) - ); + for (MemberCouponDTO memberCouponDTO : map.values()) { + renderSku(tradeDTO, memberCouponDTO); + } + } + } + + /** + * 渲染sku优惠信息 + * + * @param tradeDTO 交易DTO + * @param memberCouponDTO 优惠券DTO + */ + private void renderSku(TradeDTO tradeDTO, MemberCouponDTO memberCouponDTO) { + + //计算优惠总金额 + Double countPrice = 0D; + Map couponMap = memberCouponDTO.getSkuDetail(); + for (Double skuPrice : couponMap.values()) { + countPrice = CurrencyUtil.add(countPrice, skuPrice); + } + + //接收具体优惠券信息 + MemberCoupon coupon = memberCouponDTO.getMemberCoupon(); + //处理一个极端情况,如果优惠券满减金额大于订单金额 + if (coupon.getCouponType().equals(CouponTypeEnum.PRICE.name()) && coupon.getPrice() > countPrice) { + //将符合优惠券的金额写入,即最大扣减金额 + coupon.setPrice(countPrice); + } + + if (coupon.getCouponType().equals(CouponTypeEnum.PRICE.name())) { + //减免现金,则按照商品价格计算 需要通过工具类进行优惠金额的分发,分发给每个商品 + this.renderCouponPrice(couponMap, tradeDTO, coupon, memberCouponDTO); + } else { + //打折券 直接计算 + this.renderCouponDiscount(couponMap, tradeDTO, coupon); + } + } + + /** + * 减免现金,则按照商品价格计算 需要通过工具类进行优惠金额的分发,分发给每个商品 + * + * @param couponMap 优惠券结算信息 + * @param tradeDTO 交易dto + * @param coupon 优惠券信息 + * @param memberCouponDTO 用于计算优惠券结算详情 + */ + private void renderCouponPrice(Map couponMap, TradeDTO tradeDTO, MemberCoupon coupon, MemberCouponDTO memberCouponDTO) { + //分发优惠券 + PromotionPriceUtil.recountPrice(tradeDTO, memberCouponDTO.getSkuDetail(), memberCouponDTO.getMemberCoupon().getPrice(), + Boolean.TRUE.equals(coupon.getPlatformFlag()) ? + PromotionTypeEnum.PLATFORM_COUPON : PromotionTypeEnum.COUPON, memberCouponDTO.getMemberCoupon().getCouponId()); + //如果是平台券 则需要计算商家承担比例 + if (Boolean.TRUE.equals(coupon.getPlatformFlag()) && coupon.getStoreCommission() > 0) { + + //循环所有优惠券 + for (String skuId : couponMap.keySet()) { + + for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + //写入平台优惠券承担比例 + if (cartSkuVO.getGoodsSku().getId().equals(skuId)) { + //写入店铺承担比例 + cartSkuVO.getPriceDetailDTO().setSiteCouponPoint(coupon.getStoreCommission()); } } } @@ -72,4 +286,38 @@ public class CouponRender implements CartRenderStep { } + /** + * 打折券计算 + * + * @param couponMap 优惠券结算信息 + * @param tradeDTO 交易dto + * @param coupon 优惠券信息 + */ + private void renderCouponDiscount(Map couponMap, TradeDTO tradeDTO, MemberCoupon coupon) { + //循环所有优惠券 + for (String skuId : couponMap.keySet()) { + + // 循环购物车商品 + for (CartSkuVO item : tradeDTO.getSkuList()) { + //如果id相等,则渲染商品价格信息 + if (item.getGoodsSku().getId().equals(skuId)) { + + PriceDetailDTO priceDetailDTO = item.getPriceDetailDTO(); + + // 打折金额=商品金额*折扣/10 + Double discountCouponPrice = CurrencyUtil.mul(priceDetailDTO.getGoodsPrice(), + CurrencyUtil.sub(1, CurrencyUtil.div(coupon.getDiscount(), 10, 3))); + + //平台券则写入店铺承担优惠券比例 + if (Boolean.TRUE.equals(coupon.getPlatformFlag())) { + priceDetailDTO.setSiteCouponPrice(discountCouponPrice); + priceDetailDTO.setSiteCouponPoint(coupon.getStoreCommission()); + } + priceDetailDTO.setCouponPrice(CurrencyUtil.add(priceDetailDTO.getCouponPrice(), discountCouponPrice)); + + } + } + } + } + } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java index 5d50d612..a1a96cae 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java @@ -1,34 +1,45 @@ package cn.lili.modules.order.cart.render.impl; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.utils.CurrencyUtil; +import cn.lili.modules.distribution.entity.dos.DistributionGoods; +import cn.lili.modules.distribution.service.DistributionGoodsService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.render.CartRenderStep; -import lombok.RequiredArgsConstructor; +import com.xkcoding.http.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.stream.Collectors; + /** - * 购物促销信息渲染实现 + * 分销佣金计算 * * @author Chopper - * @date 2020-07-02 14:47 + * @since 2020-07-02 14:47 */ @Service -@Order(6) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionPriceRender implements CartRenderStep { /** * 缓存 */ - private final Cache cache; + @Autowired + private Cache cache; + + @Autowired + private DistributionGoodsService distributionGoodsService; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.DISTRIBUTION; + } @Override public void render(TradeDTO tradeDTO) { - //主要渲染各个优惠的价格 this.renderDistribution(tradeDTO); } @@ -39,16 +50,31 @@ public class DistributionPriceRender implements CartRenderStep { */ private void renderDistribution(TradeDTO tradeDTO) { - if(cache.get(CachePrefix.DISTRIBUTION.getPrefix()+"_"+tradeDTO.getMemberId())==null){ + //如果存在分销员 + String distributionId = (String) cache.get(CachePrefix.DISTRIBUTION.getPrefix() + "_" + tradeDTO.getMemberId()); + if (StringUtil.isEmpty(distributionId)) { return; } //循环订单商品列表,如果是分销商品则计算商品佣金 - tradeDTO.setDistributionId(cache.get(CachePrefix.DISTRIBUTION.getPrefix()+"_"+tradeDTO.getMemberId()).toString()); - for (CartSkuVO cartSkuVO: tradeDTO.getSkuList()) { - if(cartSkuVO.getDistributionGoods()!=null){ + tradeDTO.setDistributionId(distributionId); + + List skuIds = tradeDTO.getCheckedSkuList().stream().map(cartSkuVO -> { + return cartSkuVO.getGoodsSku().getId(); + }).collect(Collectors.toList()); + //是否包含分销商品 + List distributionGoods = distributionGoodsService.distributionGoods(skuIds); + if (distributionGoods != null && !distributionGoods.isEmpty()) { + distributionGoods.forEach(dg -> tradeDTO.getCheckedSkuList().forEach(cartSkuVO -> { + if (cartSkuVO.getGoodsSku().getId().equals(dg.getSkuId())) { + cartSkuVO.setDistributionGoods(dg); + } + })); + } + + for (CartSkuVO cartSkuVO : tradeDTO.getCheckedSkuList()) { + if (cartSkuVO.getDistributionGoods() != null) { cartSkuVO.getPriceDetailDTO().setDistributionCommission(CurrencyUtil.mul(cartSkuVO.getNum(), cartSkuVO.getDistributionGoods().getCommission())); } - } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java index 7b24bf15..270caba9 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java @@ -1,103 +1,202 @@ package cn.lili.modules.order.cart.render.impl; -import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.service.FullDiscountService; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.order.cart.render.CartRenderStep; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.order.cart.render.util.PromotionPriceUtil; +import cn.lili.modules.order.order.entity.dto.DiscountPriceItem; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.promotion.entity.dos.FullDiscount; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** - * FullDiscountRender + * 满减优惠渲染 * * @author Chopper - * @date 2020-04-01 10:27 上午 + * @since 2020-04-01 10:27 上午 */ @Service -@Order(1) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FullDiscountRender implements CartRenderStep { - private final FullDiscountService fullDiscountService; + @Autowired + private GoodsSkuService goodsSkuService; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.FULL_DISCOUNT; + } @Override public void render(TradeDTO tradeDTO) { - // 获取购物车中所有的商品 - List cartSkuList = tradeDTO.getSkuList(); + //店铺集合 + List cartList = tradeDTO.getCartList(); - // 渲染的购物车 - List cartList = new ArrayList<>(); + //循环店铺购物车 + for (CartVO cart : cartList) { + List fullDiscountSkuList = cart.getSkuList().stream() + .filter(i -> i.getPromotionMap() != null && !i.getPromotionMap().isEmpty() && i.getPromotionMap().keySet().stream().anyMatch(j -> j.contains(PromotionTypeEnum.FULL_DISCOUNT.name()))) + .collect(Collectors.toList()); - // 确定有哪些商家 - List storeIds = new ArrayList<>(); + if (!fullDiscountSkuList.isEmpty()) { + Optional> fullDiscountOptional = fullDiscountSkuList.get(0).getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.FULL_DISCOUNT.name())).findFirst(); - // 根据店铺分组 - Map> storeCollect = cartSkuList.parallelStream().collect(Collectors.groupingBy(CartSkuVO::getStoreId)); - for (Map.Entry> storeCart : storeCollect.entrySet()) { - if (!storeCart.getValue().isEmpty()) { - storeIds.add(storeCart.getKey()); - CartVO cartVO = new CartVO(storeCart.getValue().get(0)); - if (CharSequenceUtil.isEmpty(cartVO.getDeliveryMethod())) { - cartVO.setDeliveryMethod(DeliveryMethodEnum.LOGISTICS.name()); - } - cartVO.setSkuList(storeCart.getValue()); - storeCart.getValue().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).findFirst().ifPresent(cartSkuVO -> cartVO.setChecked(true)); - cartList.add(cartVO); + if (fullDiscountOptional.isPresent()) { + JSONObject promotionsObj = JSONUtil.parseObj(fullDiscountOptional.get().getValue()); + FullDiscount fullDiscount = promotionsObj.toBean(FullDiscount.class); + FullDiscountVO fullDiscountVO = new FullDiscountVO(fullDiscount); - } - } + //如果有赠品,则将赠品信息写入 + if (Boolean.TRUE.equals(fullDiscount.getGiftFlag())) { + GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(fullDiscount.getGiftId()); + fullDiscountVO.setGiftSkuId(fullDiscount.getGiftId()); + fullDiscountVO.setGiftSkuName(goodsSku.getGoodsName()); + } - List fullDiscounts = fullDiscountService.currentPromotion(storeIds); - for (FullDiscountVO fullDiscount : fullDiscounts) { - if (fullDiscount.getPromotionGoodsList() != null || fullDiscount.getNumber() == -1) { - for (CartVO cart : cartList) { - if (fullDiscount.getStoreId().equals(cart.getStoreId())) { - cart.setFullDiscount(fullDiscount); - List skuIds; - if (fullDiscount.getNumber() != -1) { - skuIds = initFullDiscountGoods(fullDiscount, cartSkuList); - } else { - skuIds = cart.getSkuList().stream().map(i -> i.getGoodsSku().getId()).collect(Collectors.toList()); + //写入满减活动 + cart.setFullDiscount(fullDiscountVO); + Map skuPriceDetail = new HashMap<>(16); + for (CartSkuVO cartSkuVO : cart.getSkuList()) { + if (PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(fullDiscountVO.getScopeType()) && fullDiscountVO.getScopeId() != null && !fullDiscountVO.getScopeId().contains(cartSkuVO.getGoodsSku().getId())) { + continue; + } + skuPriceDetail.put(cartSkuVO.getGoodsSku().getId(), cartSkuVO.getPriceDetailDTO().getGoodsPrice()); + } + if (!skuPriceDetail.isEmpty()) { + //记录参与满减活动的sku + cart.setFullDiscountSkuIds(new ArrayList<>(skuPriceDetail.keySet())); + + Double countPrice = countPrice(skuPriceDetail); + + + if (isFull(countPrice, cart)) { + //如果减现金 + if (Boolean.TRUE.equals(fullDiscount.getFullMinusFlag())) { + PromotionPriceUtil.recountPrice(tradeDTO, skuPriceDetail, fullDiscount.getFullMinus(), PromotionTypeEnum.FULL_DISCOUNT, fullDiscountVO.getId()); + } + //打折 + else if (Boolean.TRUE.equals(fullDiscount.getFullRateFlag())) { + this.renderFullRate(cart, skuPriceDetail, CurrencyUtil.div(fullDiscount.getFullRate(), 10), fullDiscountVO.getId()); + } + //渲染满优惠 + renderFullMinus(cart); } - cart.setFullDiscountSkuIds(skuIds); } } } + } - tradeDTO.setCartList(cartList); } /** - * 获取参与满优惠的商品id + * 渲染满折 * - * @param fullDiscount 满优惠信息 - * @param cartSkuVOS 购物车商品sku信息 - * @return 参与满优惠的商品id + * @param cart + * @param skuPriceDetail */ - public List initFullDiscountGoods(FullDiscountVO fullDiscount, List cartSkuVOS) { - List goodsIds = new ArrayList<>(); - for (PromotionGoods promotionGoods : fullDiscount.getPromotionGoodsList()) { - for (CartSkuVO cartSkuVO : cartSkuVOS) { - if (cartSkuVO.getGoodsSku().getId().equals(promotionGoods.getSkuId())) { - goodsIds.add(promotionGoods.getSkuId()); - } - } - } - return goodsIds; + private void renderFullRate(CartVO cart, Map skuPriceDetail, Double rate, String activityId) { + + List cartSkuVOS = cart.getCheckedSkuList().stream().filter(cartSkuVO -> skuPriceDetail.containsKey(cartSkuVO.getGoodsSku().getId())).collect(Collectors.toList()); + + // 循环计算扣减金额 + cartSkuVOS.forEach(cartSkuVO -> { + PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO(); + + + Double discountPrice = CurrencyUtil.mul(priceDetailDTO.getGoodsPrice(), + CurrencyUtil.sub(1, rate) + ); + //优惠金额=旧的优惠金额+商品金额*商品折扣比例 + priceDetailDTO.setDiscountPrice( + CurrencyUtil.add(priceDetailDTO.getDiscountPrice(), discountPrice + ) + ); + //优惠金额=旧的优惠金额+商品金额*商品折扣比例 + priceDetailDTO.addDiscountPriceItem(DiscountPriceItem + .builder() + .discountPrice(discountPrice) + .promotionTypeEnum(PromotionTypeEnum.FULL_DISCOUNT) + .promotionId(activityId) + .skuId(cartSkuVO.getGoodsSku().getId()) + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + + .build()); + + }); + } + /** + * 渲染满减优惠 + * + * @param cartVO 购物车满优惠渲染 + */ + private void renderFullMinus(CartVO cartVO) { + //获取参与活动的商品总价 + FullDiscountVO fullDiscount = cartVO.getFullDiscount(); + + if (Boolean.TRUE.equals(fullDiscount.getCouponFlag())) { + cartVO.getGiftCouponList().add(fullDiscount.getCouponId()); + } + if (Boolean.TRUE.equals(fullDiscount.getGiftFlag())) { + cartVO.setGiftList(Arrays.asList(fullDiscount.getGiftId().split(","))); + } + if (Boolean.TRUE.equals(fullDiscount.getPointFlag())) { + cartVO.setGiftPoint(fullDiscount.getPoint()); + } + //如果满足,判定是否免邮,免邮的话需要渲染一边sku + if (Boolean.TRUE.equals(fullDiscount.getFreeFreightFlag())) { + for (CartSkuVO skuVO : cartVO.getCheckedSkuList()) { + skuVO.setIsFreeFreight(true); + } + } + } + + + /** + * 是否满足满优惠 + * + * @param cart 购物车展示信息 + * @return 是否满足满优惠 + */ + private boolean isFull(Double price, CartVO cart) { + if (cart.getFullDiscount().getFullMoney() <= price) { + cart.setPromotionNotice("正在参与满优惠活动[" + cart.getFullDiscount().getPromotionName() + "]" + cart.getFullDiscount().notice()); + return true; + } else { + cart.setPromotionNotice("还差" + CurrencyUtil.sub(cart.getFullDiscount().getFullMoney(), price) + " 即可参与活动(" + cart.getFullDiscount().getPromotionName() + ")" + cart.getFullDiscount().notice()); + return false; + } + } + + /** + * 统计参与满减商品价格 + * + * @param skuPriceMap sku价格 + * @return 总价 + */ + private Double countPrice(Map skuPriceMap) { + double count = 0d; + + for (Double price : skuPriceMap.values()) { + count = CurrencyUtil.add(count, price); + } + + return count; + } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java index 8a682f30..b4edf0fe 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java @@ -1,70 +1,192 @@ package cn.lili.modules.order.cart.render.impl; -import cn.hutool.core.util.NumberUtil; import cn.lili.common.utils.CurrencyUtil; +import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.render.CartRenderStep; import cn.lili.modules.store.entity.dos.FreightTemplateChild; +import cn.lili.modules.store.entity.dos.StoreAddress; import cn.lili.modules.store.entity.dto.FreightTemplateChildDTO; import cn.lili.modules.store.entity.enums.FreightTemplateEnum; import cn.lili.modules.store.entity.vos.FreightTemplateVO; import cn.lili.modules.store.service.FreightTemplateService; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * sku 运费计算 * * @author Chopper - * @date 2020-07-02 14:47 + * @since 2020-07-02 14:47 */ -@Order(4) @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SkuFreightRender implements CartRenderStep { - private final FreightTemplateService freightTemplateService; + @Autowired + private FreightTemplateService freightTemplateService; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.SKU_FREIGHT; + } @Override public void render(TradeDTO tradeDTO) { - List cartSkuVOS = tradeDTO.getSkuList(); + List cartSkuVOS = tradeDTO.getCheckedSkuList(); + //会员收货地址问题处理 + MemberAddress memberAddress = tradeDTO.getMemberAddress(); + StoreAddress storeAddress = tradeDTO.getStoreAddress(); + //如果收货地址为空,则抛出异常 + if (memberAddress == null && storeAddress == null) { + return; + } + //选择物流的时候计算价格 + if(DeliveryMethodEnum.LOGISTICS.name().equals(tradeDTO.getCartList().get(0).getDeliveryMethod())){ + if (memberAddress != null) { + //运费分组信息 + Map> freightGroups = freightTemplateGrouping(cartSkuVOS); + + //循环运费模版 + for (Map.Entry> freightTemplateGroup : freightGroups.entrySet()) { + + //商品id列表 + List skuIds = freightTemplateGroup.getValue(); + + //当前购物车商品列表 + List currentCartSkus = cartSkuVOS.stream().filter(item -> skuIds.contains(item.getGoodsSku().getId())).collect(Collectors.toList()); + + //寻找对应对商品运费计算模版 + FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateGroup.getKey()); + if (freightTemplate != null + && freightTemplate.getFreightTemplateChildList() != null + && !freightTemplate.getFreightTemplateChildList().isEmpty()) { + //店铺模版免运费则跳过 + if (freightTemplate.getPricingMethod().equals(FreightTemplateEnum.FREE.name())) { + continue; + } + + //运费模版 + FreightTemplateChild freightTemplateChild = null; + + //获取市级别id匹配运费模版 + String addressId = memberAddress.getConsigneeAddressIdPath().split(",")[1]; + for (FreightTemplateChild templateChild : freightTemplate.getFreightTemplateChildList()) { + //模版匹配判定 + if (templateChild.getAreaId().contains(addressId)) { + freightTemplateChild = templateChild; + break; + } + } + //如果没有匹配到物流规则,则说明不支持配送 + if (freightTemplateChild == null) { + if (tradeDTO.getNotSupportFreight() == null) { + tradeDTO.setNotSupportFreight(new ArrayList<>()); + } + tradeDTO.getNotSupportFreight().addAll(currentCartSkus); + continue; + } + + //物流规则模型创立 + FreightTemplateChildDTO freightTemplateChildDTO = new FreightTemplateChildDTO(freightTemplateChild); + //模型写入运费模版设置的计费方式 + freightTemplateChildDTO.setPricingMethod(freightTemplate.getPricingMethod()); + + //计算运费总数 + Double count = currentCartSkus.stream().mapToDouble(item -> + // 根据计费规则 累加计费基数 + freightTemplateChildDTO.getPricingMethod().equals(FreightTemplateEnum.NUM.name()) ? + item.getNum().doubleValue() : + CurrencyUtil.mul(item.getNum(), item.getGoodsSku().getWeight()) + ).sum(); + + //计算运费 + Double countFreight = countFreight(count, freightTemplateChildDTO); + + //写入SKU运费 + resetFreightPrice(FreightTemplateEnum.valueOf(freightTemplateChildDTO.getPricingMethod()), count, countFreight, currentCartSkus); + } + } + } + }else{ + //自提清空不配送商品 + tradeDTO.setNotSupportFreight(null); + } + } + + + /** + * sku运费写入 + * + * @param freightTemplateEnum 运费计算模式 + * @param count 计费基数总数 + * @param countFreight 总运费 + * @param cartSkuVOS 与运费相关的购物车商品 + */ + private void resetFreightPrice(FreightTemplateEnum freightTemplateEnum, Double count, Double countFreight, List cartSkuVOS) { + + //剩余运费 默认等于总运费 + Double surplusFreightPrice = countFreight; + + //当前下标 + int index = 1; for (CartSkuVO cartSkuVO : cartSkuVOS) { + //如果是最后一个 则将剩余运费直接赋值 + //PS: 循环中避免百分比累加不等于100%,所以最后一个运费不以比例计算,直接将剩余运费赋值 + if (index == cartSkuVOS.size()) { + cartSkuVO.getPriceDetailDTO().setFreightPrice(surplusFreightPrice); + break; + } + + Double freightPrice = freightTemplateEnum == FreightTemplateEnum.NUM ? + CurrencyUtil.mul(countFreight, CurrencyUtil.div(cartSkuVO.getNum(), count)) : + CurrencyUtil.mul(countFreight, + CurrencyUtil.div(CurrencyUtil.mul(cartSkuVO.getNum(), cartSkuVO.getGoodsSku().getWeight()), count)); + + //剩余运费=总运费-当前循环的商品运费 + surplusFreightPrice = CurrencyUtil.sub(surplusFreightPrice, freightPrice); + + cartSkuVO.getPriceDetailDTO().setFreightPrice(freightPrice); + index++; + } + } + + /** + * 运费模版分组 + * + * @param cartSkuVOS 购物车商品 + * @return map<运费模版id , List < skuid>> + */ + private Map> freightTemplateGrouping(List cartSkuVOS) { + Map> map = new HashMap<>(); + //循环渲染购物车商品运费价格 + for (CartSkuVO cartSkuVO : cartSkuVOS) { + ////免运费判定 String freightTemplateId = cartSkuVO.getGoodsSku().getFreightTemplateId(); - //免运费则跳出运费计算 if (Boolean.TRUE.equals(cartSkuVO.getIsFreeFreight()) || freightTemplateId == null) { continue; } - //寻找对应对商品运费计算模版 - FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateId); - if (freightTemplate != null && freightTemplate.getFreightTemplateChildList() != null && !freightTemplate.getFreightTemplateChildList().isEmpty()) { - FreightTemplateChild freightTemplateChild = freightTemplate.getFreightTemplateChildList().get(0); - FreightTemplateChildDTO freightTemplateChildDTO = new FreightTemplateChildDTO(freightTemplateChild); - freightTemplateChildDTO.setPricingMethod(freightTemplate.getPricingMethod()); - - //要计算的基数 数量/重量 - Double count = (freightTemplateChildDTO.getPricingMethod().equals(FreightTemplateEnum.NUM.name())) ? - cartSkuVO.getNum() : - cartSkuVO.getGoodsSku().getWeight() * cartSkuVO.getNum(); - - //计算运费 - Double countFreight = countFreight(count, freightTemplateChildDTO); - //写入运费 - cartSkuVO.getPriceDetailDTO().setFreightPrice(countFreight); - //运费逻辑处理 - if (tradeDTO.getPriceDetailDTO().getFreightPrice() != null) { - tradeDTO.getPriceDetailDTO().setFreightPrice(CurrencyUtil.add(tradeDTO.getPriceDetailDTO().getFreightPrice(), countFreight)); - } else { - tradeDTO.getPriceDetailDTO().setFreightPrice(countFreight); - } + //包含 则value值中写入sku标识,否则直接写入新的对象,key为模版id,value为new arraylist + if (map.containsKey(freightTemplateId)) { + map.get(freightTemplateId).add(cartSkuVO.getGoodsSku().getId()); + } else { + List skuIdsList = new ArrayList<>(); + skuIdsList.add(cartSkuVO.getGoodsSku().getId()); + map.put(freightTemplateId, skuIdsList); } } + return map; } + /** * 计算运费 * @@ -75,14 +197,19 @@ public class SkuFreightRender implements CartRenderStep { private Double countFreight(Double count, FreightTemplateChildDTO template) { try { Double finalFreight = template.getFirstPrice(); - //不满首重 + //不满首重 / 首件 if (template.getFirstCompany() >= count) { return finalFreight; } + //如果续重/续件,费用不为空,则返回 + if (template.getContinuedCompany() == 0 || template.getContinuedPrice() == 0) { + return finalFreight; + } + + //计算 续重 / 续件 价格 Double continuedCount = count - template.getFirstCompany(); - // 计算续重价格 return CurrencyUtil.add(finalFreight, - CurrencyUtil.mul(NumberUtil.parseInt(String.valueOf((continuedCount / template.getContinuedCompany()))), template.getContinuedPrice())); + CurrencyUtil.mul(Math.ceil(continuedCount / template.getContinuedCompany()), template.getContinuedPrice())); } catch (Exception e) { return 0D; } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java index 44ae91b9..b3cb010f 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java @@ -1,294 +1,289 @@ package cn.lili.modules.order.cart.render.impl; -import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; -import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; -import cn.lili.modules.order.cart.entity.vo.PriceDetailVO; import cn.lili.modules.order.cart.render.CartRenderStep; +import cn.lili.modules.order.order.entity.dto.DiscountPriceItem; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; -import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.dto.GoodsSkuPromotionPriceDTO; -import cn.lili.modules.promotion.entity.dto.PromotionPriceDTO; -import cn.lili.modules.promotion.entity.dto.PromotionPriceParamDTO; -import cn.lili.modules.promotion.entity.dto.StorePromotionPriceDTO; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; +import cn.lili.modules.promotion.entity.vos.PromotionSkuVO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService; -import cn.lili.modules.promotion.service.PromotionPriceService; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Objects; /** * 购物促销信息渲染实现 * * @author Chopper - * @date 2020-07-02 14:47 + * @since 2020-07-02 14:47 */ @Service -@Order(2) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SkuPromotionRender implements CartRenderStep { - //促销计算 - private final PromotionPriceService promotionPriceService; - //促销商品 - private final PromotionGoodsService promotionGoodsService; + + + @Autowired + private KanjiaActivityService kanjiaActivityService; + + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + + @Autowired + private PointsGoodsService pointsGoodsService; + + /** + * 促销商品 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + + @Autowired + private MemberService memberService; + + @Autowired + private Cache cache; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.SKU_PROMOTION; + } @Override public void render(TradeDTO tradeDTO) { - //主要渲染各个优惠的价格 - this.renderSkuPromotion(tradeDTO); + //基础价格渲染 + renderBasePrice(tradeDTO); + //渲染单品促销 + renderSkuPromotion(tradeDTO); + //检查促销库存 + checkPromotionQuantity(tradeDTO); + + } + + /** + * 基础价格渲染 + * + * @param tradeDTO + */ + private void renderBasePrice(TradeDTO tradeDTO) { + tradeDTO.getCartList().forEach( + cartVO -> cartVO.getCheckedSkuList().forEach(cartSkuVO -> { + PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO(); + priceDetailDTO.setGoodsPrice(cartSkuVO.getSubTotal()); + priceDetailDTO.setDiscountPrice(CurrencyUtil.sub(priceDetailDTO.getOriginalPrice(), cartSkuVO.getSubTotal())); + }) + ); } /** - * 渲染单品优惠 积分/拼团/秒杀 + * 渲染单品优惠 积分/拼团/秒杀/砍价 * * @param tradeDTO 购物车视图 */ private void renderSkuPromotion(TradeDTO tradeDTO) { - // 渲染促销价格 - this.renderPromotionPrice(tradeDTO); - //拼团和积分购买需要特殊处理,这里优先特殊处理 - if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) { - List cartSkuVOList = tradeDTO.getSkuList(); - for (CartSkuVO cartSku : cartSkuVOList) { - PriceDetailDTO priceDetailDTO = cartSku.getPriceDetailDTO(); - //需要支付的积分 - priceDetailDTO.setPayPoint( - CurrencyUtil.mul( - cartSku.getPoint(), cartSku.getNum()).intValue()); - } - } else { - //这里普通购物车也只渲染满优惠,其他优惠都是商品级别的,都写在商品属性里 - List cartVOS = tradeDTO.getCartList(); + switch (tradeDTO.getCartTypeEnum()) { - for (CartVO cartVO : cartVOS) { - if (isFull(cartVO)) { - this.renderFullMinus(cartVO); + //这里是双重循环,但是实际积分购买或者是砍价购买时,购物车只有一个商品,所以没有循环操作数据库或者其他的问题 + case POINTS: + Member userInfo = memberService.getUserInfo(); + long totalPayPoints = 0; + //处理积分商品购买 + for (CartVO cartVO : tradeDTO.getCartList()) { + for (CartSkuVO cartSkuVO : cartVO.getCheckedSkuList()) { + cartSkuVO.getPriceDetailDTO().setPayPoint(cartSkuVO.getPoint()); + PromotionSkuVO promotionSkuVO = new PromotionSkuVO(PromotionTypeEnum.POINTS_GOODS.name(), cartSkuVO.getPointsId()); + cartSkuVO.getPriceDetailDTO().getJoinPromotion().add(promotionSkuVO); + totalPayPoints += cartSkuVO.getPoint(); + + //记录优惠由来 + cartSkuVO.getPriceDetailDTO().setDiscountPriceItem( + DiscountPriceItem.builder() + .discountPrice(CurrencyUtil.sub(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getPurchasePrice())) + .promotionId(promotionSkuVO.getActivityId()) + .promotionTypeEnum(PromotionTypeEnum.POINTS_GOODS) + .skuId(cartSkuVO.getGoodsSku().getId()) + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + .build() + ); + } } - for (CartSkuVO cartSkuVO : cartVO.getSkuList()) { - promotionGoodsService.getCartSkuPromotion(cartSkuVO); + if (userInfo.getPoint() < totalPayPoints) { + throw new ServiceException(ResultCode.POINT_NOT_ENOUGH); } - } + return; + case KANJIA: + for (CartVO cartVO : tradeDTO.getCartList()) { + for (CartSkuVO cartSkuVO : cartVO.getCheckedSkuList()) { + KanjiaActivitySearchParams kanjiaActivitySearchParams = new KanjiaActivitySearchParams(); + kanjiaActivitySearchParams.setGoodsSkuId(cartSkuVO.getGoodsSku().getId()); + kanjiaActivitySearchParams.setMemberId(Objects.requireNonNull(UserContext.getCurrentUser()).getId()); + kanjiaActivitySearchParams.setStatus(KanJiaStatusEnum.SUCCESS.name()); + KanjiaActivityVO kanjiaActivityVO = kanjiaActivityService.getKanjiaActivityVO(kanjiaActivitySearchParams); + //可以砍价金额购买,则处理信息 + if (Boolean.TRUE.equals(kanjiaActivityVO.getPass())) { + cartSkuVO.setKanjiaId(kanjiaActivityVO.getId()); + cartSkuVO.setPurchasePrice(kanjiaActivityVO.getPurchasePrice()); + cartSkuVO.setSubTotal(kanjiaActivityVO.getPurchasePrice()); + cartSkuVO.getPriceDetailDTO().setGoodsPrice(kanjiaActivityVO.getPurchasePrice()); + } + PromotionSkuVO promotionSkuVO = new PromotionSkuVO(PromotionTypeEnum.KANJIA.name(), cartSkuVO.getKanjiaId()); + cartSkuVO.getPriceDetailDTO().getJoinPromotion().add(promotionSkuVO); + //记录优惠由来 + cartSkuVO.getPriceDetailDTO().setDiscountPriceItem( + DiscountPriceItem.builder() + .discountPrice(CurrencyUtil.sub(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getPurchasePrice())) + .promotionId(promotionSkuVO.getActivityId()) + .promotionTypeEnum(PromotionTypeEnum.KANJIA) + .skuId(cartSkuVO.getGoodsSku().getId()) + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + .build() + ); + } + } + return; + case PINTUAN: + for (CartVO cartVO : tradeDTO.getCartList()) { + for (CartSkuVO cartSkuVO : cartVO.getCheckedSkuList()) { + PromotionSkuVO promotionSkuVO = new PromotionSkuVO(PromotionTypeEnum.PINTUAN.name(), cartSkuVO.getPintuanId()); + cartSkuVO.getPriceDetailDTO().getJoinPromotion().add(promotionSkuVO); + + //记录优惠由来 + cartSkuVO.getPriceDetailDTO().setDiscountPriceItem( + DiscountPriceItem.builder() + .discountPrice(CurrencyUtil.sub(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getPurchasePrice())) + .promotionId(promotionSkuVO.getActivityId()) + .promotionTypeEnum(PromotionTypeEnum.PINTUAN) + .skuId(cartSkuVO.getGoodsSku().getId()) + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + .build() + ); + } + } + return; + case CART: + case BUY_NOW: + case VIRTUAL: + //循环购物车 + for (CartVO cartVO : tradeDTO.getCartList()) { + //循环sku + for (CartSkuVO cartSkuVO : cartVO.getCheckedSkuList()) { + //赋予商品促销信息 + for (Map.Entry entry : cartSkuVO.getPromotionMap().entrySet()) { + if (ignorePromotion(entry.getKey())) { + continue; + } + + JSONObject promotionsObj = JSONUtil.parseObj(entry.getValue()); + PromotionSkuVO promotionSkuVO = new PromotionSkuVO(entry.getKey().split("-")[0], promotionsObj.get("id", String.class)); + cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); + cartSkuVO.getPriceDetailDTO().setGoodsPrice(cartSkuVO.getSubTotal()); + + cartSkuVO.getPriceDetailDTO().getJoinPromotion().add(promotionSkuVO); + + //如果是秒杀活动 + if (promotionSkuVO.getPromotionType().equals(PromotionTypeEnum.SECKILL.name())) { + //需记录秒杀活动详情 + cartSkuVO.getPriceDetailDTO().setDiscountPriceItem( + DiscountPriceItem.builder() + .discountPrice(CurrencyUtil.sub(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getPurchasePrice())) + .promotionId(promotionSkuVO.getActivityId()) + .promotionTypeEnum(PromotionTypeEnum.SECKILL) + .skuId(cartSkuVO.getGoodsSku().getId()) + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + .build()); + } + + + } + } + } + return; + default: } } /** - * 渲染购物车视图的促销价格 + * 检查促销库存 * * @param tradeDTO 购物车视图 */ - private void renderPromotionPrice(TradeDTO tradeDTO) { - List promotionPriceParamList = new ArrayList<>(); - List cartList = tradeDTO.getCartList(); - for (CartVO cartVO : cartList) { - if (Boolean.TRUE.equals(cartVO.getChecked())) { - for (CartSkuVO cartSkuVO : cartVO.getSkuList()) { - // 检查当前购物车商品是否有效且为选中 - if (Boolean.TRUE.equals(cartSkuVO.getChecked()) && Boolean.FALSE.equals(cartSkuVO.getInvalid())) { - PromotionPriceParamDTO param = new PromotionPriceParamDTO(); - param.setSkuId(cartSkuVO.getGoodsSku().getId()); - param.setNum(cartSkuVO.getNum()); - // 是否为拼团商品计算 - if (cartSkuVO.getPintuanId() != null) { - param.setPintuanId(cartSkuVO.getPintuanId()); - } - promotionPriceParamList.add(param); - } + private void checkPromotionQuantity(TradeDTO tradeDTO) { + for (CartSkuVO cartSkuVO : tradeDTO.getCheckedSkuList()) { + List joinPromotion = cartSkuVO.getPriceDetailDTO().getJoinPromotion(); + if (!joinPromotion.isEmpty()) { + for (PromotionSkuVO promotionSkuVO : joinPromotion) { + this.checkPromotionGoodsQuantity(cartSkuVO, promotionSkuVO); } } } - //如果包含促销规则 - if (!promotionPriceParamList.isEmpty()) { - // 店铺优惠券集合 - List memberCoupons = new ArrayList<>(); - if (tradeDTO.getStoreCoupons() != null) { - memberCoupons.addAll(tradeDTO.getStoreCoupons().values().parallelStream().map(MemberCouponDTO::getMemberCoupon).collect(Collectors.toList())); - } - - // 平台优惠券 - if (tradeDTO.getPlatformCoupon() != null && tradeDTO.getPlatformCoupon().getMemberCoupon() != null) { - memberCoupons.add(tradeDTO.getPlatformCoupon().getMemberCoupon()); - } - // 检查优惠券集合中是否存在过期优惠券 - this.checkMemberCoupons(memberCoupons); - // 调用价格计算模块,返回价格计算结果 - PromotionPriceDTO promotionPrice = promotionPriceService.calculationPromotionPrice(promotionPriceParamList, memberCoupons); - // 分配计算后的促销 - this.distributionPromotionPrice(tradeDTO, promotionPrice); - } } - private void checkMemberCoupons(List memberCoupons) { - long now = DateUtil.date().getTime(); - memberCoupons.removeIf(memberCoupon -> memberCoupon.getEndTime().getTime() < now); - } - - /** - * 分配促销价格到购物车视图 - * - * @param tradeDTO 购物车视图 - * @param promotionPrice 促销价格计算结果 - */ - private void distributionPromotionPrice(TradeDTO tradeDTO, PromotionPriceDTO promotionPrice) { - - for (CartVO cartVO : tradeDTO.getCartList()) { - // 根据店铺分配店铺价格计算结果 - List collect = promotionPrice.getStorePromotionPriceList().parallelStream().map(i -> i.getStoreId().equals(cartVO.getStoreId()) ? i : null).collect(Collectors.toList()); - if (!collect.isEmpty() && collect.get(0) != null) { - StorePromotionPriceDTO storePromotionPriceDTO = collect.get(0); - // 根据商品分配商品结果计算结果 - this.distributionSkuPromotionPrice(cartVO.getSkuList(), storePromotionPriceDTO); - - if (storePromotionPriceDTO != null) { - PriceDetailDTO sSpd = new PriceDetailDTO(); - PriceDetailVO sPd = new PriceDetailVO(); - sSpd.setGoodsPrice(storePromotionPriceDTO.getTotalOriginPrice()); - sSpd.setDiscountPrice(storePromotionPriceDTO.getTotalDiscountPrice()); - sSpd.setCouponPrice(storePromotionPriceDTO.getTotalCouponPrice()); - sSpd.setPayPoint(storePromotionPriceDTO.getTotalPoints().intValue()); - - sPd.setOriginalPrice(storePromotionPriceDTO.getTotalOriginPrice()); - sPd.setFinalePrice(storePromotionPriceDTO.getTotalFinalePrice()); - sPd.setDiscountPrice(storePromotionPriceDTO.getTotalDiscountPrice()); - sPd.setPayPoint(storePromotionPriceDTO.getTotalPoints().intValue()); - cartVO.setPriceDetailDTO(sSpd); - cartVO.setPriceDetailVO(sPd); - cartVO.setWeight(storePromotionPriceDTO.getTotalWeight()); - } + private void checkPromotionGoodsQuantity(CartSkuVO cartSkuVO, PromotionSkuVO promotionSkuVO) { + String promotionGoodsStockCacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); + Object quantity = cache.get(promotionGoodsStockCacheKey); + if (quantity == null) { + //如果促销有库存信息 + PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()); + switch (promotionTypeEnum) { + case KANJIA: + quantity = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId()).getStock(); + break; + case POINTS_GOODS: + quantity = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId()).getActiveStock(); + break; + case SECKILL: + case PINTUAN: + quantity = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); + break; + default: + return; } } - // 根据整个购物车分配价格计算结果 - PriceDetailDTO priceDetailDTO = new PriceDetailDTO(); - priceDetailDTO.setDiscountPrice(promotionPrice.getTotalDiscountPrice()); - priceDetailDTO.setGoodsPrice(promotionPrice.getTotalOriginPrice()); - priceDetailDTO.setCouponPrice(promotionPrice.getTotalCouponPrice()); - priceDetailDTO.setPayPoint(promotionPrice.getTotalPoints().intValue()); - - tradeDTO.setPriceDetailDTO(priceDetailDTO); - } - - /** - * 分配促销价格到购物车视图的每个sku - * - * @param skuList sku列表 - * @param storePromotionPriceDTO 店铺促销结果计算结果 - */ - private void distributionSkuPromotionPrice(List skuList, StorePromotionPriceDTO storePromotionPriceDTO) { - if (storePromotionPriceDTO != null) { - for (CartSkuVO cartSkuVO : skuList) { - // 获取当前购物车商品的商品计算结果 - List collect = storePromotionPriceDTO.getGoodsSkuPromotionPriceList().parallelStream().filter(i -> i.getSkuId().equals(cartSkuVO.getGoodsSku().getId())).collect(Collectors.toList()); - if (!collect.isEmpty()) { - GoodsSkuPromotionPriceDTO goodsSkuPromotionPriceDTO = collect.get(0); - PriceDetailDTO spd = new PriceDetailDTO(); - spd.setDiscountPrice(goodsSkuPromotionPriceDTO.getTotalDiscountPrice()); - spd.setGoodsPrice(goodsSkuPromotionPriceDTO.getTotalOriginalPrice()); - spd.setCouponPrice(goodsSkuPromotionPriceDTO.getCouponPrice()); - spd.setJoinPromotion(goodsSkuPromotionPriceDTO.getJoinPromotion()); - spd.setPayPoint(goodsSkuPromotionPriceDTO.getTotalPoints().intValue()); - PriceDetailVO pd = new PriceDetailVO(); - pd.setFinalePrice(goodsSkuPromotionPriceDTO.getFinalePrice()); - pd.setOriginalPrice(goodsSkuPromotionPriceDTO.getOriginalPrice()); - pd.setDiscountPrice(goodsSkuPromotionPriceDTO.getDiscountPrice()); - pd.setPayPoint(goodsSkuPromotionPriceDTO.getTotalPoints().intValue()); - cartSkuVO.setPriceDetailDTO(spd); - cartSkuVO.setPriceDetailVO(pd); - } - - } - } - - } - - /** - * 渲染拼团 - * - * @param cartSkuList 购物车sku集合 - */ - private void renderPintuan(List cartSkuList) { - for (CartSkuVO cartSku : cartSkuList) { - PriceDetailDTO priceDetailDTO = cartSku.getPriceDetailDTO(); -// PromotionGoods promotionGoods = cartSku.getPromotion(); - //参与平台则以拼团价处理 - if (StringUtils.isNotEmpty(cartSku.getPintuanId())) { -// Double discountPrice = CurrencyUtil.sub(cartSku.getGoodsSku().getPrice(), promotionGoods.getPrice()); -// priceDetailDTO.setDiscountPrice(discountPrice); - } else { - //否则代表单独购买,则以原价购买 - priceDetailDTO.setDiscountPrice(0d); - } + if (quantity != null && cartSkuVO.getNum() > (Integer) quantity) {//设置购物车未选中 + cartSkuVO.setChecked(false); + //设置失效消息 + cartSkuVO.setErrorMessage("促销商品库存不足,现有库存数量[" + quantity + "]"); } } /** - * 渲染满减优惠 - * - * @param cartVO 购物车展示信息 + * 购物车促销类型 */ - private void renderFullMinus(CartVO cartVO) { - - //获取参与活动的商品总价 - FullDiscountVO fullDiscount = cartVO.getFullDiscount(); - - - if (Boolean.TRUE.equals(fullDiscount.getIsCoupon())) { - cartVO.getGiftCouponList().add(fullDiscount.getCouponId()); - } - if (Boolean.TRUE.equals(fullDiscount.getIsGift())) { - cartVO.setGiftList(Arrays.asList(fullDiscount.getGiftId().split(","))); - } - if (Boolean.TRUE.equals(fullDiscount.getIsPoint())) { - cartVO.setGiftPoint(cartVO.getGiftPoint() + fullDiscount.getPoint()); - } + private boolean ignorePromotion(String promotionKey) { + // 忽略积分活动活动 忽略砍价活动 忽略优惠券活动 忽略拼团活动 + return promotionKey.contains(PromotionTypeEnum.POINTS_GOODS.name()) + || promotionKey.contains(PromotionTypeEnum.KANJIA.name()) + || promotionKey.contains(PromotionTypeEnum.COUPON.name()) + || promotionKey.contains(PromotionTypeEnum.PINTUAN.name()); } - - /** - * 是否满足满优惠 - * - * @param cart 购物车展示信息 - * @return 是否满足满优惠 - */ - private boolean isFull(CartVO cart) { - Double price = cart.getPriceDetailDTO().getGoodsPrice(); - if (cart.getFullDiscount() != null) { - if (cart.getFullDiscount().getFullMoney() <= price) { - cart.setPromotionNotice("正在参与满优惠活动(" + cart.getFullDiscount().getPromotionName() + ")" + cart.getFullDiscount().notice()); - //如果满足,判定是否免邮,免邮的话需要渲染一边sku - if (Boolean.TRUE.equals(cart.getFullDiscount().getIsFreeFreight())) { - for (CartSkuVO skuVO : cart.getSkuList()) { - skuVO.setIsFreeFreight(true); - } - } - return true; - } else { - cart.setPromotionNotice("还差" + CurrencyUtil.sub(cart.getFullDiscount().getFullMoney(), price) + " 即可参与活动(" + cart.getFullDiscount().getPromotionName() + ")" + cart.getFullDiscount().notice()); - return false; - } - } else { - cart.setPromotionNotice(""); - } - return false; - } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/util/PromotionPriceUtil.java b/framework/src/main/java/cn/lili/modules/order/cart/render/util/PromotionPriceUtil.java new file mode 100644 index 00000000..d375c16f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/util/PromotionPriceUtil.java @@ -0,0 +1,257 @@ +package cn.lili.modules.order.cart.render.util; + +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.order.entity.dto.DiscountPriceItem; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 促销价格计算业务层实现 + * + * @author paulG + * @since 2020/8/21 + **/ +@Slf4j +public class PromotionPriceUtil { + + /** + * 重新计算购物车价格 + * + * @param tradeDTO 交易DTO + * @param skuPromotionDetail 参与活动的商品,以及商品总金额 + * @param discountPrice 需要分发的优惠金额 + * @param promotionTypeEnum 促销类型 + */ + public static void recountPrice(TradeDTO tradeDTO, Map skuPromotionDetail, Double discountPrice, + PromotionTypeEnum promotionTypeEnum, String activityId) { + + // sku 促销信息非空判定 + if (skuPromotionDetail == null || skuPromotionDetail.size() == 0) { + return; + } + + //计算总金额 + Double totalPrice = 0D; + for (Double value : skuPromotionDetail.values()) { + totalPrice = CurrencyUtil.add(totalPrice, value); + } + + //极端情况,如果扣减金额小于需要支付的金额,则扣减金额=支付金额,不能成为负数 + if (discountPrice > totalPrice) { + discountPrice = totalPrice; + + for (String skuId : skuPromotionDetail.keySet()) { + + //获取对应商品进行计算 + for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + + if (cartSkuVO.getGoodsSku().getId().equals(skuId)) { + //优惠券金额,则计入优惠券 ,其他则计入总的discount price + if (promotionTypeEnum == PromotionTypeEnum.COUPON) { + cartSkuVO.getPriceDetailDTO().setCouponPrice(cartSkuVO.getPriceDetailDTO().getGoodsPrice()); + } else { + cartSkuVO.getPriceDetailDTO().setDiscountPrice(cartSkuVO.getPriceDetailDTO().getGoodsPrice()); + } + } + } + } + } + + //获取购物车信息 + List skuVOList = tradeDTO.getSkuList(); + + // 获取map分配sku的总数,如果是最后一个商品分配金额,则将金额从百分比改为总金额扣减,避免出现小数除不尽 + int count = skuPromotionDetail.size(); + + //已优惠金额 + Double deducted = 0D; + + for (String skuId : skuPromotionDetail.keySet()) { + + //获取对应商品进行计算 + for (CartSkuVO cartSkuVO : skuVOList) { + + if (cartSkuVO.getGoodsSku().getId().equals(skuId)) { + + count--; + + //sku 优惠金额 + Double skuDiscountPrice; + + //非最后一个商品,则按照比例计算 + if (count > 0) { + //商品金额占比 + double point = CurrencyUtil.div(cartSkuVO.getPriceDetailDTO().getGoodsPrice(), totalPrice, 4); + //商品优惠金额 + skuDiscountPrice = CurrencyUtil.mul(discountPrice, point); + //累加已优惠金额 + deducted = CurrencyUtil.add(deducted, skuDiscountPrice); + } + // 如果是最后一个商品 则减去之前优惠的金额来进行计算 + else { + skuDiscountPrice = CurrencyUtil.sub(discountPrice, deducted); + } + + calculateCartSkuPromotionsPrice(cartSkuVO, skuDiscountPrice, promotionTypeEnum, activityId); + } + } + } + + calculateNotEnoughPromotionsPrice(skuVOList, skuPromotionDetail, discountPrice, totalPrice, promotionTypeEnum, activityId); + + } + + + /** + * 计算购物车商品优惠金额 + * + * @param cartSkuVO 购物车商品 + * @param skuDiscountPrice 商品优惠金额 + * @param promotionTypeEnum 优惠类型 + * @param activityId 优惠活动id + */ + private static void calculateCartSkuPromotionsPrice(CartSkuVO cartSkuVO, Double skuDiscountPrice, PromotionTypeEnum promotionTypeEnum, + String activityId) { + //优惠券金额,则计入优惠券 ,其他则计入总的discount price + if (promotionTypeEnum == PromotionTypeEnum.COUPON) { + + cartSkuVO.getPriceDetailDTO().setCouponPrice( + CurrencyUtil.add(cartSkuVO.getPriceDetailDTO().getCouponPrice(), skuDiscountPrice)); + + cartSkuVO.getPriceDetailDTO().addDiscountPriceItem( + DiscountPriceItem.builder() + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + .skuId(cartSkuVO.getGoodsSku().getId()) + .discountPrice(skuDiscountPrice) + .promotionTypeEnum(PromotionTypeEnum.COUPON) + .promotionId(activityId) + .build() + ); + + } else if (promotionTypeEnum == PromotionTypeEnum.PLATFORM_COUPON) { + + cartSkuVO.getPriceDetailDTO().setSiteCouponPrice( + CurrencyUtil.add(cartSkuVO.getPriceDetailDTO().getCouponPrice(), skuDiscountPrice)); + + cartSkuVO.getPriceDetailDTO().setCouponPrice( + CurrencyUtil.add(cartSkuVO.getPriceDetailDTO().getCouponPrice(), cartSkuVO.getPriceDetailDTO().getSiteCouponPrice())); + + + cartSkuVO.getPriceDetailDTO().addDiscountPriceItem( + DiscountPriceItem.builder() + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + .skuId(cartSkuVO.getGoodsSku().getId()) + .discountPrice(skuDiscountPrice) + .promotionTypeEnum(PromotionTypeEnum.PLATFORM_COUPON) + .promotionId(activityId) + .build() + ); + + } else { + cartSkuVO.getPriceDetailDTO().setDiscountPrice( + CurrencyUtil.add(cartSkuVO.getPriceDetailDTO().getDiscountPrice(), skuDiscountPrice)); + + //目前剩余的只有满减金额活动。后续如果需要调整,这里建议传递活动类型进来 + cartSkuVO.getPriceDetailDTO().addDiscountPriceItem( + DiscountPriceItem.builder() + .goodsId(cartSkuVO.getGoodsSku().getGoodsId()) + .skuId(cartSkuVO.getGoodsSku().getId()) + .discountPrice(skuDiscountPrice) + .promotionTypeEnum(PromotionTypeEnum.FULL_DISCOUNT) + .promotionId(activityId) + .build() + ); + } + } + + /** + * 特殊情况处理,如参与多个促销活动,部分商品在其他促销计算后的金额不足以满足与当前参与的促销活动的优惠金额(只计算使用优惠券不足的情况) + * + * @param skuVOList 获取购物车信息 + * @param skuPromotionDetail 参与活动的商品,以及商品总金额 + * @param discountPrice 需要分发的优惠金额 + * @param totalPrice 计算总金额 + * @param promotionTypeEnum 优惠类型 + * @param activityId 优惠活动id + */ + private static void calculateNotEnoughPromotionsPrice(List skuVOList, Map skuPromotionDetail, Double discountPrice, + Double totalPrice, PromotionTypeEnum promotionTypeEnum, String activityId) { + // 特殊情况处理,如参与多个促销活动,部分商品在其他促销计算后的金额不足以满足与当前参与的促销活动的优惠金额 + // 但当前购物车内存在当前当前促销活动的其他商品且剩余金额也满足分摊不足商品的不足金额,则分摊到其他商品上 + // 满足当前促销的总优惠金额 + if (skuPromotionDetail == null || skuPromotionDetail.isEmpty()) { + return; + } + long matchPromotionsZeroCount = + skuVOList.stream().filter(l -> l.getPriceDetailDTO().getFlowPrice() == 0 && skuPromotionDetail.containsKey(l.getGoodsSku().getId())).count(); + long matchPromotionsCount = skuVOList.stream().filter(l -> skuPromotionDetail.containsKey(l.getGoodsSku().getId())).count(); + if (matchPromotionsZeroCount == matchPromotionsCount) { + return; + } + // 获取剩余金额不足优惠金额的商品 + List unEnoughSku = skuVOList.stream().filter(k -> { + if (skuPromotionDetail.containsKey(k.getGoodsSku().getId()) && skuPromotionDetail.size() >= 2) { + //商品金额占比 + double point = CurrencyUtil.div(k.getPriceDetailDTO().getGoodsPrice(), totalPrice, 4); + //商品优惠金额 + Double skuDiscountPrice = CurrencyUtil.mul(discountPrice, point); + return k.getPriceDetailDTO().getCouponPrice() > 0 && skuDiscountPrice > k.getPriceDetailDTO().getCouponPrice(); + } + return false; + }).collect(Collectors.toList()); + if (!unEnoughSku.isEmpty()) { + if (unEnoughSku.size() == skuVOList.size()) { + return; + } + for (CartSkuVO cartSkuVO : skuVOList) { + if (unEnoughSku.isEmpty()) { + break; + } + if (skuPromotionDetail.containsKey(cartSkuVO.getGoodsSku().getId()) && unEnoughSku.stream().noneMatch(k -> k.getGoodsSku().getId().equals(cartSkuVO.getGoodsSku().getId()))) { + // 商品金额占比 + double point = CurrencyUtil.div(cartSkuVO.getPriceDetailDTO().getGoodsPrice(), totalPrice, 4); + // 商品优惠金额 + Double skuDiscountPrice = CurrencyUtil.mul(discountPrice, point); + // 商品优惠金额 - 不足优惠金额 = 差额 + Double sub = CurrencyUtil.sub(skuDiscountPrice, unEnoughSku.get(0).getPriceDetailDTO().getCouponPrice()); + // 分摊到其他商品: 其他商品原优惠金额 + 差额 + calculateCartSkuPromotionsPrice(cartSkuVO, sub, promotionTypeEnum, activityId); + // 从不足商品列表中移除 + unEnoughSku.remove(0); + } + } + } else { + return; + } + calculateNotEnoughPromotionsPrice(skuVOList, skuPromotionDetail, discountPrice, totalPrice, promotionTypeEnum, activityId); + } + + /** + * 检查活动有效时间 + * + * @param startTime 活动开始时间 + * @param endTime 活动结束时间 + * @param promotionType 活动类型 + * @param promotionId 活动ID + * @return 是否有效 + */ + private static boolean checkPromotionValidTime(Date startTime, Date endTime, String promotionType, String promotionId) { + long now = System.currentTimeMillis(); + if (startTime.getTime() > now) { + log.error("商品ID为{}的{}活动开始时间小于当时时间,活动未开始!", promotionId, promotionType); + return false; + } + if (endTime.getTime() < now) { + log.error("活动ID为{}的{}活动结束时间大于当时时间,活动已结束!", promotionId, promotionType); + return false; + } + return true; + } +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java index 09531030..2d525af4 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java @@ -1,10 +1,8 @@ package cn.lili.modules.order.cart.service; -import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; -import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.TradeParams; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.vo.ReceiptVO; @@ -15,7 +13,7 @@ import java.util.List; * 购物车业务层 * * @author Chopper - * @date 2020-03-23 12:29 下午 + * @since 2020-03-23 12:29 下午 */ public interface CartService { @@ -56,16 +54,9 @@ public interface CartService { * @param skuId 要写入的skuId * @param num 要加入购物车的数量 * @param cartType 购物车类型 + * @param cover 是否覆盖购物车的数量,如果为否则累加,否则直接覆盖 */ - void add(String skuId, Integer num, String cartType); - - /** - * 更新商品数量 - * - * @param skuId 要写入的skuId - * @param num 要加入购物车的数量 - */ - void updateNum(String skuId, int num); + void add(String skuId, Integer num, String cartType, Boolean cover); /** @@ -106,13 +97,6 @@ public interface CartService { */ void clean(); - /** - * 清空购物车无效数据 - * - * @param way 购物车类型 - */ - void cleanChecked(CartTypeEnum way); - /** * 重新写入 * @@ -129,6 +113,14 @@ public interface CartService { */ void shippingAddress(String shippingAddressId, String way); + /** + * 选择自提地址 + * + * @param shopAddressId 收货地址id + * @param way 购物车类型 + */ + void shippingSelfAddress(String shopAddressId, String way); + /** * 选择发票 * @@ -141,11 +133,10 @@ public interface CartService { /** * 选择配送方式 * - * @param storeId 店铺id * @param deliveryMethod 配送方式 * @param way 购物车类型 */ - void shippingMethod(String storeId, String deliveryMethod, String way); + void shippingMethod(String deliveryMethod, String way); /** * 获取购物车商品数量 @@ -166,18 +157,23 @@ public interface CartService { /** * 创建交易 + * 1.获取购物车类型,不同的购物车类型有不同的订单逻辑 + * 购物车类型:购物车、立即购买、虚拟商品、拼团、积分 + * 2.校验用户的收件人信息 + * 3.设置交易的基础参数 + * 4.交易信息存储到缓存中 + * 5.创建交易 + * 6.清除购物车选择数据 * * @param tradeParams 创建交易参数 * @return 交易信息 */ Trade createTrade(TradeParams tradeParams); - /** - * 检查商品是否在配送范围 - * - * @param skuList 商品列表 - * @param memberAddress 配送地址 + /*** + * 获取可使用的配送方式 + * @param way + * @return */ - void checkAddressScope(List skuList, MemberAddress memberAddress); - + List shippingMethodList(String way); } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java index 64e06460..82c1805c 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java @@ -1,111 +1,179 @@ package cn.lili.modules.order.cart.service; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.cache.Cache; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dos.Wholesale; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.goods.service.WholesaleService; +import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberAddress; +import cn.lili.modules.member.service.MemberAddressService; +import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; -import cn.lili.modules.order.cart.entity.enums.TradeCacheEnum; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.entity.vo.TradeParams; import cn.lili.modules.order.cart.render.TradeBuilder; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.vo.ReceiptVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams; +import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.service.MemberAddressService; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; +import cn.lili.modules.promotion.service.KanjiaActivityService; import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.service.EsGoodsSearchService; -import cn.lili.modules.store.entity.dos.FreightTemplateChild; -import cn.lili.modules.store.entity.vos.FreightTemplateVO; -import cn.lili.modules.store.service.FreightTemplateService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.modules.store.entity.dos.StoreAddress; +import cn.lili.modules.store.service.StoreAddressService; +import cn.lili.modules.store.service.StoreService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** * 购物车业务层实现 * * @author Chopper - * @date 2020-03-23 12:29 下午 + * @since 2020-03-23 12:29 下午 */ @Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CartServiceImpl implements CartService { static String errorMessage = "购物车异常,请稍后重试"; - //缓存 - private final Cache cache; - //会员优惠券 - private final MemberCouponService memberCouponService; - //规格商品 - private final GoodsSkuService goodsSkuService; - //促销商品 - private final PromotionGoodsService promotionGoodsService; - //会员地址 - private final MemberAddressService memberAddressService; - //ES商品 - private final EsGoodsSearchService esGoodsSearchService; - //运费模板 - private final FreightTemplateService freightTemplateService; - //交易 + + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 会员优惠券 + */ + @Autowired + private MemberCouponService memberCouponService; + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + /** + * 促销商品 + */ + @Autowired + private PointsGoodsService pointsGoodsService; + /** + * 会员地址 + */ + @Autowired + private MemberAddressService memberAddressService; + /** + * ES商品 + */ + @Autowired + private EsGoodsSearchService esGoodsSearchService; + /** + * 砍价 + */ + @Autowired + private KanjiaActivityService kanjiaActivityService; + /** + * 交易 + */ + @Autowired private TradeBuilder tradeBuilder; + @Autowired + private MemberService memberService; + + @Autowired + private PromotionGoodsService promotionGoodsService; + + @Autowired + private WholesaleService wholesaleService; + + @Autowired + private StoreService storeService; + + @Autowired + private StoreAddressService storeAddressService; + @Override - public void add(String skuId, Integer num, String cartType) { + public void add(String skuId, Integer num, String cartType, Boolean cover) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + if (num <= 0) { + throw new ServiceException(ResultCode.CART_NUM_ERROR); + } CartTypeEnum cartTypeEnum = getCartType(cartType); - GoodsSku dataSku = checkGoods(skuId, num); + GoodsSku dataSku = checkGoods(skuId); + Map promotionMap = promotionGoodsService.getCurrentGoodsPromotion(dataSku, cartTypeEnum.name()); + try { //购物车方式购买需要保存之前的选择,其他方式购买,则直接抹除掉之前的记录 TradeDTO tradeDTO; if (cartTypeEnum.equals(CartTypeEnum.CART)) { + //如果存在,则变更数量不做新增,否则新增一个商品进入集合 tradeDTO = this.readDTO(cartTypeEnum); List cartSkuVOS = tradeDTO.getSkuList(); CartSkuVO cartSkuVO = cartSkuVOS.stream().filter(i -> i.getGoodsSku().getId().equals(skuId)).findFirst().orElse(null); + + //购物车中已经存在,更新数量 - if (cartSkuVO != null && dataSku.getUpdateTime().equals(cartSkuVO.getGoodsSku().getUpdateTime())) { - //判断是商品否被修改 - int oldNum = cartSkuVO.getNum(); - int newNum = oldNum + num; - this.checkSetGoodsQuantity(cartSkuVO, skuId, newNum); + if (cartSkuVO != null && dataSku.getCreateTime().equals(cartSkuVO.getGoodsSku().getCreateTime())) { + + //如果覆盖购物车中商品数量 + if (Boolean.TRUE.equals(cover)) { + cartSkuVO.setNum(num); + this.checkSetGoodsQuantity(cartSkuVO, skuId, num); + } else { + int oldNum = cartSkuVO.getNum(); + int newNum = oldNum + num; + this.checkSetGoodsQuantity(cartSkuVO, skuId, newNum); + } + cartSkuVO.setPromotionMap(promotionMap); //计算购物车小计 - cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(),cartSkuVO.getNum())); + cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); } else { + //先清理一下 如果商品无效的话 cartSkuVOS.remove(cartSkuVO); //购物车中不存在此商品,则新建立一个 - cartSkuVO = new CartSkuVO(dataSku); + cartSkuVO = new CartSkuVO(dataSku, promotionMap); cartSkuVO.setCartType(cartTypeEnum); - promotionGoodsService.updatePromotion(cartSkuVO); //再设置加入购物车的数量 this.checkSetGoodsQuantity(cartSkuVO, skuId, num); //计算购物车小计 - cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(),cartSkuVO.getNum())); + cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); cartSkuVOS.add(cartSkuVO); } @@ -113,50 +181,30 @@ public class CartServiceImpl implements CartService { cartSkuVO.setChecked(true); } else { tradeDTO = new TradeDTO(cartTypeEnum); - AuthUser currentUser = UserContext.getCurrentUser(); tradeDTO.setMemberId(currentUser.getId()); tradeDTO.setMemberName(currentUser.getUsername()); List cartSkuVOS = tradeDTO.getSkuList(); //购物车中不存在此商品,则新建立一个 - CartSkuVO cartSkuVO = new CartSkuVO(dataSku); + CartSkuVO cartSkuVO = new CartSkuVO(dataSku, promotionMap); cartSkuVO.setCartType(cartTypeEnum); - promotionGoodsService.updatePromotion(cartSkuVO); - //再设置加入购物车的数量 - this.checkSetGoodsQuantity(cartSkuVO, skuId, num); + //检测购物车数据 + checkCart(cartTypeEnum, cartSkuVO, skuId, num); //计算购物车小计 - cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(),cartSkuVO.getNum())); + cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); cartSkuVOS.add(cartSkuVO); } + + this.checkGoodsSaleModel(dataSku, tradeDTO.getSkuList()); tradeDTO.setCartTypeEnum(cartTypeEnum); + + remoteCoupon(tradeDTO); + this.resetTradeDTO(tradeDTO); + } catch (ServiceException serviceException) { + throw serviceException; } catch (Exception e) { - log.error("购物车渲染异常",e); - throw new ServiceException(errorMessage); - } - } - - - @Override - public void updateNum(String skuId, int num) { - try { - checkGoods(skuId, num); - TradeDTO tradeDTO = this.readDTO(CartTypeEnum.CART); - CartSkuVO cartSkuVO = null; - for (CartSkuVO skuVO : tradeDTO.getSkuList()) { - if (skuVO.getGoodsSku().getId().equals(skuId)) { - cartSkuVO = skuVO; - } - } - if (cartSkuVO != null) { - this.checkSetGoodsQuantity(cartSkuVO, skuId, num); - } - String originKey = this.getOriginKey(CartTypeEnum.CART); - cache.put(originKey, tradeDTO); - }catch (ServiceException se){ - log.error("购物车渲染异常", se); - } catch (Exception e) { - log.error("购物车渲染异常",e); + log.error("购物车渲染异常", e); throw new ServiceException(errorMessage); } } @@ -169,17 +217,12 @@ public class CartServiceImpl implements CartService { */ private String getOriginKey(CartTypeEnum cartTypeEnum) { - String cacheKey = ""; - //如果会员登录了,则要以会员id为key - AuthUser currentUser = UserContext.getCurrentUser(); - if (cartTypeEnum.equals(CartTypeEnum.CART)) { - cacheKey = TradeCacheEnum.CART_DATA.getPrefix() + currentUser.getId(); - } else if (cartTypeEnum.equals(CartTypeEnum.BUY_NOW)) { - cacheKey = TradeCacheEnum.BUY_NOW_CART_DATA.getPrefix() + currentUser.getId(); - } else if (cartTypeEnum.equals(CartTypeEnum.PINTUAN)) { - cacheKey = TradeCacheEnum.PINTUAN.getPrefix() + currentUser.getId(); + //缓存key,默认使用购物车 + if (cartTypeEnum != null) { + AuthUser currentUser = UserContext.getCurrentUser(); + return cartTypeEnum.getPrefix() + currentUser.getId(); } - return cacheKey; + throw new ServiceException(ResultCode.ERROR); } @Override @@ -200,35 +243,56 @@ public class CartServiceImpl implements CartService { @Override public void checked(String skuId, boolean checked) { TradeDTO tradeDTO = this.readDTO(CartTypeEnum.CART); + + remoteCoupon(tradeDTO); + List cartSkuVOS = tradeDTO.getSkuList(); for (CartSkuVO cartSkuVO : cartSkuVOS) { if (cartSkuVO.getGoodsSku().getId().equals(skuId)) { cartSkuVO.setChecked(checked); } } - cache.put(this.getOriginKey(CartTypeEnum.CART), tradeDTO); + + this.resetTradeDTO(tradeDTO); } @Override public void checkedStore(String storeId, boolean checked) { TradeDTO tradeDTO = this.readDTO(CartTypeEnum.CART); + + remoteCoupon(tradeDTO); + List cartSkuVOS = tradeDTO.getSkuList(); for (CartSkuVO cartSkuVO : cartSkuVOS) { if (cartSkuVO.getStoreId().equals(storeId)) { cartSkuVO.setChecked(checked); } } - cache.put(this.getOriginKey(CartTypeEnum.CART), tradeDTO); + + resetTradeDTO(tradeDTO); } @Override public void checkedAll(boolean checked) { TradeDTO tradeDTO = this.readDTO(CartTypeEnum.CART); + + remoteCoupon(tradeDTO); + List cartSkuVOS = tradeDTO.getSkuList(); for (CartSkuVO cartSkuVO : cartSkuVOS) { cartSkuVO.setChecked(checked); } - cache.put(this.getOriginKey(CartTypeEnum.CART), tradeDTO); + resetTradeDTO(tradeDTO); + } + + /** + * 当购物车商品发生变更时,取消已选择当优惠券 + * + * @param tradeDTO + */ + private void remoteCoupon(TradeDTO tradeDTO) { + tradeDTO.setPlatformCoupon(null); + tradeDTO.setStoreCoupons(new HashMap<>()); } @Override @@ -244,7 +308,7 @@ public class CartServiceImpl implements CartService { } } cartSkuVOS.removeAll(deleteVos); - cache.put(this.getOriginKey(CartTypeEnum.CART), tradeDTO); + resetTradeDTO(tradeDTO); } @Override @@ -261,19 +325,13 @@ public class CartServiceImpl implements CartService { } } cartSkuVOS.removeAll(deleteVos); - // 清除添加过的备注 + //清除选择的优惠券 + tradeDTO.setPlatformCoupon(null); + tradeDTO.setStoreCoupons(null); + //清除添加过的备注 tradeDTO.setStoreRemark(null); - cache.put(this.getOriginKey(tradeDTO.getCartTypeEnum()), tradeDTO); - } - @Override - public void cleanChecked(CartTypeEnum way) { - if (way.equals(CartTypeEnum.CART)) { - TradeDTO tradeDTO = this.readDTO(CartTypeEnum.CART); - this.cleanChecked(tradeDTO); - } else { - cache.remove(this.getOriginKey(way)); - } + resetTradeDTO(tradeDTO); } @Override @@ -283,7 +341,7 @@ public class CartServiceImpl implements CartService { @Override public TradeDTO getCheckedTradeDTO(CartTypeEnum way) { - return tradeBuilder.buildTrade(way); + return tradeBuilder.buildChecked(way); } /** @@ -298,22 +356,30 @@ public class CartServiceImpl implements CartService { long count = 0L; double totalPrice = tradeDTO.getSkuList().stream().mapToDouble(i -> i.getPurchasePrice() * i.getNum()).sum(); if (tradeDTO.getSkuList() != null && !tradeDTO.getSkuList().isEmpty()) { - List ids = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).map(i -> i.getGoodsSku().getId()).collect(Collectors.toList()); - List storeIds = new ArrayList<>(); - List esGoodsList = esGoodsSearchService.getEsGoodsBySkuIds(ids); + List ids = tradeDTO.getSkuList().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).map(i -> i.getGoodsSku().getId()).collect(Collectors.toList()); + + List esGoodsList = esGoodsSearchService.getEsGoodsBySkuIds(ids, null); for (EsGoodsIndex esGoodsIndex : esGoodsList) { - if (esGoodsIndex.getPromotionMap() != null) { - List couponIds = esGoodsIndex.getPromotionMap().keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.COUPON.name())).map(i -> i.substring(i.lastIndexOf("-") + 1)).collect(Collectors.toList()); + if (esGoodsIndex != null && esGoodsIndex.getPromotionMap() != null && !esGoodsIndex.getPromotionMap().isEmpty()) { + List couponIds = esGoodsIndex.getPromotionMap().keySet().stream().filter(i -> i.contains(PromotionTypeEnum.COUPON.name())).map(i -> i.substring(i.lastIndexOf("-") + 1)).collect(Collectors.toList()); if (!couponIds.isEmpty()) { List currentGoodsCanUse = memberCouponService.getCurrentGoodsCanUse(tradeDTO.getMemberId(), couponIds, totalPrice); count = currentGoodsCanUse.size(); } } - storeIds.add(esGoodsIndex.getStoreId()); } + + List storeIds = new ArrayList<>(); + for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + if (!storeIds.contains(cartSkuVO.getStoreId())) { + storeIds.add(cartSkuVO.getStoreId()); + } + } + + //获取可操作的优惠券集合 List allScopeMemberCoupon = memberCouponService.getAllScopeMemberCoupon(tradeDTO.getMemberId(), storeIds); if (allScopeMemberCoupon != null && !allScopeMemberCoupon.isEmpty()) { - // 过滤满足消费门槛 + //过滤满足消费门槛 count += allScopeMemberCoupon.stream().filter(i -> i.getConsumeThreshold() <= totalPrice).count(); } } @@ -326,25 +392,17 @@ public class CartServiceImpl implements CartService { } /** - * 校验商品有效性,判定失效和库存 + * 校验商品有效性,判定失效和库存,促销活动价格 * * @param skuId 商品skuId - * @param num 数量 */ - private GoodsSku checkGoods(String skuId, Integer num) { + private GoodsSku checkGoods(String skuId) { GoodsSku dataSku = this.goodsSkuService.getGoodsSkuByIdFromCache(skuId); if (dataSku == null) { - throw new ServiceException("商品已失效,请重新选购!"); + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); } - if (!GoodsAuthEnum.PASS.name().equals(dataSku.getIsAuth()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable())) { - throw new ServiceException("商品已下架,请重新选购!"); - } - //读取sku的可用库存 - Integer enableQuantity = goodsSkuService.getStock(skuId); - - //如果sku的可用库存小于等于0或者小于用户购买的数量,则不允许购买 - if (enableQuantity <= 0 || enableQuantity < num) { - throw new ServiceException("商品库存已不足,请选购其他商品。"); + if (!GoodsAuthEnum.PASS.name().equals(dataSku.getAuthFlag()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable())) { + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); } return dataSku; } @@ -358,13 +416,19 @@ public class CartServiceImpl implements CartService { */ private void checkSetGoodsQuantity(CartSkuVO cartSkuVO, String skuId, Integer num) { Integer enableStock = goodsSkuService.getStock(skuId); + + //如果sku的可用库存小于等于0或者小于用户购买的数量,则不允许购买 + if (enableStock <= 0 || enableStock < num) { + throw new ServiceException(ResultCode.GOODS_SKU_QUANTITY_NOT_ENOUGH); + } + if (enableStock <= num) { cartSkuVO.setNum(enableStock); } else { cartSkuVO.setNum(num); } - if (cartSkuVO.getNum() > 100) { + if (cartSkuVO.getGoodsSku() != null && !GoodsSalesModeEnum.WHOLESALE.name().equals(cartSkuVO.getGoodsSku().getSalesModel()) && cartSkuVO.getNum() > 99) { cartSkuVO.setNum(99); } } @@ -380,11 +444,24 @@ public class CartServiceImpl implements CartService { TradeDTO tradeDTO = this.readDTO(cartTypeEnum); MemberAddress memberAddress = memberAddressService.getById(shippingAddressId); - this.checkAddressScope(tradeDTO.getSkuList(), memberAddress); tradeDTO.setMemberAddress(memberAddress); this.resetTradeDTO(tradeDTO); } + @Override + public void shippingSelfAddress(String shopAddressId, String way) { + //默认购物车 + CartTypeEnum cartTypeEnum = CartTypeEnum.CART; + if (CharSequenceUtil.isNotEmpty(way)) { + cartTypeEnum = CartTypeEnum.valueOf(way); + } + + TradeDTO tradeDTO = this.readDTO(cartTypeEnum); + StoreAddress storeAddress = storeAddressService.getById(shopAddressId); + tradeDTO.setStoreAddress(storeAddress); + this.resetTradeDTO(tradeDTO); + } + /** * 选择发票 * @@ -406,21 +483,18 @@ public class CartServiceImpl implements CartService { /** * 选择配送方式 * - * @param storeId 店铺id * @param deliveryMethod 配送方式 * @param way 购物车类型 */ @Override - public void shippingMethod(String storeId, String deliveryMethod, String way) { + public void shippingMethod(String deliveryMethod, String way) { CartTypeEnum cartTypeEnum = CartTypeEnum.CART; if (CharSequenceUtil.isNotEmpty(way)) { cartTypeEnum = CartTypeEnum.valueOf(way); } TradeDTO tradeDTO = this.readDTO(cartTypeEnum); - for (CartVO cartVO : tradeDTO.getCartList()) { - if (cartVO.getStoreId().equals(storeId)) { - cartVO.setDeliveryMethod(DeliveryMethodEnum.valueOf(deliveryMethod).name()); - } + for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + cartSkuVO.setDeliveryMethod(DeliveryMethodEnum.valueOf(deliveryMethod).name()); } this.resetTradeDTO(tradeDTO); } @@ -433,7 +507,9 @@ public class CartServiceImpl implements CartService { */ @Override public Long getCartNum(Boolean checked) { - TradeDTO tradeDTO = this.getCheckedTradeDTO(CartTypeEnum.CART); + //构建购物车 + TradeDTO tradeDTO = this.getAllTradeDTO(); + //过滤sku列表 List collect = tradeDTO.getSkuList().stream().filter(i -> Boolean.FALSE.equals(i.getInvalid())).collect(Collectors.toList()); long count = 0L; if (!tradeDTO.getSkuList().isEmpty()) { @@ -447,19 +523,32 @@ public class CartServiceImpl implements CartService { } @Override + @Transactional(rollbackFor = Exception.class) public void selectCoupon(String couponId, String way, boolean use) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + //获取购物车,然后重新写入优惠券 CartTypeEnum cartTypeEnum = getCartType(way); - TradeDTO tradeDTO = tradeBuilder.buildTrade(cartTypeEnum); - MemberCoupon memberCoupon = memberCouponService.getOne(new LambdaQueryWrapper().eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()).eq(MemberCoupon::getId, couponId)); + //积分商品不允许使用优惠券 + if (cartTypeEnum.equals(CartTypeEnum.POINTS)) { + throw new ServiceException(ResultCode.SPECIAL_CANT_USE); + } + + TradeDTO tradeDTO = this.readDTO(cartTypeEnum); + + MemberCouponSearchParams searchParams = new MemberCouponSearchParams(); + searchParams.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name()); + searchParams.setMemberId(currentUser.getId()); + searchParams.setId(couponId); + MemberCoupon memberCoupon = memberCouponService.getMemberCoupon(searchParams); if (memberCoupon == null) { - throw new ServiceException("当前优惠券可用数量不足"); + throw new ServiceException(ResultCode.COUPON_EXPIRED); } //使用优惠券 与否 - if (use && checkCoupon(memberCoupon, tradeDTO)) { - this.useCoupon(tradeDTO, memberCoupon); - } else if (!use) { - if (Boolean.TRUE.equals(memberCoupon.getIsPlatform())) { + if (use) { + this.useCoupon(tradeDTO, memberCoupon, cartTypeEnum); + } else { + if (Boolean.TRUE.equals(memberCoupon.getPlatformFlag())) { tradeDTO.setPlatformCoupon(null); } else { tradeDTO.getStoreCoupons().remove(memberCoupon.getStoreId()); @@ -471,47 +560,48 @@ public class CartServiceImpl implements CartService { @Override public Trade createTrade(TradeParams tradeParams) { + //获取购物车 CartTypeEnum cartTypeEnum = getCartType(tradeParams.getWay()); TradeDTO tradeDTO = this.readDTO(cartTypeEnum); + //设置基础属性 tradeDTO.setClientType(tradeParams.getClient()); tradeDTO.setStoreRemark(tradeParams.getRemark()); - List collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); - MemberAddress memberAddress = tradeDTO.getMemberAddress(); - this.checkAddressScope(collect, memberAddress); - this.resetTradeDTO(tradeDTO); - Trade trade = tradeBuilder.createTrade(cartTypeEnum, tradeParams.getParentOrderSn()); - this.cleanChecked(tradeDTO); + tradeDTO.setParentOrderSn(tradeParams.getParentOrderSn()); + //订单无收货地址校验 + if(tradeDTO.getStoreAddress() == null){ + if (tradeDTO.getMemberAddress() == null) { + throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); + } + } + //构建交易 + Trade trade = tradeBuilder.createTrade(tradeDTO); + this.cleanChecked(this.readDTO(cartTypeEnum)); return trade; } - /** - * 检查商品是否在配送范围 - * - * @param skuList 商品列表 - * @param memberAddress 配送地址 - */ @Override - public void checkAddressScope(List skuList, MemberAddress memberAddress) { - if (memberAddress == null) { - return; - } - for (CartSkuVO cartSkuVO : skuList) { - if (Boolean.TRUE.equals(cartSkuVO.getIsFreeFreight())) { - break; - } - String freightTemplateId = cartSkuVO.getGoodsSku().getFreightTemplateId(); - FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateId); - String[] addressId = memberAddress.getConsigneeAddressIdPath().split(","); - if (freightTemplate != null && freightTemplate.getFreightTemplateChildList() != null && !freightTemplate.getFreightTemplateChildList().isEmpty()) { - FreightTemplateChild freightTemplateChild = freightTemplate.getFreightTemplateChildList().get(0); - // 检查当前配送地址的城市id是否存在与配送模版的城市id里面 - if (!freightTemplateChild.getAreaId().contains(addressId[1])) { - throw new ServiceException("当前选择地址暂不支持配送!"); + public List shippingMethodList(String way) { + List list = new ArrayList(); + list.add(DeliveryMethodEnum.LOGISTICS.name()); + TradeDTO tradeDTO = this.getCheckedTradeDTO(CartTypeEnum.valueOf(way)); + if(tradeDTO.getCartList().size()==1){ + for (CartVO cartVO : tradeDTO.getCartList()) { + Store store = storeService.getById(cartVO.getStoreId()); + if(store.getSelfPickFlag() != null && store.getSelfPickFlag()){ + list.add(DeliveryMethodEnum.SELF_PICK_UP.name()); } } } + return list; } + + /** + * 获取购物车类型 + * + * @param way + * @return + */ private CartTypeEnum getCartType(String way) { //默认购物车 CartTypeEnum cartTypeEnum = CartTypeEnum.CART; @@ -525,54 +615,211 @@ public class CartServiceImpl implements CartService { return cartTypeEnum; } - private void useCoupon(TradeDTO tradeDTO, MemberCoupon memberCoupon) { - //如果是平台优惠券 - if (Boolean.TRUE.equals(memberCoupon.getIsPlatform())) { - if (memberCoupon.getConsumeThreshold() <= tradeDTO.getPriceDetailDTO().getGoodsPrice()) { - tradeDTO.setPlatformCoupon(new MemberCouponDTO(memberCoupon)); - tradeDTO.setStoreCoupons(new HashMap<>()); + /** + * 使用优惠券判定 + * + * @param tradeDTO 交易对象 + * @param memberCoupon 会员优惠券 + * @param cartTypeEnum 购物车 + */ + private void useCoupon(TradeDTO tradeDTO, MemberCoupon memberCoupon, CartTypeEnum cartTypeEnum) { + + //截取符合优惠券的商品 + List cartSkuVOS = checkCoupon(memberCoupon, tradeDTO); + + //定义使用优惠券的信息商品信息 + Map skuPrice = new HashMap<>(1); + + + //购物车价格 + double cartPrice = 0d; + + //循环符合优惠券的商品 + for (CartSkuVO cartSkuVO : cartSkuVOS) { + if (Boolean.FALSE.equals(cartSkuVO.getChecked())) { + continue; } - } else { - CartSkuVO cartVO = tradeDTO.getSkuList().stream().filter(i -> i.getStoreId().equals(memberCoupon.getStoreId())).findFirst().orElse(null); - // 优惠券消费门槛 <= 商品购买时的成交价(单品) * 购买数量 - if (cartVO != null && memberCoupon.getConsumeThreshold() <= CurrencyUtil.mul(cartVO.getPurchasePrice(), cartVO.getNum())) { - tradeDTO.getStoreCoupons().put(memberCoupon.getStoreId(), new MemberCouponDTO(memberCoupon)); - tradeDTO.setPlatformCoupon(null); + //有促销金额则用促销金额,否则用商品原价 + if (cartSkuVO.getPromotionMap() != null && !cartSkuVO.getPromotionMap().isEmpty()) { + if (cartSkuVO.getPromotionMap().keySet().stream().anyMatch(i -> i.contains(PromotionTypeEnum.PINTUAN.name()) || i.contains(PromotionTypeEnum.SECKILL.name()))) { + cartPrice = CurrencyUtil.add(cartPrice, CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); + skuPrice.put(cartSkuVO.getGoodsSku().getId(), CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); + } else { + cartPrice = CurrencyUtil.add(cartPrice, CurrencyUtil.mul(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getNum())); + skuPrice.put(cartSkuVO.getGoodsSku().getId(), CurrencyUtil.mul(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getNum())); + } + } else { + cartPrice = CurrencyUtil.add(cartPrice, CurrencyUtil.mul(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getNum())); + skuPrice.put(cartSkuVO.getGoodsSku().getId(), CurrencyUtil.mul(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getNum())); } } + + + //如果购物车金额大于消费门槛则使用 + if (cartPrice >= memberCoupon.getConsumeThreshold()) { + //如果是平台优惠券 + if (Boolean.TRUE.equals(memberCoupon.getPlatformFlag())) { + tradeDTO.setPlatformCoupon(new MemberCouponDTO(skuPrice, memberCoupon)); + } else { + tradeDTO.getStoreCoupons().put(memberCoupon.getStoreId(), new MemberCouponDTO(skuPrice, memberCoupon)); + } + } + } /** - * 校验是否可以使用优惠券 + * 获取可以使用优惠券的商品信息 * * @param memberCoupon 用于计算优惠券结算详情 * @param tradeDTO 购物车信息 * @return 是否可以使用优惠券 */ - private boolean checkCoupon(MemberCoupon memberCoupon, TradeDTO tradeDTO) { + private List checkCoupon(MemberCoupon memberCoupon, TradeDTO tradeDTO) { List cartSkuVOS; - if (Boolean.FALSE.equals(memberCoupon.getIsPlatform())) { + //如果是店铺优惠券,判定的内容 + if (Boolean.FALSE.equals(memberCoupon.getPlatformFlag())) { cartSkuVOS = tradeDTO.getSkuList().stream().filter(i -> i.getStoreId().equals(memberCoupon.getStoreId())).collect(Collectors.toList()); - } else { + } + //否则为平台优惠券,筛选商品为全部商品 + else { cartSkuVOS = tradeDTO.getSkuList(); } - // 当初购物车商品中是否存在符合优惠券条件的商品sku - if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS_CATEGORY.name())) { - // 分类路径是否包含 - return cartSkuVOS.stream().anyMatch(i -> i.getGoodsSku().getCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0); - } else if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name())) { - // 范围关联ID是否包含 - return cartSkuVOS.stream().anyMatch(i -> memberCoupon.getScopeId().indexOf("," + i.getGoodsSku().getId() + ",") <= 0); - } else if (memberCoupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_SHOP_CATEGORY.name())) { - // 分类路径是否包含 - return cartSkuVOS.stream().anyMatch(i -> i.getGoodsSku().getStoreCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0); + //当初购物车商品中是否存在符合优惠券条件的商品sku + if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name())) { + return cartSkuVOS; + } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name())) { + //分类路径是否包含 + return cartSkuVOS.stream().filter(i -> CharSequenceUtil.contains(memberCoupon.getScopeId(), i.getGoodsSku().getCategoryPath())).collect(Collectors.toList()); + } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) { + //范围关联ID是否包含 + return cartSkuVOS.stream().filter(i -> CharSequenceUtil.contains(memberCoupon.getScopeId(), i.getGoodsSku().getId())).collect(Collectors.toList()); + } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_SHOP_CATEGORY.name())) { + //店铺分类路径是否包含 + return cartSkuVOS.stream().filter(i -> CharSequenceUtil.contains(memberCoupon.getScopeId(), i.getGoodsSku().getStoreCategoryPath())).collect(Collectors.toList()); } - return true; + return new ArrayList<>(); } - @Autowired - public void setTradeBuilder(TradeBuilder tradeBuilder) { - this.tradeBuilder = tradeBuilder; + /** + * 检测购物车 + * + * @param cartTypeEnum 购物车枚举 + * @param cartSkuVO SKUVO + * @param skuId SkuId + * @param num 数量 + */ + private void checkCart(CartTypeEnum cartTypeEnum, CartSkuVO cartSkuVO, String skuId, Integer num) { + + this.checkSetGoodsQuantity(cartSkuVO, skuId, num); + //拼团判定 + if (cartTypeEnum.equals(CartTypeEnum.PINTUAN)) { + //砍价判定 + checkPintuan(cartSkuVO); + } else if (cartTypeEnum.equals(CartTypeEnum.KANJIA)) { + //检测购物车的数量 + checkKanjia(cartSkuVO); + } else if (cartTypeEnum.equals(CartTypeEnum.POINTS)) { + //检测购物车的数量 + checkPoint(cartSkuVO); + } + } + + + private void checkGoodsSaleModel(GoodsSku dataSku, List cartSkuVOS) { + if (dataSku.getSalesModel().equals(GoodsSalesModeEnum.WHOLESALE.name())) { + int numSum = 0; + List sameGoodsIdSkuList = cartSkuVOS.stream().filter(i -> i.getGoodsSku().getGoodsId().equals(dataSku.getGoodsId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(sameGoodsIdSkuList)) { + numSum += sameGoodsIdSkuList.stream().mapToInt(CartSkuVO::getNum).sum(); + } + Wholesale match = wholesaleService.match(dataSku.getGoodsId(), numSum); + if (match != null) { + sameGoodsIdSkuList.forEach(i -> { + i.setPurchasePrice(match.getPrice()); + i.setSubTotal(CurrencyUtil.mul(i.getPurchasePrice(), i.getNum())); + }); + } + } + } + + /** + * 校验拼团信息 + * + * @param cartSkuVO 购物车信息 + */ + private void checkPintuan(CartSkuVO cartSkuVO) { + //拼团活动,需要对限购数量进行判定 + //获取拼团信息 + if (cartSkuVO.getPromotionMap() != null && !cartSkuVO.getPromotionMap().isEmpty()) { + Optional> pintuanPromotions = cartSkuVO.getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.PINTUAN.name())).findFirst(); + if (pintuanPromotions.isPresent()) { + JSONObject promotionsObj = JSONUtil.parseObj(pintuanPromotions.get().getValue()); + //写入拼团信息 + cartSkuVO.setPintuanId(promotionsObj.get("id").toString()); + //检测拼团限购数量 + Integer limitNum = promotionsObj.get("limitNum", Integer.class); + if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { + throw new ServiceException(ResultCode.CART_PINTUAN_LIMIT_ERROR); + } + } + } + } + + /** + * 校验砍价信息 + * + * @param cartSkuVO 购物车信息 + */ + private void checkKanjia(CartSkuVO cartSkuVO) { + if (cartSkuVO.getPromotionMap() != null && !cartSkuVO.getPromotionMap().isEmpty()) { + Optional> kanjiaPromotions = cartSkuVO.getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.KANJIA.name())).findFirst(); + if (kanjiaPromotions.isPresent()) { + JSONObject promotionsObj = JSONUtil.parseObj(kanjiaPromotions.get().getValue()); + //查找当前会员的砍价商品活动 + KanjiaActivitySearchParams kanjiaActivitySearchParams = new KanjiaActivitySearchParams(); + kanjiaActivitySearchParams.setKanjiaActivityGoodsId(promotionsObj.get("id", String.class)); + kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId()); + kanjiaActivitySearchParams.setStatus(KanJiaStatusEnum.SUCCESS.name()); + KanjiaActivity kanjiaActivity = kanjiaActivityService.getKanjiaActivity(kanjiaActivitySearchParams); + + //校验砍价活动是否满足条件 + //判断发起砍价活动 + if (kanjiaActivity == null) { + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_FOUND_ERROR); + //判断砍价活动是否已满足条件 + } else if (!KanJiaStatusEnum.SUCCESS.name().equals(kanjiaActivity.getStatus())) { + cartSkuVO.setKanjiaId(kanjiaActivity.getId()); + cartSkuVO.setPurchasePrice(0D); + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_PASS_ERROR); + } + //砍价商品默认一件货物 + cartSkuVO.setKanjiaId(kanjiaActivity.getId()); + cartSkuVO.setNum(1); + } + } + } + + /** + * 校验积分商品信息 + * + * @param cartSkuVO 购物车信息 + */ + private void checkPoint(CartSkuVO cartSkuVO) { + + PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId()); + + if (pointsGoodsVO != null) { + Member userInfo = memberService.getUserInfo(); + if (userInfo.getPoint() < pointsGoodsVO.getPoints()) { + throw new ServiceException(ResultCode.POINT_NOT_ENOUGH); + } + if (pointsGoodsVO.getActiveStock() < 1) { + throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_INSUFFICIENT); + } + cartSkuVO.setPoint(pointsGoodsVO.getPoints()); + cartSkuVO.setPurchasePrice(0D); + cartSkuVO.setPointsId(pointsGoodsVO.getId()); + } } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/aop/OrderLogPoint.java b/framework/src/main/java/cn/lili/modules/order/order/aop/OrderLogPoint.java index 431e9a5e..d1427a86 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/aop/OrderLogPoint.java +++ b/framework/src/main/java/cn/lili/modules/order/order/aop/OrderLogPoint.java @@ -6,7 +6,7 @@ import java.lang.annotation.*; * 订单日志AOP注解 * * @author Chopper - * @date 2020/11/17 7:22 下午 + * @since 2020/11/17 7:22 下午 */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java b/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java index e8552576..162056c6 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java +++ b/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java @@ -6,7 +6,7 @@ import cn.lili.common.utils.SpelUtil; import cn.lili.common.utils.ThreadPoolUtil; import cn.lili.modules.order.trade.entity.dos.OrderLog; import cn.lili.modules.order.trade.service.OrderLogService; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; @@ -21,14 +21,15 @@ import java.util.Map; * 订单操作日志 * * @author Chopper - * @date: 2020/11/17 7:22 下午 + * @since 2020/11/17 7:22 下午 */ +@Slf4j @Aspect @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderOperationLogAspect { - private final OrderLogService orderLogService; + @Autowired + private OrderLogService orderLogService; @After("@annotation(cn.lili.modules.order.order.aop.OrderLogPoint)") public void doAfter(JoinPoint joinPoint) { @@ -48,7 +49,7 @@ public class OrderOperationLogAspect { //调用线程保存 ThreadPoolUtil.getPool().execute(new SaveOrderLogThread(orderLog, orderLogService)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单日志错误",e); } } @@ -61,7 +62,7 @@ public class OrderOperationLogAspect { */ private static Map spelFormat(JoinPoint joinPoint) throws Exception { - Map result = new HashMap<>(); + Map result = new HashMap<>(2); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); OrderLogPoint orderLogPoint = signature.getMethod().getAnnotation(OrderLogPoint.class); String description = SpelUtil.compileParams(joinPoint, orderLogPoint.description()); diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java index e3dbb029..a937e125 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java @@ -1,28 +1,31 @@ package cn.lili.modules.order.order.entity.dos; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.json.JSONUtil; -import cn.lili.base.BaseEntity; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; import cn.lili.common.utils.BeanUtil; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; -import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; -import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; -import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; +import cn.lili.modules.goods.entity.enums.GoodsTypeEnum; +import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.order.order.entity.enums.*; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; import java.util.Optional; @@ -30,13 +33,13 @@ import java.util.Optional; * 订单 * * @author Chopper - * @date 2020/11/17 7:30 下午 + * @since 2020/11/17 7:30 下午 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_order") @TableName("li_order") @ApiModel(value = "订单") +@NoArgsConstructor public class Order extends BaseEntity { @@ -57,6 +60,7 @@ public class Order extends BaseEntity { private String memberId; @ApiModelProperty(value = "用户名") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; /** @@ -79,10 +83,14 @@ public class Order extends BaseEntity { @ApiModelProperty(value = "第三方付款流水号") private String receivableNo; + /** + * @see PaymentMethodEnum + */ @ApiModelProperty(value = "支付方式") private String paymentMethod; @ApiModelProperty(value = "支付时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date paymentTime; @@ -119,7 +127,6 @@ public class Order extends BaseEntity { @ApiModelProperty(value = "优惠的金额") private Double discountPrice; - //修改金额 @ApiModelProperty(value = "修改价格") private Double updatePrice; @@ -165,7 +172,7 @@ public class Order extends BaseEntity { private Boolean needReceipt; @ApiModelProperty(value = "是否为其他订单下的订单,如果是则为依赖订单的sn,否则为空") - private String parentOrderSn; + private String parentOrderSn = ""; @ApiModelProperty(value = "是否为某订单类型的订单,如果是则为订单类型的id,否则为空") private String promotionId; @@ -176,15 +183,20 @@ public class Order extends BaseEntity { @ApiModelProperty(value = "订单类型") private String orderType; - @Column(columnDefinition = "TEXT") - @ApiModelProperty(value = "价格详情") + /** + * @see OrderPromotionTypeEnum + */ + @ApiModelProperty(value = "订单促销类型") + private String orderPromotionType; + + @ApiModelProperty(value = "价格价格详情") private String priceDetail; @ApiModelProperty(value = "订单是否支持原路退回") private Boolean canReturn; @ApiModelProperty(value = "提货码") - private String qrCode; + private String verificationCode; @ApiModelProperty(value = "分销员ID") private String distributionId; @@ -195,53 +207,109 @@ public class Order extends BaseEntity { @ApiModelProperty(value = "使用的平台会员优惠券id") private String usePlatformMemberCouponId; - public Order() { + @ApiModelProperty(value = "qrCode 实物为提货码 虚拟货物为账号") + private String qrCode; - } + @ApiModelProperty(value = "自提点地址") + private String storeAddressPath; + @ApiModelProperty(value = "自提点电话") + private String storeAddressMobile; + + @ApiModelProperty(value = "自提点地址经纬度") + private String storeAddressCenter; + + /** + * 构建订单 + * + * @param cartVO 购物车VO + * @param tradeDTO 交易DTO + */ public Order(CartVO cartVO, TradeDTO tradeDTO) { String oldId = this.getId(); - if (tradeDTO.getMemberAddress() != null) { - BeanUtil.copyProperties(tradeDTO.getMemberAddress(), this); - } BeanUtil.copyProperties(tradeDTO, this); BeanUtil.copyProperties(cartVO.getPriceDetailDTO(), this); BeanUtil.copyProperties(cartVO, this); - this.setId(oldId); - this.setOrderType(OrderTypeEnum.NORMAL.name()); - if (cartVO.getSkuList().get(0).getPromotions() != null) { - Optional pintuanId = cartVO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); - if (pintuanId.isPresent()) { - promotionId = pintuanId.get(); - this.setOrderType(OrderTypeEnum.PINTUAN.name()); - if (tradeDTO.getParentOrderSn() == null) { - this.setParentOrderSn(""); - } - } - } + //填写订单类型 + this.setTradeType(cartVO, tradeDTO); + setId(oldId); + + //设置默认支付状态 this.setOrderStatus(OrderStatusEnum.UNPAID.name()); this.setPayStatus(PayStatusEnum.UNPAID.name()); this.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); - this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath()); - this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath()); - this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail()); - this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile()); - this.setConsigneeName(tradeDTO.getMemberAddress().getName()); - if (tradeDTO.getPlatformCoupon() != null) { - this.setUsePlatformMemberCouponId(tradeDTO.getPlatformCoupon().getMemberCoupon().getId()); - } - if (tradeDTO.getStoreCoupons() != null && !tradeDTO.getStoreCoupons().isEmpty()) { - StringBuilder storeCouponIds = new StringBuilder(); - for (String s : tradeDTO.getStoreCoupons().keySet()) { - storeCouponIds.append(s).append(","); - } - this.setUseStoreMemberCouponIds(storeCouponIds.toString()); - } this.setTradeSn(tradeDTO.getSn()); this.setRemark(cartVO.getRemark()); this.setFreightPrice(tradeDTO.getPriceDetailDTO().getFreightPrice()); + //会员收件信息 + if(DeliveryMethodEnum.LOGISTICS.name().equals(cartVO.getDeliveryMethod())){ + this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath()); + this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath()); + this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail()); + this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile()); + this.setConsigneeName(tradeDTO.getMemberAddress().getName()); + } + //自提点信息 + if(DeliveryMethodEnum.SELF_PICK_UP.name().equals(cartVO.getDeliveryMethod())){ + this.setStoreAddressPath(tradeDTO.getStoreAddress().getAddress()); + this.setStoreAddressMobile(tradeDTO.getStoreAddress().getMobile()); + this.setStoreAddressCenter(tradeDTO.getStoreAddress().getCenter()); + } + //平台优惠券判定 + if (tradeDTO.getPlatformCoupon() != null) { + this.setUsePlatformMemberCouponId(tradeDTO.getPlatformCoupon().getMemberCoupon().getId()); + } + //店铺优惠券判定 + if (tradeDTO.getStoreCoupons() != null && !tradeDTO.getStoreCoupons().isEmpty()) { + StringBuilder storeCouponIds = new StringBuilder(); + for (MemberCouponDTO value : tradeDTO.getStoreCoupons().values()) { + storeCouponIds.append(value.getMemberCoupon().getId()).append(","); + } + this.setUseStoreMemberCouponIds(storeCouponIds.toString()); + } + } + + /** + * 填写交易(订单)类型 + * 1.判断是普通、促销订单 + * 2.普通订单进行区分:实物订单、虚拟订单 + * 3.促销订单判断货物进行区分实物、虚拟商品。 + * 4.拼团订单需要填写父订单ID + * + * @param cartVO 购物车VO + * @param tradeDTO 交易DTO + */ + private void setTradeType(CartVO cartVO, TradeDTO tradeDTO) { + + //判断是否为普通订单、促销订单 + if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.CART) || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.BUY_NOW)) { + this.setOrderType(OrderTypeEnum.NORMAL.name()); + this.setOrderPromotionType(OrderPromotionTypeEnum.NORMAL.name()); + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) { + this.setOrderType(OrderTypeEnum.VIRTUAL.name()); + this.setOrderPromotionType(OrderPromotionTypeEnum.NORMAL.name()); + } else { + //促销订单(拼团、积分)-判断购买的是虚拟商品还是实物商品 + String goodsType = cartVO.getCheckedSkuList().get(0).getGoodsSku().getGoodsType(); + if (CharSequenceUtil.isEmpty(goodsType) || goodsType.equals(GoodsTypeEnum.PHYSICAL_GOODS.name())) { + this.setOrderType(OrderTypeEnum.NORMAL.name()); + } else { + this.setOrderType(OrderTypeEnum.VIRTUAL.name()); + } + //填写订单的促销类型 + this.setOrderPromotionType(tradeDTO.getCartTypeEnum().name()); + + //判断是否为拼团订单,如果为拼团订单获取拼团ID,判断是否为主订单 + if (tradeDTO.getCartTypeEnum().name().equals(PromotionTypeEnum.PINTUAN.name()) && cartVO.getCheckedSkuList().get(0).getPromotionMap() != null && !cartVO.getCheckedSkuList().get(0).getPromotionMap().isEmpty()) { + Optional pintuanPromotions = cartVO.getCheckedSkuList().get(0).getPromotionMap().keySet().stream().filter(i -> i.contains(PromotionTypeEnum.PINTUAN.name())).findFirst(); + pintuanPromotions.ifPresent(s -> promotionId = s.split("-")[1]); + } + } + } + + public PriceDetailDTO getPriceDetailDTO() { try { @@ -255,4 +323,5 @@ public class Order extends BaseEntity { this.priceDetail = JSONUtil.toJsonStr(priceDetail); } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaint.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaint.java index 4529f36c..a6131410 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaint.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaint.java @@ -1,15 +1,16 @@ package cn.lili.modules.order.order.entity.dos; -import cn.lili.base.BaseEntity; -import cn.lili.modules.order.order.entity.enums.ComplaintStatusEnum; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** @@ -18,9 +19,8 @@ import java.util.Date; * @author paulG * @since 2020/12/4 **/ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_order_complaint") @TableName("li_order_complaint") @ApiModel(value = "订单交易投诉") public class OrderComplaint extends BaseEntity { @@ -97,6 +97,7 @@ public class OrderComplaint extends BaseEntity { private String memberId; @ApiModelProperty(value = "会员名称") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; @ApiModelProperty(value = "收货人") diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaintCommunication.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaintCommunication.java index 5ed5fd88..58b44f6a 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaintCommunication.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderComplaintCommunication.java @@ -1,6 +1,6 @@ package cn.lili.modules.order.order.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,8 +8,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 交易投诉通信 @@ -18,8 +16,6 @@ import javax.persistence.Table; * @since 2020/12/5 **/ @Data -@Entity -@Table(name = "li_order_complaint_communication") @TableName("li_order_complaint_communication") @ApiModel(value = "订单交易投诉通信") @AllArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java index cd59e1b5..ae8c270f 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java @@ -2,17 +2,17 @@ package cn.lili.modules.order.order.entity.dos; import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONUtil; -import cn.lili.base.BaseEntity; import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.SnowFlake; +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.order.order.entity.enums.CommentStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum; -import cn.lili.modules.promotion.entity.dto.BasePromotion; -import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.vo.CartSkuVO; -import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.promotion.entity.vos.PromotionSkuVO; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -20,20 +20,15 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.stream.Collectors; /** * 子订单 * * @author Chopper - * @date 2020/11/17 7:30 下午 + * @since 2020/11/17 7:30 下午 */ @Data -@Entity -@Table(name = "li_order_item") @TableName("li_order_item") @ApiModel(value = "子订单") @NoArgsConstructor @@ -56,27 +51,37 @@ public class OrderItem extends BaseEntity { @ApiModelProperty(value = "商品ID") private String goodsId; + @ApiModelProperty(value = "货品ID") private String skuId; + @ApiModelProperty(value = "销售量") private Integer num; + @ApiModelProperty(value = "交易编号") private String tradeSn; + @ApiModelProperty(value = "图片") private String image; + @ApiModelProperty(value = "商品名称") private String goodsName; + @ApiModelProperty(value = "分类ID") private String categoryId; + @ApiModelProperty(value = "快照id") private String snapshotId; + @ApiModelProperty(value = "规格json") - @Column(columnDefinition = "TEXT") private String specs; + @ApiModelProperty(value = "促销类型") private String promotionType; + @ApiModelProperty(value = "促销id") private String promotionId; + @ApiModelProperty(value = "销售金额") private Double goodsPrice; @@ -95,7 +100,6 @@ public class OrderItem extends BaseEntity { @ApiModelProperty(value = "售后状态") private String afterSaleStatus; - @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "价格详情") private String priceDetail; @@ -108,6 +112,10 @@ public class OrderItem extends BaseEntity { @ApiModelProperty(value = "交易投诉id") private String complainId; + @ApiModelProperty(value = "退货商品数量") + private Integer returnGoodsNumber; + + public OrderItem(CartSkuVO cartSkuVO, CartVO cartVO, TradeDTO tradeDTO) { String oldId = this.getId(); BeanUtil.copyProperties(cartSkuVO.getGoodsSku(), this); @@ -115,8 +123,8 @@ public class OrderItem extends BaseEntity { BeanUtil.copyProperties(cartSkuVO, this); this.setId(oldId); if (cartSkuVO.getPriceDetailDTO().getJoinPromotion() != null && !cartSkuVO.getPriceDetailDTO().getJoinPromotion().isEmpty()) { - this.setPromotionType(CollUtil.join(cartSkuVO.getPriceDetailDTO().getJoinPromotion().stream().map(BasePromotion::getPromotionName).collect(Collectors.toList()), ",")); - this.setPromotionId(CollUtil.join(cartSkuVO.getPriceDetailDTO().getJoinPromotion().stream().map(BasePromotion::getId).collect(Collectors.toList()), ",")); + this.setPromotionType(CollUtil.join(cartSkuVO.getPriceDetailDTO().getJoinPromotion().stream().map(PromotionSkuVO::getPromotionType).collect(Collectors.toList()), ",")); + this.setPromotionId(CollUtil.join(cartSkuVO.getPriceDetailDTO().getJoinPromotion().stream().map(PromotionSkuVO::getActivityId).collect(Collectors.toList()), ",")); } this.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name()); this.setCommentStatus(CommentStatusEnum.NEW.name()); diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Receipt.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Receipt.java index f4b4df72..11e56e3d 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Receipt.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Receipt.java @@ -1,24 +1,19 @@ package cn.lili.modules.order.order.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 发票 * * @author Bulbasaur - * @date 2020/11/28 11:38 + * @since 2020/11/28 11:38 */ @Data -@Entity -@Table(name = "li_receipt") @TableName("li_receipt") @ApiModel(value = "发票") public class Receipt extends BaseEntity { @@ -55,7 +50,6 @@ public class Receipt extends BaseEntity { @ApiModelProperty(value = "发票状态 0未开 1已开") private Integer receiptStatus; - @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "发票详情") private String receiptDetail; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java index c4747861..8404acc9 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/StoreFlow.java @@ -1,42 +1,41 @@ package cn.lili.modules.order.order.entity.dos; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.utils.SnowFlake; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; +import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 商家订单流水 * * @author Chopper - * @date 2020/11/17 7:31 下午 + * @since 2020/11/17 7:31 下午 */ @Data -@Entity -@Table(name = "li_store_flow") @TableName("li_store_flow") @ApiModel(value = "商家订单流水") -public class StoreFlow { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class StoreFlow extends BaseIdEntity { private static final long serialVersionUID = -5998757398902747939L; @@ -52,10 +51,10 @@ public class StoreFlow { @ApiModelProperty(value = "售后SN") private String refundSn; - @ApiModelProperty(value = "商家id") + @ApiModelProperty(value = "店铺id") private String storeId; - @ApiModelProperty(value = "商家名称 ") + @ApiModelProperty(value = "店铺名称 ") private String storeName; @ApiModelProperty(value = "会员id") @@ -81,7 +80,6 @@ public class StoreFlow { private String categoryId; @ApiModelProperty(value = "规格json") - @Column(columnDefinition = "TEXT") private String specs; @@ -91,14 +89,25 @@ public class StoreFlow { @ApiModelProperty(value = "流水类型:PAY/REFUND 支付/退款", allowableValues = "PAY,REFUND") private String flowType; + /** + * @see cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum + */ + @ApiModelProperty(value = "订单促销类型") + private String orderPromotionType; + + @ApiModelProperty(value = "积分活动商品结算价格") + private Double pointSettlementPrice; + + @ApiModelProperty(value = "砍价活动商品结算价格") + private Double kanjiaSettlementPrice; @ApiModelProperty(value = "平台优惠券 使用金额") private Double siteCouponPrice; - @ApiModelProperty(value = "站点优惠券佣金比例") + @ApiModelProperty(value = "站点优惠券补贴比例") private Double siteCouponPoint; - @ApiModelProperty(value = "站点优惠券佣金") + @ApiModelProperty(value = "站点优惠券补贴金额") private Double siteCouponCommission; @ApiModelProperty(value = "单品分销返现支出") @@ -116,6 +125,9 @@ public class StoreFlow { @ApiModelProperty(value = "第三方交易流水号") private String transactionId; + /** + * @see PaymentMethodEnum + */ @ApiModelProperty(value = "支付方式名称") private String paymentName; @@ -128,4 +140,62 @@ public class StoreFlow { @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间", hidden = true) private Date createTime; + + + public StoreFlow(Order order, OrderItem item, FlowTypeEnum flowTypeEnum) { + //获取订单促销类型,如果为促销订单则获取促销商品并获取结算价 + String promotionType = order.getOrderPromotionType(); + BeanUtil.copyProperties(item, this); + + //去掉orderitem的时间。 + this.setCreateTime(null); + //入账 + this.setId(SnowFlake.getIdStr()); + this.setFlowType(flowTypeEnum.name()); + this.setSn(SnowFlake.createStr("SF")); + this.setOrderSn(item.getOrderSn()); + this.setOrderItemSn(item.getSn()); + this.setStoreId(order.getStoreId()); + this.setStoreName(order.getStoreName()); + this.setMemberId(order.getMemberId()); + this.setMemberName(order.getMemberName()); + this.setGoodsName(item.getGoodsName()); + this.setOrderPromotionType(item.getPromotionType()); + //格式化订单价格详情 + PriceDetailDTO priceDetailDTO = JSONUtil.toBean(item.getPriceDetail(), PriceDetailDTO.class); + //站点优惠券比例=最大比例(100)-店铺承担比例 + this.setSiteCouponPoint(CurrencyUtil.sub(100, priceDetailDTO.getSiteCouponPoint())); + //平台优惠券 使用金额 + this.setSiteCouponPrice(priceDetailDTO.getSiteCouponPrice()); + //站点优惠券佣金(站点优惠券承担金额=优惠券金额 * (站点承担比例/100)) + this.setSiteCouponCommission(CurrencyUtil.mul(this.getSiteCouponPrice(), CurrencyUtil.div(this.getSiteCouponPoint(), 100))); + + /** + * @TODO 计算平台佣金 + */ + //店铺流水金额=goodsPrice(商品总金额(商品原价))+ freightPrice(配送费) - discountPrice(优惠金额) - couponPrice(优惠券金额) + updatePrice(订单修改金额) + this.setFinalPrice(item.getPriceDetailDTO().getFlowPrice()); + //平台收取交易佣金=(flowPrice(流水金额) * platFormCommissionPoint(平台佣金比例))/100 + this.setCommissionPrice(item.getPriceDetailDTO().getPlatFormCommission()); + //单品分销返现支出 + this.setDistributionRebate(item.getPriceDetailDTO().getDistributionCommission()); + //最终结算金额=flowPrice(流水金额) - platFormCommission(平台收取交易佣金) - distributionCommission(单品分销返现支出) + this.setBillPrice(item.getPriceDetailDTO().getBillPrice()); + //兼容为空,以及普通订单操作 + if (CharSequenceUtil.isNotEmpty(promotionType)) { + //如果为砍价活动,填写砍价结算价 + if (promotionType.equals(OrderPromotionTypeEnum.KANJIA.name())) { + this.setKanjiaSettlementPrice(item.getPriceDetailDTO().getSettlementPrice()); + } + //如果为砍价活动,填写砍价结算价 + else if (promotionType.equals(OrderPromotionTypeEnum.POINTS.name())) { + this.setPointSettlementPrice(item.getPriceDetailDTO().getSettlementPrice()); + } + } + //添加支付方式 + this.setPaymentName(order.getPaymentMethod()); + //添加第三方支付流水号 + this.setTransactionId(order.getReceivableNo()); + + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Trade.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Trade.java index 20966d8c..ed63df9b 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Trade.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Trade.java @@ -1,27 +1,24 @@ package cn.lili.modules.order.order.entity.dos; -import cn.lili.base.BaseEntity; import cn.lili.common.utils.BeanUtil; -import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; +import cn.lili.modules.order.order.entity.enums.PayStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 交易 * * @author Chopper - * @date 2020/11/17 7:34 下午 + * @since 2020/11/17 7:34 下午 */ @Data -@Entity -@Table(name = "li_trade") @TableName("li_trade") @ApiModel(value = "交易") @NoArgsConstructor @@ -38,6 +35,9 @@ public class Trade extends BaseEntity { @ApiModelProperty(value = "买家用户名") private String memberName; + /** + * @see PayStatusEnum + */ @ApiModelProperty(value = "支付方式") private String paymentMethod; @@ -86,6 +86,7 @@ public class Trade extends BaseEntity { } BeanUtil.copyProperties(tradeDTO, this); BeanUtil.copyProperties(tradeDTO.getPriceDetailDTO(), this); + this.setPayStatus(PayStatusEnum.UNPAID.name()); this.setId(originId); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/DiscountPriceItem.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/DiscountPriceItem.java new file mode 100644 index 00000000..5391e00f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/DiscountPriceItem.java @@ -0,0 +1,44 @@ +package cn.lili.modules.order.order.entity.dto; + +import cn.lili.common.enums.PromotionTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 优惠信息详情 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2022/12/23 14:52 + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DiscountPriceItem { + + + @ApiModelProperty(value = "促销类型") + private PromotionTypeEnum promotionTypeEnum; + + @ApiModelProperty(value = "促销id") + private String promotionId; + + @ApiModelProperty(value = "减免金额") + private Double discountPrice; + + @ApiModelProperty(value = "涉及 商品ID") + private String goodsId; + + @ApiModelProperty(value = "涉及 SKU ID") + private String skuId; + + + public String getPromotionName() { + return promotionTypeEnum.description(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderBatchDeliverDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderBatchDeliverDTO.java new file mode 100644 index 00000000..6b15a533 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderBatchDeliverDTO.java @@ -0,0 +1,27 @@ +package cn.lili.modules.order.order.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单批量发货DTO + * @author Bulbasaur + * @since 2021/5/26 4:21 下午 + * + */ +@Data +public class OrderBatchDeliverDTO { + + @ApiModelProperty(value = "订单SN") + private String orderSn; + + @ApiModelProperty(value = "物流公司ID") + private String logisticsId; + + @ApiModelProperty(value = "物流公司名称") + private String logisticsName; + + @ApiModelProperty(value = "发货单号") + private String logisticsNo; + +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderComplaintDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderComplaintDTO.java index a6588751..f2e39dba 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderComplaintDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderComplaintDTO.java @@ -9,7 +9,7 @@ import javax.validation.constraints.NotBlank; * 交易投诉DTO * * @author Bulbasaur - * @date 2021/1/7 19:39 + * @since 2021/1/7 19:39 */ @Data public class OrderComplaintDTO { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java new file mode 100644 index 00000000..9324c312 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java @@ -0,0 +1,95 @@ +package cn.lili.modules.order.order.entity.dto; + +import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.entity.enums.PayStatusEnum; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 订单导出DTO + * @author Bulbasaur + * @since 2021/6/3 6:36 下午 + * + */ +@Data +public class OrderExportDTO { + + @ApiModelProperty("订单编号") + private String sn; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "用户名") + private String memberName; + + @ApiModelProperty(value = "收件人姓名") + private String consigneeName; + + @ApiModelProperty(value = "收件人手机") + private String consigneeMobile; + + @ApiModelProperty(value = "收件人地址") + private String consigneeAddressPath; + + @ApiModelProperty(value = "详细地址") + private String consigneeDetail; + + @ApiModelProperty(value = "支付方式") + private String paymentMethod; + + @ApiModelProperty(value = "物流公司名称") + private String logisticsName; + + @ApiModelProperty(value = "运费") + private Double freightPrice; + + @ApiModelProperty(value = "商品价格") + private Double goodsPrice; + + @ApiModelProperty(value = "优惠的金额") + private Double discountPrice; + + @ApiModelProperty(value = "总价格") + private Double flowPrice; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品数量") + private Integer num; + + @ApiModelProperty(value = "买家订单备注") + private String remark; + + /** + * @see OrderStatusEnum + */ + @ApiModelProperty(value = "订单状态") + private String orderStatus; + + /** + * @see PayStatusEnum + */ + @ApiModelProperty(value = "付款状态") + private String payStatus; + + /** + * @see DeliverStatusEnum + */ + @ApiModelProperty(value = "货运状态") + private String deliverStatus; + + @ApiModelProperty(value = "是否需要发票") + private Boolean needReceipt; + + @ApiModelProperty(value = "店铺名称") + private String storeName; +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderReceiptDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderReceiptDTO.java index 460305fb..6c8640b2 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderReceiptDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderReceiptDTO.java @@ -10,7 +10,7 @@ import lombok.Data; * 订单发票 * * @author lili - * @date 2020/11/28 11:38 + * @since 2020/11/28 11:38 */ @Data @ApiModel(value = "订单发票") diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java index 8e561ce6..0bae3935 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java @@ -1,17 +1,17 @@ package cn.lili.modules.order.order.entity.dto; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderTagEnum; -import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; +import cn.lili.modules.order.order.entity.enums.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; @@ -20,8 +20,9 @@ import java.util.Date; * 订单查询参数 * * @author Chopper - * @date 2020/11/17 4:33 下午 + * @since 2020/11/17 4:33 下午 */ +@EqualsAndHashCode(callSuper = true) @Data public class OrderSearchParams extends PageVO { @@ -67,8 +68,9 @@ public class OrderSearchParams extends PageVO { /** * @see OrderTypeEnum + * @see cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum */ - @ApiModelProperty(value = "订单类型") + @ApiModelProperty(value = "订单类型", allowableValues = "NORMAL,VIRTUAL,GIFT,PINTUAN,POINT") private String orderType; @ApiModelProperty(value = "支付方式") @@ -92,60 +94,89 @@ public class OrderSearchParams extends PageVO { @ApiModelProperty(value = "订单来源") private String clientType; + /** + * @see CommentStatusEnum + */ + @ApiModelProperty(value = "评论状态:未评论(UNFINISHED),待追评(WAIT_CHASE),评论完成(FINISHED),") + private String commentStatus; + + @ApiModelProperty(value = "是否为其他订单下的订单,如果是则为依赖订单的sn,否则为空") + private String parentOrderSn; + + @ApiModelProperty(value = "是否为某订单类型的订单,如果是则为订单类型的id,否则为空") + private String promotionId; + + @ApiModelProperty(value = "总价格,可以为范围,如10_1000") + private String flowPrice; + + /** + * @see OrderPromotionTypeEnum + */ + @ApiModelProperty(value = "订单促销类型") + private String orderPromotionType; + public QueryWrapper queryWrapper() { + AuthUser currentUser = UserContext.getCurrentUser(); QueryWrapper wrapper = new QueryWrapper<>(); //关键字查询 - if (StringUtils.isNotEmpty(keywords)) { - wrapper.like("o.sn", keywords); - wrapper.like("oi.goods_name", keywords); - } - // 按卖家查询 - if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name())) { - wrapper.eq("o.store_id", UserContext.getCurrentUser().getStoreId()); - } - if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MANAGER.name()) - && StringUtils.isNotEmpty(storeId)) { - wrapper.eq("o.store_id", storeId); - } - // 按买家查询 - if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MEMBER.name())) { - wrapper.eq("o.member_id", UserContext.getCurrentUser().getId()); - } - // 按照买家查询 - if (StringUtils.isNotEmpty(memberId)) { - wrapper.like("o.member_id", memberId); + if (CharSequenceUtil.isNotEmpty(keywords)) { + wrapper.and(keyWrapper -> keyWrapper.like("o.sn", keywords).or().like("oi.goods_name", keywords)); } + if (currentUser != null) { + //按卖家查询 + wrapper.eq(CharSequenceUtil.equals(currentUser.getRole().name(), UserEnums.STORE.name()), "o.store_id", currentUser.getStoreId()); - // 按订单编号查询 - if (StringUtils.isNotEmpty(orderSn)) { - wrapper.like("o.sn", orderSn); - } + //店铺查询 + wrapper.eq(CharSequenceUtil.equals(currentUser.getRole().name(), UserEnums.MANAGER.name()) + && CharSequenceUtil.isNotEmpty(storeId), "o.store_id", storeId); - // 按时间查询 - if (startDate != null) { - wrapper.ge("o.create_time", startDate); - } - if (endDate != null) { - wrapper.le("o.create_time", DateUtil.endOfDate(endDate)); - } - // 按购买人用户名 - if (StringUtils.isNotEmpty(buyerName)) { - wrapper.like("o.member_name", buyerName); - } + //按买家查询 + wrapper.eq(CharSequenceUtil.equals(currentUser.getRole().name(), UserEnums.MEMBER.name()) && memberId == null, "o.member_id", currentUser.getId()); - // 按订单类型 - if (StringUtils.isNotEmpty(orderType)) { - wrapper.eq("o.order_type", orderType); } + //按照买家查询 + wrapper.like(CharSequenceUtil.isNotEmpty(memberId), "o.member_id", memberId); - // 按支付方式 - if (StringUtils.isNotEmpty(paymentMethod)) { - wrapper.eq("o.payment_method", paymentMethod); - } + //按订单编号查询 + wrapper.like(CharSequenceUtil.isNotEmpty(orderSn), "o.sn", orderSn); - // 按标签查询 - if (StringUtils.isNotEmpty(tag)) { + //按时间查询 + wrapper.ge(startDate != null, "o.create_time", startDate); + + wrapper.le(endDate != null, "o.create_time", DateUtil.endOfDate(endDate)); + //按购买人用户名 + wrapper.like(CharSequenceUtil.isNotEmpty(buyerName), "o.member_name", buyerName); + + //按订单类型 + wrapper.eq(CharSequenceUtil.isNotEmpty(orderType), "o.order_type", orderType); + + //物流查询 + wrapper.like(CharSequenceUtil.isNotEmpty(shipName), "o.consignee_name", shipName); + + //按商品名称查询 + wrapper.like(CharSequenceUtil.isNotEmpty(goodsName), "oi.goods_name", goodsName); + + //付款方式 + wrapper.like(CharSequenceUtil.isNotEmpty(paymentType), "o.payment_type", paymentType); + + //按支付方式 + wrapper.eq(CharSequenceUtil.isNotEmpty(paymentMethod), "o.payment_method", paymentMethod); + + //订单状态 + wrapper.eq(CharSequenceUtil.isNotEmpty(orderStatus), "o.order_status", orderStatus); + + //付款状态 + wrapper.eq(CharSequenceUtil.isNotEmpty(payStatus), "o.pay_status", payStatus); + + //订单来源 + wrapper.like(CharSequenceUtil.isNotEmpty(clientType), "o.client_type", clientType); + + //按评价状态 + wrapper.eq(CharSequenceUtil.isNotEmpty(commentStatus), "oi.comment_status", commentStatus); + + //按标签查询 + if (CharSequenceUtil.isNotEmpty(tag)) { String orderStatusColumn = "o.order_status"; OrderTagEnum tagEnum = OrderTagEnum.valueOf(tag); switch (tagEnum) { @@ -174,37 +205,22 @@ public class OrderSearchParams extends PageVO { } } - if (StringUtils.isNotEmpty(shipName)) { - wrapper.like("o.ship_name", shipName); - } - // 按商品名称查询 - if (StringUtils.isNotEmpty(goodsName)) { - wrapper.like("oi.goods_name", goodsName); - } + // 依赖订单 + wrapper.eq(parentOrderSn != null, "o.parent_order_sn", parentOrderSn); + // 促销活动id + wrapper.eq(CharSequenceUtil.isNotEmpty(promotionId), "o.promotion_id", promotionId); - //付款方式 - if (StringUtils.isNotEmpty(paymentType)) { - wrapper.like("o.payment_type", paymentType); - } + wrapper.eq(CharSequenceUtil.isNotEmpty(orderPromotionType), "o.order_promotion_type", orderPromotionType); - //订单状态 - if (StringUtils.isNotEmpty(orderStatus)) { - wrapper.eq("o.order_status", orderStatus); - } - - //付款状态 - if (StringUtils.isNotEmpty(payStatus)) { - wrapper.eq("o.pay_status", payStatus); - } - - //订单来源 - if (StringUtils.isNotEmpty(clientType)) { - wrapper.like("o.client_type", clientType); + if (CharSequenceUtil.isNotEmpty(flowPrice)) { + String[] s = flowPrice.split("_"); + if (s.length > 1) { + wrapper.between("o.flow_price", s[0], s[1]); + } else { + wrapper.ge("o.flow_price", s[0]); + } } wrapper.eq("o.delete_flag", false); - wrapper.groupBy("o.id"); - wrapper.orderByDesc("o.id"); - return wrapper; } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java index e7eec6e4..76f6dad6 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java @@ -2,7 +2,7 @@ package cn.lili.modules.order.order.entity.dto; import cn.lili.common.utils.CurrencyUtil; -import cn.lili.modules.promotion.entity.dto.BasePromotion; +import cn.lili.modules.promotion.entity.vos.PromotionSkuVO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -14,16 +14,20 @@ import java.util.List; * 商城流水,细节到orderItem * * @author Chopper - * @date 2020/11/17 7:25 下午 + * @since 2020/11/17 7:25 下午 */ @Data public class PriceDetailDTO implements Serializable { - //用于订单价格修改金额计算使用 - @ApiModelProperty(value = "订单原始总价格" ) - private Double originalPrice; private static final long serialVersionUID = 8808470688518188146L; + /** + * 订单原始总价格 + * 用于订单价格修改金额计算使用 + */ + @ApiModelProperty(value = "订单原始总价格") + private Double originalPrice; + @ApiModelProperty(value = "商品总金额(商品原价)") private Double goodsPrice; @@ -33,11 +37,14 @@ public class PriceDetailDTO implements Serializable { //============discount price============ @ApiModelProperty(value = "支付积分") - private Integer payPoint; + private Long payPoint; @ApiModelProperty(value = "优惠金额") private Double discountPrice; + @ApiModelProperty(value = "优惠详情") + private List discountPriceDetail; + @ApiModelProperty(value = "优惠券金额") private Double couponPrice; @@ -50,7 +57,11 @@ public class PriceDetailDTO implements Serializable { private Double distributionCommission; - @ApiModelProperty(value = "平台收取交易佣金") + @ApiModelProperty(value = "平台收取交易佣金比例") + private Double platFormCommissionPoint; + + + @ApiModelProperty(value = "平台收取交易佣金=(flowPrice(流水金额) * platFormCommissionPoint(平台佣金比例))/100") private Double platFormCommission; //=========end distribution========== @@ -69,31 +80,72 @@ public class PriceDetailDTO implements Serializable { //=========end platform coupon========== //========= update price ========== + @ApiModelProperty(value = "订单修改金额") private Double updatePrice; //=========end update price========== - @ApiModelProperty(value = "流水金额(入账 出帐金额) = goodsPrice + freight - discountPrice - couponPrice + updatePrice") + + @ApiModelProperty(value = "流水金额(入账 出帐金额) = " + + "goodsPrice(商品总金额(商品原价)) + freightPrice(配送费) - " + + "discountPrice(优惠金额) - couponPrice(优惠券金额) + updatePrice(订单修改金额)") private Double flowPrice; - @ApiModelProperty(value = "最终结算金额 = flowPrice - platFormCommission - distributionCommission") + @ApiModelProperty(value = "结算价格 与 商家/供应商 结算价格(例如积分商品/砍价商品)") + private Double settlementPrice; + + @ApiModelProperty(value = "最终结算金额 = flowPrice(流水金额) - platFormCommission(平台收取交易佣金) - distributionCommission(单品分销返现支出)") private Double billPrice; /** * 参与的促销活动 */ @ApiModelProperty(value = "参与的促销活动") - private List joinPromotion; + private List joinPromotion; + /** + * 设置促销详情 + * + * @param discountPriceItem 促销信息 + */ + public void setDiscountPriceItem(DiscountPriceItem discountPriceItem) { + List discountPriceItems = new ArrayList<>(); + discountPriceItems.add(discountPriceItem); + this.discountPriceDetail = discountPriceItems; + } + + /** + * 设置促销详情 + * + * @param discountPriceItem 促销信息 + */ + public void addDiscountPriceItem(DiscountPriceItem discountPriceItem) { + discountPriceDetail.add(discountPriceItem); + } + + + public Double getOriginalPrice() { + if (originalPrice == 0D) { + return flowPrice; + } + if (originalPrice < 0) { + return 0d; + } + return originalPrice; + } + public PriceDetailDTO() { + originalPrice = 0d; goodsPrice = 0d; freightPrice = 0d; - payPoint = 0; + payPoint = 0L; discountPrice = 0d; + couponPrice = 0d; distributionCommission = 0d; + platFormCommissionPoint = 0d; platFormCommission = 0d; siteCouponPrice = 0d; @@ -104,102 +156,285 @@ public class PriceDetailDTO implements Serializable { flowPrice = 0d; billPrice = 0d; + settlementPrice = 0d; + + discountPriceDetail = new ArrayList<>(); joinPromotion = new ArrayList<>(); } + /** - * 累加 + * 写入修改金额,自动计算订单各个金额 * - * @param priceDetailDTOS - * @return + * @param updatePrice 修改后的订单金额 */ - public static PriceDetailDTO accumulationPriceDTO(List priceDetailDTOS, PriceDetailDTO originPriceDetail) { + public void setUpdatePrice(Double updatePrice) { + this.updatePrice = updatePrice; + this.recount(); + } - double goodsPrice = 0d; - double freightPrice = 0d; - - int payPoint = 0; - double discountPrice = 0d; - - double distributionCommission = 0d; - double platFormCommission = 0d; - - double siteCouponPrice = 0d; - double siteCouponPoint = 0d; - double siteCouponCommission = 0d; - - double updatePrice = 0d; - - double flowPrice = 0d; - double billPrice = 0d; - - for (PriceDetailDTO price : priceDetailDTOS) { - - goodsPrice = CurrencyUtil.add(goodsPrice, price.getGoodsPrice()); - freightPrice = CurrencyUtil.add(freightPrice, price.getFreightPrice()); - payPoint = payPoint + price.getPayPoint(); - discountPrice = CurrencyUtil.add(discountPrice, price.getDiscountPrice()); - - updatePrice = CurrencyUtil.add(updatePrice, price.getUpdatePrice()); - - - distributionCommission = CurrencyUtil.add(distributionCommission, price.getDistributionCommission()); - platFormCommission = CurrencyUtil.add(platFormCommission, price.getPlatFormCommission()); - - siteCouponPrice = CurrencyUtil.add(siteCouponPrice, price.getSiteCouponPrice()); - siteCouponPoint = CurrencyUtil.add(siteCouponPoint, price.getSiteCouponPoint()); - siteCouponCommission = CurrencyUtil.add(siteCouponCommission, price.getSiteCouponCommission()); - - flowPrice = CurrencyUtil.add(flowPrice, price.getFlowPrice()); - billPrice = CurrencyUtil.add(billPrice, price.getBillPrice()); - + /** + * 全部重新计算 + */ + public void recount() { + //流水金额(入账 出帐金额) = "流水金额(入账 出帐金额) = goodsPrice + freight - discountPrice - couponPrice + updatePrice" + this.flowPrice = CurrencyUtil.sub( + CurrencyUtil.add(goodsPrice, freightPrice), + CurrencyUtil.add(discountPrice, + couponPrice != null ? couponPrice : 0)); + if (updatePrice != 0) { + flowPrice = CurrencyUtil.add(flowPrice, updatePrice); } - originPriceDetail.setGoodsPrice(goodsPrice); - originPriceDetail.setFreightPrice(freightPrice); - originPriceDetail.setPayPoint(payPoint); - originPriceDetail.setUpdatePrice(updatePrice); - originPriceDetail.setDiscountPrice(discountPrice); - originPriceDetail.setDistributionCommission(distributionCommission); - originPriceDetail.setPlatFormCommission(platFormCommission); + //计算平台佣金 流水金额*平台佣金比例 + if (platFormCommissionPoint != null && getPlatFormCommissionPoint() > 0) { + platFormCommission = CurrencyUtil.div(CurrencyUtil.mul(flowPrice, platFormCommissionPoint), 100); + } - originPriceDetail.setSiteCouponPrice(siteCouponPrice); - originPriceDetail.setSiteCouponPoint(siteCouponPoint); - originPriceDetail.setSiteCouponCommission(siteCouponCommission); - - originPriceDetail.setFlowPrice(flowPrice); - originPriceDetail.setBillPrice(billPrice); - - return originPriceDetail; + //如果结算信息包含结算金额,则最终结算金额直接等于该交易 平台与商户的结算金额 + if (settlementPrice > 0) { + billPrice = settlementPrice; + } else { + //如果是普通订单最终结算金额 = flowPrice - platFormCommission - distributionCommission 流水金额-平台佣金-分销佣金 + billPrice = CurrencyUtil.sub(flowPrice, platFormCommission, distributionCommission); + } } /** - * 累加 + * 累加金额 + */ + public void increase(PriceDetailDTO priceDetailDTO) { + + originalPrice = CurrencyUtil.add(originalPrice, priceDetailDTO.getOriginalPrice()); + goodsPrice = CurrencyUtil.add(goodsPrice, priceDetailDTO.getGoodsPrice()); + freightPrice = CurrencyUtil.add(freightPrice, priceDetailDTO.getFreightPrice()); + + payPoint = payPoint + priceDetailDTO.getPayPoint(); + discountPrice = CurrencyUtil.add(discountPrice, priceDetailDTO.getDiscountPrice()); + couponPrice = CurrencyUtil.add(couponPrice, priceDetailDTO.getCouponPrice()); + + distributionCommission = CurrencyUtil.add(distributionCommission, priceDetailDTO.getDistributionCommission()); + platFormCommission = CurrencyUtil.add(platFormCommission, priceDetailDTO.getPlatFormCommission()); + + siteCouponPrice = CurrencyUtil.add(siteCouponPrice, priceDetailDTO.getSiteCouponPrice()); + //平台优惠券一笔交易只有一个,所以这里直接移值就好了 + siteCouponPoint = priceDetailDTO.getSiteCouponPoint(); + siteCouponCommission = CurrencyUtil.add(siteCouponCommission, priceDetailDTO.getSiteCouponCommission()); + + updatePrice = CurrencyUtil.add(updatePrice, priceDetailDTO.getUpdatePrice()); + + flowPrice = CurrencyUtil.add(flowPrice, priceDetailDTO.getFlowPrice()); + billPrice = CurrencyUtil.add(billPrice, priceDetailDTO.getBillPrice()); + settlementPrice = CurrencyUtil.add(settlementPrice, priceDetailDTO.getSettlementPrice()); + + discountPriceDetail.addAll(priceDetailDTO.getDiscountPriceDetail()); + + } + + /** + * 批量累加 * * @param priceDetailDTOS * @return */ - public static Double sumGoodsPrice(List priceDetailDTOS) { - - - double goodsPrice = 0d; - + public void accumulationPriceDTO(List priceDetailDTOS) { for (PriceDetailDTO price : priceDetailDTOS) { - - goodsPrice = CurrencyUtil.add(goodsPrice, price.getGoodsPrice()); - + this.increase(price); } + } + + public Double getGoodsPrice() { + if (goodsPrice == null || goodsPrice <= 0) { + return 0D; + } return goodsPrice; } + public Double getFreightPrice() { + if (freightPrice == null || freightPrice <= 0) { + return 0D; + } + return freightPrice; + } + + public Long getPayPoint() { + if (payPoint == null || payPoint <= 0) { + return 0L; + } + return payPoint; + } + + public Double getDiscountPrice() { + if (discountPrice == null || discountPrice <= 0) { + return 0D; + } + return discountPrice; + } + + public Double getCouponPrice() { + if (couponPrice == null || couponPrice <= 0) { + return 0D; + } + return couponPrice; + } + + public Double getDistributionCommission() { + if (distributionCommission == null || distributionCommission <= 0) { + return 0D; + } + return distributionCommission; + } + + public Double getPlatFormCommission() { + if (platFormCommission == null || platFormCommission <= 0) { + return 0D; + } + return platFormCommission; + } + + public Double getSiteCouponPrice() { + if (siteCouponPrice == null || siteCouponPrice <= 0) { + return 0D; + } + return siteCouponPrice; + } + + public Double getSiteCouponPoint() { + if (siteCouponPoint == null || siteCouponPoint <= 0) { + return 0D; + } + return siteCouponPoint; + } + + public Double getSiteCouponCommission() { + if (siteCouponCommission == null || siteCouponCommission <= 0) { + return 0D; + } + return siteCouponCommission; + } + + + public Double getFlowPrice() { + if (flowPrice == null || flowPrice <= 0) { + return 0D; + } + return flowPrice; + } + + public Double getSettlementPrice() { + if (settlementPrice == null || settlementPrice <= 0) { + return 0D; + } + return settlementPrice; + } + + public Double getBillPrice() { + if (billPrice == null || billPrice <= 0) { + return 0D; + } + return billPrice; + } + + public Double getUpdatePrice() { + if (updatePrice == null) { + return 0D; + } + return updatePrice; + } + + + public void setSiteCouponPrice(Double siteCouponPrice) { + this.siteCouponPrice = siteCouponPrice; + + if (siteCouponPoint != null && siteCouponPoint != 0) { + this.siteCouponCommission = CurrencyUtil.mul(siteCouponPrice, siteCouponPoint); + } + } + + public void setSiteCouponPoint(Double siteCouponPoint) { + this.siteCouponPoint = siteCouponPoint; + + if (siteCouponPoint != null && siteCouponPoint != 0) { + this.siteCouponCommission = CurrencyUtil.div(CurrencyUtil.mul(siteCouponPrice, siteCouponPoint), 100); + } + } + + + public void setGoodsPrice(Double goodsPrice) { + this.goodsPrice = goodsPrice; + this.recount(); + } + + public void setFreightPrice(Double freightPrice) { + this.freightPrice = freightPrice; + this.recount(); + } + + public void setPayPoint(Long payPoint) { + this.payPoint = payPoint; + } + + public void setDiscountPrice(Double discountPrice) { + this.discountPrice = discountPrice; + promotionPriceHandler(); + this.recount(); + } + + public void setCouponPrice(Double couponPrice) { + this.couponPrice = couponPrice; + promotionPriceHandler(); + this.recount(); + } + /** - * 自身计价 + * 如果促销金额+优惠券金额大于商品金额问题处理 */ - public void count() { - this.flowPrice = CurrencyUtil.sub(CurrencyUtil.add(goodsPrice, freightPrice), discountPrice); - //this.billPrice = CurrencyUtil.sub(CurrencyUtil.sub(CurrencyUtil.sub(flowPrice, platFormCommission)), distributionCommission); + private void promotionPriceHandler() { + if (couponPrice == null || discountPrice == null) { + return; + } + //如果订单优惠总额>商品金额,则处理一下数据,使得两数相加<=商品金额 + if (CurrencyUtil.add(couponPrice, discountPrice) > goodsPrice) { + couponPrice = CurrencyUtil.sub(goodsPrice, discountPrice); + this.setCouponPrice(couponPrice); + } + } + + public void setDistributionCommission(Double distributionCommission) { + this.distributionCommission = distributionCommission; + this.recount(); + } + + public void setPlatFormCommissionPoint(Double platFormCommissionPoint) { + this.platFormCommissionPoint = platFormCommissionPoint; + this.recount(); + } + + public void setPlatFormCommission(Double platFormCommission) { + this.platFormCommission = platFormCommission; + this.recount(); + } + + public void setSiteCouponCommission(Double siteCouponCommission) { + this.siteCouponCommission = siteCouponCommission; + this.recount(); + } + + public void setFlowPrice(Double flowPrice) { + this.flowPrice = flowPrice; + this.recount(); + } + + public void setSettlementPrice(Double settlementPrice) { + this.settlementPrice = settlementPrice; + this.recount(); + } + + public void setBillPrice(Double billPrice) { + this.billPrice = billPrice; + this.recount(); } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptDTO.java index e0b82ff4..f52ab6d1 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptDTO.java @@ -3,13 +3,12 @@ package cn.lili.modules.order.order.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; /** * 发票子内容 * * @author Bulbasaur - * @date 2020/11/28 11:44 + * @since 2020/11/28 11:44 */ @Data public class ReceiptDTO { @@ -21,7 +20,6 @@ public class ReceiptDTO { private String goodsName; @ApiModelProperty(value = "规格") - @Column(columnDefinition = "TEXT") private String specs; @ApiModelProperty(value = "数量") diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptSearchParams.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptSearchParams.java index 496d259b..176391a0 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/ReceiptSearchParams.java @@ -9,7 +9,7 @@ import lombok.Data; * 发票搜索参数 * * @author paulG - * @date 2021/1/12 + * @since 2021/1/12 **/ @Data public class ReceiptSearchParams { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreFlowQueryDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreFlowQueryDTO.java new file mode 100644 index 00000000..958b47ba --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreFlowQueryDTO.java @@ -0,0 +1,38 @@ +package cn.lili.modules.order.order.entity.dto; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.store.entity.dos.Bill; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +/** + * 店铺流水查询DTO + * + * @author Chopper + * @version v1.0 + * 2021-12-08 10:53 + */ +@Data +@Builder +public class StoreFlowQueryDTO { + + @ApiModelProperty(value = "类型") + private String type; + + @ApiModelProperty(value = "售后编号") + private String refundSn; + + @ApiModelProperty(value = "售后编号") + private String orderSn; + + @ApiModelProperty(value = "过滤只看分销订单") + private Boolean justDistribution; + + @ApiModelProperty("结算单") + private Bill bill; + + @ApiModelProperty(value = "分页") + private PageVO pageVO; + +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommentStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommentStatusEnum.java index eb1f7f43..16eef3ff 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommentStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommentStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 评论状态枚举 * * @author Chopper - * @date 2020/11/17 7:25 下午 + * @since 2020/11/17 7:25 下午 */ public enum CommentStatusEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommunicationOwnerEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommunicationOwnerEnum.java index de7cd1ba..e019e106 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommunicationOwnerEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/CommunicationOwnerEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 投诉角色枚举 * * @author paulG - * @date 2020/12/7 + * @since 2020/12/7 **/ public enum CommunicationOwnerEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/DeliverStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/DeliverStatusEnum.java index 6f157857..f381d80e 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/DeliverStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/DeliverStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 发货状态枚举 * * @author Chopper - * @date 2020/11/17 7:25 下午 + * @since 2020/11/17 7:25 下午 */ public enum DeliverStatusEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/FlowTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/FlowTypeEnum.java index c2c7fa9b..403fe145 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/FlowTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/FlowTypeEnum.java @@ -5,7 +5,7 @@ package cn.lili.modules.order.order.entity.enums; * 流水类型枚举 * * @author Chopper - * @date 2020/11/17 7:25 下午 + * @since 2020/11/17 7:25 下午 */ public enum FlowTypeEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderComplaintStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderComplaintStatusEnum.java index facd49e3..1daa5add 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderComplaintStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderComplaintStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 订单的投诉状态 * * @author paulG - * @date 2020/12/5 + * @since 2020/12/5 **/ public enum OrderComplaintStatusEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderItemAfterSaleStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderItemAfterSaleStatusEnum.java index d1b2a33a..88f752c5 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderItemAfterSaleStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderItemAfterSaleStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 订单可申请售后状态枚举 * * @author Chopper - * @date 2020/11/17 7:26 下午 + * @since 2020/11/17 7:26 下午 */ public enum OrderItemAfterSaleStatusEnum { @@ -14,7 +14,9 @@ public enum OrderItemAfterSaleStatusEnum { NEW("新订单,不能申请售后"), NOT_APPLIED("未申请"), ALREADY_APPLIED("已申请"), - EXPIRED("已失效不允许申请售后"); + EXPIRED("已失效不允许申请售后"), + PART_AFTER_SALE("部分售后"); + private final String description; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderMetaKeyEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderMetaKeyEnum.java index 814b9055..6f47de5c 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderMetaKeyEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderMetaKeyEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 订单元Key枚举 * * @author Chopper - * @date 2020/11/17 7:26 下午 + * @since 2020/11/17 7:26 下午 */ public enum OrderMetaKeyEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOperateEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOperateEnum.java index b9283f9a..9a3c4659 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOperateEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOperateEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 订单的操作方式枚举 * * @author Chopper - * @date 2020/11/17 7:26 下午 + * @since 2020/11/17 7:26 下午 */ public enum OrderOperateEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutStatusEnum.java index a00ce1b3..34254a71 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 订单出库状态枚举 * * @author Chopper - * @date 2020/11/17 7:26 下午 + * @since 2020/11/17 7:26 下午 */ public enum OrderOutStatusEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java index b3d2b564..9180a7c6 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java @@ -7,7 +7,7 @@ import java.util.List; * 订单出库的类型枚举 * * @author Chopper - * @date 2020/11/17 7:27 下午 + * @since 2020/11/17 7:27 下午 */ public enum OrderOutTypeEnum { @@ -15,7 +15,7 @@ public enum OrderOutTypeEnum { * 出库类型枚举 */ GOODS("商品"), - SECKILL_GOODS("限时抢购商品"); + SECKILL_GOODS("秒杀活动商品"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java new file mode 100644 index 00000000..76e43d36 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java @@ -0,0 +1,32 @@ +package cn.lili.modules.order.order.entity.enums; + +/** + * 订单促销类型枚举 + * + * @author Chopper + * @since 2020/11/17 7:28 下午 + */ +public enum OrderPromotionTypeEnum { + + /** + * 普通订单 + */ + NORMAL, + /** + * 赠品订单 + */ + GIFT, + /** + * 拼团订单 + */ + PINTUAN, + /** + * 积分订单 + */ + POINTS, + /** + * 砍价订单 + */ + KANJIA + +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderStatusEnum.java index a2536c7b..8edcaccf 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 订单状态枚举 * * @author Chopper - * @date 2020/11/17 7:27 下午 + * @since 2020/11/17 7:27 下午 */ public enum OrderStatusEnum { @@ -16,6 +16,7 @@ public enum OrderStatusEnum { UNDELIVERED("待发货"), DELIVERED("已发货"), COMPLETED("已完成"), + STAY_PICKED_UP("待自提"), /** * 虚拟订单需要核验商品 */ diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTagEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTagEnum.java index d7b4aaad..8870398e 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTagEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTagEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 前端订单页面TAB标签枚举 * * @author Chopper - * @date 2020/11/17 7:28 下午 + * @since 2020/11/17 7:28 下午 */ public enum OrderTagEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java index 78a3b610..129dce04 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.order.entity.enums; * 订单类型枚举 * * @author Chopper - * @date 2020/11/17 7:28 下午 + * @since 2020/11/17 7:28 下午 */ public enum OrderTypeEnum { @@ -14,17 +14,12 @@ public enum OrderTypeEnum { NORMAL, /** - * 赠品订单 + * 虚拟订单 */ - GIFT, + VIRTUAL, /** * 虚拟订单 */ - FICTITIOUS, - /** - * 拼团订单 - */ - PINTUAN - + E_COUPON, } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/PayStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/PayStatusEnum.java index 00c3ea44..b32b1a89 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/PayStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/PayStatusEnum.java @@ -4,15 +4,16 @@ package cn.lili.modules.order.order.entity.enums; * 订单状态枚举 * * @author Chopper - * @date 2020/11/17 7:28 下午 + * @since 2020/11/17 7:28 下午 */ public enum PayStatusEnum { /** * 支付状态 */ - UNPAID("未付款"), - PAID("已付款"); + UNPAID("待付款"), + PAID("已付款"), + CANCEL("已取消"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/TradeStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/TradeStatusEnum.java new file mode 100644 index 00000000..5e4e8fdb --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/TradeStatusEnum.java @@ -0,0 +1,33 @@ +package cn.lili.modules.order.order.entity.enums; + +/** + * 交易状态枚举 + * + * @author Chopper + * @since 2020/11/17 7:27 下午 + */ +public enum TradeStatusEnum { + + /** + * 交易状态 + */ + UNPAID("未付款"), + PAID("已付款"), + CANCELLED("已取消"); + + private final String description; + + TradeStatusEnum(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + + public String description() { + return this.description; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java index 1a00f5d1..0db1700c 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java @@ -1,6 +1,7 @@ package cn.lili.modules.order.order.entity.vo; import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; @@ -15,7 +16,7 @@ import java.io.Serializable; * 订单可进行的操作 * * @author Chopper - * @date 2020/11/17 7:29 下午 + * @since 2020/11/17 7:29 下午 */ @Data public class AllowOperation implements Serializable { @@ -63,14 +64,17 @@ public class AllowOperation implements Serializable { } //新订单 - if (CharSequenceUtil.equalsAny(status, OrderStatusEnum.UNPAID.name(), OrderStatusEnum.PAID.name(), OrderStatusEnum.UNDELIVERED.name())) { + if (CharSequenceUtil.equalsAny(status, OrderStatusEnum.UNPAID.name(), OrderStatusEnum.PAID.name(), OrderStatusEnum.UNDELIVERED.name(), OrderStatusEnum.STAY_PICKED_UP.name())) { this.cancel = true; } //新订单,允许支付 this.pay = status.equals(OrderStatusEnum.UNPAID.name()) && payStatus.equals(PayStatusEnum.UNPAID.name()); - //订单未发货,就可以编辑收货人信息 - this.editConsignee = order.getDeliverStatus().equals(DeliverStatusEnum.UNDELIVERED.name()) && !status.equals(OrderStatusEnum.CANCELLED.name()); + //可编辑订单收件人信息=实物订单 && 订单未发货 && 订单未取消 && 订单不是自提 + this.editConsignee = order.getOrderType().equals(OrderTypeEnum.NORMAL.name()) + && order.getDeliverStatus().equals(DeliverStatusEnum.UNDELIVERED.name()) + && !status.equals(OrderStatusEnum.CANCELLED.name()) + && !order.getDeliveryMethod().equals(DeliveryMethodEnum.SELF_PICK_UP.name()); //是否允许被发货 this.ship = editConsignee && status.equals(OrderStatusEnum.UNDELIVERED.name()); @@ -81,7 +85,8 @@ public class AllowOperation implements Serializable { //是否允许查看物流信息 this.showLogistics = order.getDeliverStatus().equals(DeliverStatusEnum.DELIVERED.name()) && status.equals(OrderStatusEnum.DELIVERED.name()); - this.take = order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()); + //虚拟订单 或 自提订单可以核销 + this.take = (order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name())) || (order.getDeliveryMethod().equals(DeliveryMethodEnum.SELF_PICK_UP.name()) && order.getOrderStatus().equals(OrderStatusEnum.STAY_PICKED_UP.name())); } /** @@ -119,7 +124,7 @@ public class AllowOperation implements Serializable { //是否允许查看物流信息 this.showLogistics = order.getDeliverStatus().equals(DeliverStatusEnum.DELIVERED.name()) && status.equals(OrderStatusEnum.DELIVERED.name()); - this.take = order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()); + this.take = order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()); } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationSearchParams.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationSearchParams.java index bbcfcb4d..3afa9369 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationSearchParams.java @@ -10,7 +10,7 @@ import lombok.Data; * 订单投诉搜索参数 * * @author paulG - * @date 2020/12/5 + * @since 2020/12/5 **/ @Data public class OrderComplaintCommunicationSearchParams { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationVO.java index 53b55196..342e557f 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintCommunicationVO.java @@ -8,7 +8,7 @@ import lombok.NoArgsConstructor; * 投诉通信VO * * @author paulG - * @date 2020/12/5 + * @since 2020/12/5 **/ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintOperationParams.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintOperationParams.java index 83b4db04..4f3b9145 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintOperationParams.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintOperationParams.java @@ -9,7 +9,7 @@ import java.util.List; * 交易投诉 参数 * * @author paulG - * @date 2020/12/4 + * @since 2020/12/4 **/ @Data public class OrderComplaintOperationParams { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintSearchParams.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintSearchParams.java index 707ede7c..7b676630 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintSearchParams.java @@ -1,8 +1,8 @@ package cn.lili.modules.order.order.entity.vo; import cn.hutool.core.util.StrUtil; +import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum; import cn.lili.modules.order.order.entity.dos.OrderComplaint; -import cn.lili.modules.order.order.entity.enums.ComplaintStatusEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -11,7 +11,7 @@ import lombok.Data; * 订单投诉查询参数 * * @author paulG - * @date 2020/12/4 + * @since 2020/12/4 **/ @Data public class OrderComplaintSearchParams { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintVO.java index 8cbccce8..96311ad8 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderComplaintVO.java @@ -14,7 +14,7 @@ import java.util.List; * 订单交易投诉VO * * @author paulG - * @date 2020/12/4 + * @since 2020/12/4 **/ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderDetailVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderDetailVO.java index a814754e..d10e66fe 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderDetailVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderDetailVO.java @@ -7,7 +7,7 @@ import cn.lili.modules.order.order.entity.dos.Receipt; import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.trade.entity.dos.OrderLog; import io.swagger.annotations.ApiModelProperty; @@ -21,7 +21,7 @@ import java.util.List; * 订单详情VO * * @author Chopper - * @date 2020/11/17 7:29 下午 + * @since 2020/11/17 7:29 下午 */ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderItemVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderItemVO.java index 000a01ed..5ab18dcf 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderItemVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderItemVO.java @@ -5,14 +5,16 @@ import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; /** * 子订单VO * * @author Chopper - * @date 2020-08-17 20:28 + * @since 2020-08-17 20:28 */ @Data +@NoArgsConstructor public class OrderItemVO { @ApiModelProperty(value = "编号") @@ -55,17 +57,39 @@ public class OrderItemVO { private String commentStatus; - public OrderItemVO(String sn, String goodsId, String skuId, String num, String image, String name, String afterSaleStatus, String complainStatus, String commentStatus, Double goodsPrice) { + public void setSn(String sn) { this.sn = sn; - this.goodsId = goodsId; + } + + public void setSkuId(String skuId) { this.skuId = skuId; + } + + public void setNum(String num) { this.num = num; + } + + public void setImage(String image) { this.image = image; + } + + public void setName(String name) { this.name = name; - this.afterSaleStatus = afterSaleStatus; - this.complainStatus = complainStatus; - this.commentStatus = commentStatus; + } + + public void setGoodsPrice(Double goodsPrice) { this.goodsPrice = goodsPrice; } + public void setAfterSaleStatus(String afterSaleStatus) { + this.afterSaleStatus = afterSaleStatus; + } + + public void setComplainStatus(String complainStatus) { + this.complainStatus = complainStatus; + } + + public void setCommentStatus(String commentStatus) { + this.commentStatus = commentStatus; + } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java index 8fc8ea67..23a66b09 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java @@ -1,11 +1,11 @@ package cn.lili.modules.order.order.entity.vo; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.order.order.entity.enums.*; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; -import jdk.nashorn.internal.objects.annotations.Getter; import lombok.Data; import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; @@ -19,7 +19,7 @@ import java.util.List; * 用于订单列表查看 * * @author Chopper - * @date 2020-08-17 20:28 + * @since 2020-08-17 20:28 */ @Data public class OrderSimpleVO { @@ -36,13 +36,13 @@ public class OrderSimpleVO { private Date createTime; /** - * @see OrderStatusEnum + * @see cn.lili.modules.order.order.entity.enums.OrderStatusEnum */ @ApiModelProperty(value = "订单状态") private String orderStatus; /** - * @see PayStatusEnum + * @see cn.lili.modules.order.order.entity.enums.PayStatusEnum */ @ApiModelProperty(value = "付款状态") private String payStatus; @@ -55,6 +55,7 @@ public class OrderSimpleVO { private Date paymentTime; @ApiModelProperty(value = "用户名") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; @ApiModelProperty(value = "店铺名称") @@ -102,21 +103,21 @@ public class OrderSimpleVO { @Setter private String groupGoodsPrice; /** - * @see OrderItemAfterSaleStatusEnum + * @see cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum */ @ApiModelProperty(hidden = true, value = "item 售后状态", allowableValues = "NOT_APPLIED(未申请),ALREADY_APPLIED(已申请),EXPIRED(已失效不允许申请售后)") @Setter private String groupAfterSaleStatus; /** - * @see OrderComplaintStatusEnum + * @see cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum */ @ApiModelProperty(hidden = true, value = "item 投诉状态") @Setter private String groupComplainStatus; /** - * @see CommentStatusEnum + * @see cn.lili.modules.order.order.entity.enums.CommentStatusEnum */ @ApiModelProperty(hidden = true, value = "item 评价状态") @Setter @@ -124,45 +125,75 @@ public class OrderSimpleVO { /** - * @see OrderTypeEnum + * @see cn.lili.modules.order.order.entity.enums.OrderTypeEnum */ @ApiModelProperty(value = "订单类型") private String orderType; /** - * @see DeliverStatusEnum + * @see cn.lili.modules.order.order.entity.enums.DeliverStatusEnum */ @ApiModelProperty(value = "货运状态") private String deliverStatus; - @Getter + /** + * @see cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum + */ + @ApiModelProperty(value = "订单促销类型") + private String orderPromotionType; + public List getOrderItems() { - if (StringUtils.isEmpty(groupGoodsId)) { + if (CharSequenceUtil.isEmpty(groupGoodsId)) { return new ArrayList<>(); } List orderItemVOS = new ArrayList<>(); - String[] orderItemsSn = groupOrderItemsSn.split(","); + + String[] goodsId = groupGoodsId.split(","); - String[] skuId = groupSkuId.split(","); - String[] num = groupNum.split(","); - String[] image = groupImages.split(","); - String[] name = groupName.split(","); - String[] afterSaleStatus = groupAfterSaleStatus.split(","); - String[] complainStatus = groupComplainStatus.split(","); - String[] commentStatus = groupCommentStatus.split(","); - String[] goodsPrice = groupGoodsPrice.split(","); -// String goodsId, String skuId, Integer num, String image, String name, String afterSaleStatus + for (int i = 0; i < goodsId.length; i++) { - orderItemVOS.add(new OrderItemVO(orderItemsSn[i], goodsId[i], skuId[i], num[i], image[i], name[i], afterSaleStatus[i], complainStatus[i], commentStatus[i], Double.parseDouble(goodsPrice[i]))); + orderItemVOS.add(this.getOrderItemVO(i)); } return orderItemVOS; } + private OrderItemVO getOrderItemVO(int i) { + OrderItemVO orderItemVO = new OrderItemVO(); + orderItemVO.setGoodsId(groupGoodsId.split(",")[i]); + if (CharSequenceUtil.isNotEmpty(groupOrderItemsSn)) { + orderItemVO.setSn(groupOrderItemsSn.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupSkuId)) { + orderItemVO.setSkuId(groupSkuId.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupName)) { + orderItemVO.setName(groupName.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupNum) && groupNum.split(",").length == groupGoodsId.split(",").length) { + orderItemVO.setNum(groupNum.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupImages) && groupImages.split(",").length == groupGoodsId.split(",").length) { + orderItemVO.setImage(groupImages.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupAfterSaleStatus) && groupAfterSaleStatus.split(",").length == groupGoodsId.split(",").length) { + orderItemVO.setAfterSaleStatus(groupAfterSaleStatus.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupComplainStatus) && groupComplainStatus.split(",").length == groupGoodsId.split(",").length) { + orderItemVO.setComplainStatus(groupComplainStatus.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupCommentStatus) && groupCommentStatus.split(",").length == groupGoodsId.split(",").length) { + orderItemVO.setCommentStatus(groupCommentStatus.split(",")[i]); + } + if (CharSequenceUtil.isNotEmpty(groupGoodsPrice) && groupGoodsPrice.split(",").length == groupGoodsId.split(",").length) { + orderItemVO.setGoodsPrice(Double.parseDouble(groupGoodsPrice.split(",")[i])); + } + return orderItemVO; + } + /** * 初始化自身状态 */ - @Getter public AllowOperation getAllowOperationVO() { //设置订单的可操作状态 return new AllowOperation(this); diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java index b04687bf..bfb23844 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java @@ -1,9 +1,11 @@ package cn.lili.modules.order.order.entity.vo; +import cn.hutool.core.bean.BeanUtil; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.OrderItem; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @@ -11,9 +13,10 @@ import java.util.List; * 订单vo * * @author Bulbasaur - * @date 2020/11/28 11:38 + * @since 2020/11/28 11:38 */ @Data +@NoArgsConstructor public class OrderVO extends Order { @@ -23,4 +26,8 @@ public class OrderVO extends Order { private List orderItems; + public OrderVO (Order order,List orderItems){ + BeanUtil.copyProperties(order, this); + this.setOrderItems(orderItems); + } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/PaymentLog.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/PaymentLog.java index 67cec7ce..d06c7d87 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/PaymentLog.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/PaymentLog.java @@ -1,29 +1,24 @@ package cn.lili.modules.order.order.entity.vo; -import cn.lili.base.BaseEntity; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; +import cn.lili.mybatis.BaseEntity; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** - * 订单 + * 订单支付日志:实际为订单部分字段提取过来的一个vo * * @author Chopper - * @date 2020/11/17 7:30 下午 + * @since 2020/11/17 7:30 下午 */ @Data -@Entity -@Table(name = "li_order") -@TableName("li_order") + @ApiModel(value = "订单") public class PaymentLog extends BaseEntity { @@ -82,8 +77,4 @@ public class PaymentLog extends BaseEntity { @ApiModelProperty(value = "订单类型") private String orderType; - - public PaymentLog() { - - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java index cbea30f0..6047ea88 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java @@ -4,16 +4,20 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; + /** * 发票 * * @author Bulbasaur - * @date 2020/11/28 11:38 + * @since 2020/11/28 11:38 */ @Data @ApiModel(value = "发票") -public class ReceiptVO { +public class ReceiptVO implements Serializable { + private static final long serialVersionUID = -8402457457074092957L; + @ApiModelProperty(value = "发票抬头") private String receiptTitle; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/StoreAppealVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/StoreAppealVO.java index f4aac4b1..fb0a533c 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/StoreAppealVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/StoreAppealVO.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; * 订单交易投诉VO * * @author paulG - * @date 2020/12/4 + * @since 2020/12/4 **/ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderItemMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderItemMapper.java index aa0b35d9..199b2f63 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderItemMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderItemMapper.java @@ -14,11 +14,16 @@ import java.util.List; * 子订单数据处理层 * * @author Chopper - * @date 2020/11/17 7:34 下午 + * @since 2020/11/17 7:34 下午 */ public interface OrderItemMapper extends BaseMapper { + /** + * 获取等待操作订单子项目 + * + * @param queryWrapper 查询条件 + * @return 订单子项列表 + */ @Select("SELECT * FROM li_order_item AS oi INNER JOIN li_order AS o ON oi.order_sn=o.sn ${ew.customSqlSegment}") - List waitEvaluate(@Param(Constants.WRAPPER) Wrapper queryWrapper); - + List waitOperationOrderItem(@Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java index e976a1a7..03bf771d 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java @@ -1,6 +1,7 @@ package cn.lili.modules.order.order.mapper; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; import cn.lili.modules.order.order.entity.vo.PaymentLog; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -11,21 +12,55 @@ import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; +import java.util.List; + /** * 订单数据处理层 * * @author Chopper - * @date 2020/11/17 7:35 下午 + * @since 2020/11/17 7:35 下午 */ public interface OrderMapper extends BaseMapper { - @Update({"update li_order set order_status = #{status} where sn in #{orderSn}"}) - void batchUpdateStatus(String status, String orderSns); - + /** + * 修改订单状态 + * + * @param status 状态 + * @param orderSn 订单编号 + */ @Update({"update li_order set order_status = #{status} where sn = #{orderSn}"}) void updateStatus(String status, String orderSn); - @Select("select o.sn,o.flow_price,o.create_time,o.order_status,o.pay_status,o.payment_method,o.payment_time,o.member_name,o.store_name as store_name,o.store_id as store_id,o.client_type,o.order_type,o.deliver_status " + + /** + * 查询导出订单DTO列表 + * + * @param queryWrapper 查询条件 + * @return 导出订单DTO列表 + */ + @Select("SELECT o.sn,o.create_time,o.member_name,o.consignee_name,o.consignee_mobile,o.consignee_address_path,o.consignee_detail," + + "o.payment_method, o.logistics_name,o.freight_price,oi.goods_price,o.discount_price,o.flow_price,oi.goods_name,oi.num," + + "o.remark,o.order_status,o.pay_status,o.deliver_status,o.need_receipt,o.store_name FROM li_order o LEFT JOIN li_order_item oi " + + "ON oi.order_sn=o.sn ${ew.customSqlSegment}") + List queryExportOrder(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询订单支付记录 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 订单支付记录分页 + */ + @Select("select * from li_order ${ew.customSqlSegment} ") + IPage queryPaymentLogs(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询订单简短信息分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 简短订单分页 + */ + @Select("select o.sn,o.flow_price,o.create_time,o.order_status,o.pay_status,o.payment_method,o.payment_time,o.member_name,o.store_name as store_name,o.store_id as store_id,o.client_type,o.order_type,o.deliver_status,o.order_promotion_type " + ",GROUP_CONCAT(oi.goods_id) as group_goods_id," + " GROUP_CONCAT(oi.sku_id) as group_sku_id," + " GROUP_CONCAT(oi.num) as group_num" + @@ -36,11 +71,18 @@ public interface OrderMapper extends BaseMapper { ",GROUP_CONCAT(oi.comment_status) as group_comment_status" + ",GROUP_CONCAT(oi.sn) as group_order_items_sn " + ",GROUP_CONCAT(oi.goods_price) as group_goods_price " + - " FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ") + " FROM li_order o LEFT JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ") IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 查询订单信息 + * + * @param queryWrapper 查询条件 + * @return 简短订单分页 + */ + @Select("select o.* " + + " FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ") + List queryListByParams(@Param(Constants.WRAPPER) Wrapper queryWrapper); - @Select("select * from li_order ${ew.customSqlSegment} ") - IPage queryPaymentLogs(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/ReceiptMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/ReceiptMapper.java index 3a7ba953..f6df8c3b 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/ReceiptMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/ReceiptMapper.java @@ -15,7 +15,7 @@ import org.apache.ibatis.annotations.Select; * 发票数据处理层 * * @author Chopper - * @date 2020/11/17 7:35 下午 + * @since 2020/11/17 7:35 下午 */ public interface ReceiptMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/StoreFlowMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/StoreFlowMapper.java index 73e0abc7..e9c8d161 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/StoreFlowMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/StoreFlowMapper.java @@ -1,13 +1,37 @@ package cn.lili.modules.order.order.mapper; import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO; +import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; /** * 商家订单流水数据处理层 * * @author Chopper - * @date 2020/11/17 7:35 下午 + * @since 2020/11/17 7:35 下午 */ public interface StoreFlowMapper extends BaseMapper { + + /** + * 获取结算单的入账流水 + * @param queryWrapper 查询条件 + * @return 入账流水 + */ + @Select("SELECT * FROM li_store_flow ${ew.customSqlSegment}") + List getStoreFlowPayDownloadVO(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 获取结算单的退款流水 + * @param queryWrapper 查询条件 + * @return 退款流水 + */ + @Select("SELECT * FROM li_store_flow ${ew.customSqlSegment}") + List getStoreFlowRefundDownloadVO(@Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/TradeMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/TradeMapper.java index dad60aac..3c5093e4 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/TradeMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/TradeMapper.java @@ -8,10 +8,15 @@ import org.apache.ibatis.annotations.Update; * 交易数据处理层 * * @author Chopper - * @date 2020/11/17 7:35 下午 + * @since 2020/11/17 7:35 下午 */ public interface TradeMapper extends BaseMapper { + /** + * 修改交易金额 + * + * @param tradeSn 交易编号 + */ @Update("UPDATE li_trade SET flow_price =(SELECT SUM(flow_price) FROM li_order WHERE trade_sn=#{tradeSn}) WHERE sn=#{tradeSn}") void updateTradePrice(String tradeSn); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintCommunicationService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintCommunicationService.java index 10a1920a..c0637b41 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintCommunicationService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintCommunicationService.java @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 订单投诉通信业务层 * * @author paulG - * @date 2020/12/5 + * @since 2020/12/5 **/ public interface OrderComplaintCommunicationService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintService.java index 4d742153..3750ee3c 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderComplaintService.java @@ -14,7 +14,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 交易投诉业务层 * * @author paulG - * @date 2020/12/4 + * @since 2020/12/4 **/ public interface OrderComplaintService extends IService { @@ -68,11 +68,11 @@ public interface OrderComplaintService extends IService { OrderComplaint updateOrderComplainByStatus(OrderComplaintOperationParams operationParam); /** - * 获取新投诉数量 + * 待处理投诉数量 * - * @return 新投诉 + * @return 待处理投诉数量 */ - Integer newComplainNum(); + long waitComplainNum(); /** * 取消交易投诉 @@ -84,7 +84,9 @@ public interface OrderComplaintService extends IService { /** * 店铺申诉 + * * @param storeAppealVO + * @return 操作状态 */ boolean appeal(StoreAppealVO storeAppealVO); } diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderItemService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderItemService.java index dc305bee..ca3c3f4a 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderItemService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderItemService.java @@ -6,14 +6,13 @@ import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.Date; import java.util.List; /** * 子订单业务层 * * @author Chopper - * @date 2020/11/17 7:36 下午 + * @since 2020/11/17 7:36 下午 */ public interface OrderItemService extends IService { @@ -60,10 +59,11 @@ public interface OrderItemService extends IService { List getByOrderSn(String orderSn); /** - * 获取待评价订单列表 + * 子订单查询 * - * @param date 结束时间 - * @return 子订单列表 + * @param orderSn 订单编号 + * @param skuId skuid + * @return 子订单 */ - List waitEvaluate(Date date); + OrderItem getByOrderSnAndSkuId(String orderSn, String skuId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java index baa70f7e..1aa5791e 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java @@ -3,10 +3,10 @@ package cn.lili.modules.order.order.service; import cn.lili.modules.order.order.entity.dos.Order; /** - * @author liushuai(liushuai711 @ gmail.com) - * @version v4.1 - * @Description: - * @since 2021/4/28 3:47 下午 + * 订单价格 + * + * @author Chopper + * @since 2020/11/17 7:36 下午 */ public interface OrderPriceService { @@ -16,6 +16,7 @@ public interface OrderPriceService { * * @param orderSn 订单编号 * @param orderPrice 订单价格 + * @return 订单 */ Order updatePrice(String orderSn, Double orderPrice); diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java index 1f8da09e..86ba90bd 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java @@ -1,25 +1,28 @@ package cn.lili.modules.order.order.service; -import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dto.MemberAddressDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.dto.OrderSearchParams; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; +import cn.lili.modules.order.order.entity.vo.PaymentLog; import cn.lili.modules.system.entity.vo.Traces; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** * 子订单业务层 * * @author Chopper - * @date 2020/11/17 7:36 下午 + * @since 2020/11/17 7:36 下午 */ public interface OrderService extends IService { @@ -40,13 +43,63 @@ public interface OrderService extends IService { */ Order getBySn(String orderSn); + /** * 订单查询 * * @param orderSearchParams 查询参数 + * @return 简短订单分页 */ IPage queryByParams(OrderSearchParams orderSearchParams); + /** + * 订单信息 + * + * @param orderSearchParams 查询参数 + * @return 订单信息 + */ + List queryListByParams(OrderSearchParams orderSearchParams); + + /** + * 根据促销查询订单 + * + * @param orderPromotionType 订单类型 + * @param payStatus 支付状态 + * @param parentOrderSn 依赖订单编号 + * @param orderSn 订单编号 + * @return 订单信息 + */ + List queryListByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn); + + /** + * 根据促销查询订单 + * + * @param orderPromotionType 订单类型 + * @param payStatus 支付状态 + * @param parentOrderSn 依赖订单编号 + * @param orderSn 订单编号 + * @return 订单信息 + */ + long queryCountByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn); + + /** + * 父级拼团订单分组 + * + * @param pintuanId 拼团id + * @return 拼团订单信息 + */ + List queryListByPromotion(String pintuanId); + + + /** + * 查询导出订单列表 + * + * @param orderSearchParams 查询参数 + * @return 导出订单列表 + */ + List queryExportOrder(OrderSearchParams orderSearchParams); + + /** * 订单详细 * @@ -56,7 +109,9 @@ public interface OrderService extends IService { OrderDetailVO queryDetail(String orderSn); /** - * 创建交易 + * 创建订单 + * 1.检查交易信息 + * 2.循环交易购物车列表,创建订单以及相关信息 * * @param tradeDTO 交易DTO */ @@ -64,6 +119,8 @@ public interface OrderService extends IService { /** * 订单付款 + * 修改订单付款信息 + * 记录订单流水 * * @param orderSn 订单编号 * @param paymentMethod 支付方法 @@ -83,6 +140,7 @@ public interface OrderService extends IService { * * @param orderSn 订单SN * @param reason 取消理由 + * @return 订单 */ Order cancel(String orderSn, String reason); @@ -93,6 +151,7 @@ public interface OrderService extends IService { * * @param orderSn 订单编号 * @param memberAddressDTO 收货地址信息 + * @return 订单 */ Order updateConsignee(String orderSn, MemberAddressDTO memberAddressDTO); @@ -102,9 +161,18 @@ public interface OrderService extends IService { * @param orderSn 订单编号 * @param invoiceNumber 发货单号 * @param logisticsId 物流公司 + * @return 订单 */ Order delivery(String orderSn, String invoiceNumber, String logisticsId); + /** + * 订单发货 + * + * @param orderSn 订单编号 + * @return 订单 + */ + Order shunFengDelivery(String orderSn); + /** * 获取物流踪迹 * @@ -114,12 +182,38 @@ public interface OrderService extends IService { Traces getTraces(String orderSn); /** - * 订单核验 + * 获取地图版 物流踪迹 * * @param orderSn 订单编号 - * @param qrCode 提货码 + * @return 物流踪迹 */ - Order take(String orderSn, String qrCode); + Traces getMapTraces(String orderSn); + + /** + * 订单核验 + * + * @param verificationCode 验证码 + * @param orderSn 订单编号 + * @return 订单 + */ + Order take(String orderSn, String verificationCode); + + + /** + * 订单核验 + * + * @param verificationCode 验证码 + * @return 订单 + */ + Order take(String verificationCode); + + /** + * 根据核验码获取订单信息 + * + * @param verificationCode 验证码 + * @return 订单 + */ + Order getOrderByVerificationCode(String verificationCode); /** * 订单完成 @@ -128,6 +222,13 @@ public interface OrderService extends IService { */ void complete(String orderSn); + /** + * 系统定时完成订单 + * + * @param orderSn 订单编号 + */ + void systemComplete(String orderSn); + /** * 通过trade 获取订单列表 * @@ -150,16 +251,6 @@ public interface OrderService extends IService { */ void deleteOrder(String sn); - /** - * 获取统计的订单 - * - * @param statisticsQueryParam - * @param pageVO - * @return - */ - IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO); - - /** * 开具发票 * @@ -176,4 +267,47 @@ public interface OrderService extends IService { */ void agglomeratePintuanOrder(String pintuanId, String parentOrderSn); + /** + * 获取待发货订单编号列表 + * + * @param response 响应 + * @param logisticsName 店铺已选择物流公司列表 + */ + void getBatchDeliverList(HttpServletResponse response, List logisticsName); + + /** + * 订单批量发货 + * + * @param files 文件 + */ + void batchDeliver(MultipartFile files); + + + /** + * 获取订单实际支付的总金额 + * + * @param orderSn 订单sn + * @return 金额 + */ + Double getPaymentTotal(String orderSn); + + /** + * 查询订单支付记录 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 订单支付记录分页 + */ + IPage queryPaymentLogs(IPage page, Wrapper queryWrapper); + + /** + * 检查是否开始虚拟成团 + * + * @param pintuanId 拼团活动id + * @param requiredNum 成团人数 + * @param fictitious 是否开启成团 + * @return 是否成功 + */ + boolean checkFictitiousOrder(String pintuanId, Integer requiredNum, Boolean fictitious); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/ReceiptService.java b/framework/src/main/java/cn/lili/modules/order/order/service/ReceiptService.java index 2caeed81..748b6051 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/ReceiptService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/ReceiptService.java @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 发票业务层 * * @author Bulbasaur - * @date 2020/11/17 7:37 下午 + * @since 2020/11/17 7:37 下午 */ public interface ReceiptService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/StoreFlowService.java b/framework/src/main/java/cn/lili/modules/order/order/service/StoreFlowService.java index f513cbe4..ff879435 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/StoreFlowService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/StoreFlowService.java @@ -1,18 +1,21 @@ package cn.lili.modules.order.order.service; import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO; +import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO; +import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.Date; +import java.util.List; /** * 商家订单流水业务层 * * @author Chopper - * @date 2020/11/17 7:37 下午 + * @since 2020/11/17 7:37 下午 */ public interface StoreFlowService extends IService { @@ -33,14 +36,61 @@ public interface StoreFlowService extends IService { /** * 获取商家流水 * - * @param StoreId 商家ID - * @param type 收入、退款 - * @param distribution 是否查看分销相关数据 - * @param pageVO 分页 - * @param startTime 开始时间 - * @param endTime 结束时间 - * @return + * @param storeFlowQueryDTO 查询参数 + * @return 返回分页 */ - IPage getStoreFlow(String StoreId, String type, boolean distribution, PageVO pageVO, Date startTime, Date endTime); + IPage getStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO); + /** + * 根据参数查询一条数据 + * + * @param storeFlowQueryDTO 查询参数 + * @return 返回分页 + */ + StoreFlow queryOne(StoreFlowQueryDTO storeFlowQueryDTO); + + /** + * 获取结算单地入账流水 + * + * @param storeFlowQueryDTO 查询条件 + * @return 入账流水 + */ + List getStoreFlowPayDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO); + + /** + * 获取结算单的退款流水 + * + * @param storeFlowQueryDTO 查询条件 + * @return 退款流水 + */ + List getStoreFlowRefundDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO); + + + /** + * 根据结算单ID获取商家流水 + * + * @param pageVO 分页 + * @param id 结算单ID + * @param type 类型 + * @return 商家流水 + */ + IPage getStoreFlow(String id, String type, PageVO pageVO); + + /** + * 根据结算单ID获取商家流水 + * + * @param pageVO 分页 + * @param id 结算单ID + * @return 商家流水 + */ + IPage getDistributionFlow(String id, PageVO pageVO); + + + /** + * 获取店铺流水 + * + * @param storeFlowQueryDTO 店铺流水查询参数 + * @return 商家流水集合 + */ + List listStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java b/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java index 91457521..cf14ea5d 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java @@ -8,12 +8,19 @@ import com.baomidou.mybatisplus.extension.service.IService; * 交易业务层 * * @author Chopper - * @date 2020/11/17 7:37 下午 + * @since 2020/11/17 7:37 下午 */ public interface TradeService extends IService { /** * 创建交易 + * 1.订单数据校验 + * 2.积分预处理 + * 3.优惠券预处理 + * 4.添加交易 + * 5.添加订单 + * 6.将交易写入缓存供消费者调用 + * 7.发送交易创建消息 * * @param tradeDTO 购物车视图 * @return 交易 diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintCommunicationServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintCommunicationServiceImpl.java index 74a109b3..b20ea3a5 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintCommunicationServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintCommunicationServiceImpl.java @@ -1,6 +1,6 @@ package cn.lili.modules.order.order.serviceimpl; -import cn.lili.common.utils.PageUtil; +import cn.lili.mybatis.util.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.order.order.entity.dos.OrderComplaintCommunication; import cn.lili.modules.order.order.entity.vo.OrderComplaintCommunicationSearchParams; @@ -11,8 +11,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import javax.transaction.Transactional; - /** * 交易投诉通信业务层实现 * @@ -20,7 +18,6 @@ import javax.transaction.Transactional; * @since 2020/12/5 **/ @Service -@Transactional public class OrderComplaintCommunicationServiceImpl extends ServiceImpl implements OrderComplaintCommunicationService { @Override diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintServiceImpl.java index 3459288f..bc5ebcaf 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderComplaintServiceImpl.java @@ -1,22 +1,21 @@ package cn.lili.modules.order.order.serviceimpl; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.BeanUtil; -import cn.lili.common.utils.OperationalJudgment; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum; import cn.lili.modules.order.order.entity.dos.OrderComplaint; import cn.lili.modules.order.order.entity.dos.OrderComplaintCommunication; import cn.lili.modules.order.order.entity.dos.OrderItem; import cn.lili.modules.order.order.entity.dto.OrderComplaintDTO; -import cn.lili.modules.order.order.entity.enums.ComplaintStatusEnum; import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; import cn.lili.modules.order.order.entity.vo.*; import cn.lili.modules.order.order.mapper.OrderComplaintMapper; @@ -24,19 +23,20 @@ import cn.lili.modules.order.order.service.OrderComplaintCommunicationService; import cn.lili.modules.order.order.service.OrderComplaintService; import cn.lili.modules.order.order.service.OrderItemService; import cn.lili.modules.order.order.service.OrderService; +import cn.lili.mybatis.util.PageUtil; 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.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import javax.transaction.Transactional; import java.util.Date; import java.util.List; +import java.util.Objects; /** * 交易投诉业务层实现 @@ -45,18 +45,28 @@ import java.util.List; * @since 2020/12/5 **/ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderComplaintServiceImpl extends ServiceImpl implements OrderComplaintService { - //订单 - private final OrderService orderService; - //订单货物 - private final OrderItemService orderItemService; - //商品规格 - private final GoodsSkuService goodsSkuService; - //交易投诉沟通 - private final OrderComplaintCommunicationService orderComplaintCommunicationService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 订单货物 + */ + @Autowired + private OrderItemService orderItemService; + /** + * 商品规格 + */ + @Autowired + private GoodsSkuService goodsSkuService; + /** + * 交易投诉沟通 + */ + @Autowired + private OrderComplaintCommunicationService orderComplaintCommunicationService; /** * 分页获取交易投诉信息 @@ -109,9 +119,11 @@ public class OrderComplaintServiceImpl extends ServiceImpl orderItems = orderDetailVO.getOrderItems(); @@ -151,8 +163,8 @@ public class OrderComplaintServiceImpl extends ServiceImpl lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.eq(OrderComplaint::getId, id); lambdaUpdateWrapper.set(OrderComplaint::getComplainStatus, ComplaintStatusEnum.CANCEL.name()); @@ -227,7 +243,7 @@ public class OrderComplaintServiceImpl extends ServiceImpl implements OrderItemService { - private final OrderItemMapper orderItemMapper; - @Override public void updateCommentStatus(String orderItemSn, CommentStatusEnum commentStatusEnum) { LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); @@ -63,7 +55,7 @@ public class OrderItemServiceImpl extends ServiceImpl waitEvaluate(Date date) { - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.ge("o.complete_time", date); - queryWrapper.eq("oi.comment_status", CommentStatusEnum.UNFINISHED.name()); - return orderItemMapper.waitEvaluate(queryWrapper); + public OrderItem getByOrderSnAndSkuId(String orderSn, String skuId) { + return this.getOne(new LambdaQueryWrapper() + .eq(OrderItem::getOrderSn, orderSn) + .eq(OrderItem::getSkuId, skuId)); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderPriceServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderPriceServiceImpl.java index 369191cc..7b0e997c 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderPriceServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderPriceServiceImpl.java @@ -1,55 +1,58 @@ package cn.lili.modules.order.order.serviceimpl; import cn.hutool.json.JSONUtil; -import cn.lili.common.aop.syslog.annotation.SystemLogPoint; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.OperationalJudgment; -import cn.lili.modules.goods.service.CategoryService; import cn.lili.modules.order.order.aop.OrderLogPoint; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.OrderItem; -import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; -import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderItemService; import cn.lili.modules.order.order.service.OrderPriceService; import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; -import cn.lili.modules.payment.kit.plugin.bankTransfer.BankTransferPlugin; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.payment.kit.plugin.bank.BankTransferPlugin; +import cn.lili.modules.system.aspect.annotation.SystemLogPoint; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; /** - * @author liushuai(liushuai711 @ gmail.com) - * @version v4.1 - * @Description: - * @since 2021/4/28 3:48 下午 + * 订单价格业务层实现 + * + * @author Chopper + * @since 2020/11/17 7:36 下午 */ +@Slf4j @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderPriceServiceImpl implements OrderPriceService { - //线下收款 - private final BankTransferPlugin bankTransferPlugin; - - private final OrderItemService orderItemService; - - //交易数据层 - private final TradeMapper tradeMapper; - //订单 - private final OrderService orderService; - //商品分类 - private final CategoryService categoryService; + /** + * 线下收款 + */ + @Autowired + private BankTransferPlugin bankTransferPlugin; + /** + * 订单货物 + */ + @Autowired + private OrderItemService orderItemService; + /** + * 交易数据层 + */ + @Resource + private TradeMapper tradeMapper; + /** + * 订单 + */ + @Autowired + private OrderService orderService; @Override @SystemLogPoint(description = "修改订单价格", customerLog = "'订单编号:'+#orderSn +',价格修改为:'+#orderPrice") @@ -59,9 +62,6 @@ public class OrderPriceServiceImpl implements OrderPriceService { //修改订单金额 Order order = updateOrderPrice(orderSn, orderPrice); - //修改订单货物金额 - updateOrderItemPrice(order); - //修改交易金额 tradeMapper.updateTradePrice(order.getTradeSn()); return order; @@ -77,14 +77,6 @@ public class OrderPriceServiceImpl implements OrderPriceService { } bankTransferPlugin.callBack(order); - - //发送订单状态变化消息 - OperationalJudgment.judgment(orderService.getBySn(orderSn)); - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setOrderSn(orderSn); - orderMessage.setPaymentMethod(PaymentMethodEnum.BANK_TRANSFER.name()); - orderMessage.setNewStatus(OrderStatusEnum.PAID); - orderService.sendUpdateStatusMessage(orderMessage); } @@ -109,19 +101,19 @@ public class OrderPriceServiceImpl implements OrderPriceService { //获取订单价格信息 PriceDetailDTO orderPriceDetailDTO = order.getPriceDetailDTO(); - //如果未修改过金额则记录订单原始价格 - if (orderPriceDetailDTO.getOriginalPrice() == null) { - orderPriceDetailDTO.setOriginalPrice(order.getFlowPrice()); - } - //修改订单价格 - order.setFlowPrice(orderPrice); + order.setUpdatePrice(CurrencyUtil.sub(orderPrice, orderPriceDetailDTO.getOriginalPrice())); + //订单修改金额=使用订单原始金额-修改后金额 - orderPriceDetailDTO.setUpdatePrice(CurrencyUtil.sub(orderPriceDetailDTO.getOriginalPrice(), orderPrice)); - orderPriceDetailDTO.setFlowPrice(orderPrice); + orderPriceDetailDTO.setUpdatePrice(CurrencyUtil.sub(orderPrice, orderPriceDetailDTO.getOriginalPrice())); + order.setFlowPrice(orderPriceDetailDTO.getFlowPrice()); //修改订单 - order.setPriceDetail(JSONUtil.toJsonStr(orderPriceDetailDTO)); + order.setPriceDetailDTO(orderPriceDetailDTO); orderService.updateById(order); + + //修改子订单 + updateOrderItemPrice(order); + return order; } @@ -137,40 +129,42 @@ public class OrderPriceServiceImpl implements OrderPriceService { */ private void updateOrderItemPrice(Order order) { List orderItems = orderItemService.getByOrderSn(order.getSn()); + + //获取总数,入欧最后一个则将其他orderitem的修改金额累加,然后进行扣减 + Integer index = orderItems.size(); + Double countUpdatePrice = 0D; for (OrderItem orderItem : orderItems) { //获取订单货物价格信息 PriceDetailDTO priceDetailDTO = orderItem.getPriceDetailDTO(); - //如果未修改过金额则记录订单原始价格 - if (priceDetailDTO.getOriginalPrice() == null) { - priceDetailDTO.setOriginalPrice(orderItem.getFlowPrice()); + index--; + //如果是最后一个 + if (index == 0) { + //记录修改金额 + priceDetailDTO.setUpdatePrice(CurrencyUtil.sub(order.getUpdatePrice(), countUpdatePrice)); + //修改订单货物金额 + orderItem.setFlowPrice(priceDetailDTO.getFlowPrice()); + orderItem.setUnitPrice(CurrencyUtil.div(priceDetailDTO.getFlowPrice(), orderItem.getNum())); + orderItem.setPriceDetail(JSONUtil.toJsonStr(priceDetailDTO)); + + } else { + + //SKU占总订单 金额的百分比 + Double priceFluctuationRatio = CurrencyUtil.div(priceDetailDTO.getOriginalPrice(), order.getPriceDetailDTO().getOriginalPrice(), 4); + + //记录修改金额 + priceDetailDTO.setUpdatePrice(CurrencyUtil.mul(order.getUpdatePrice(), priceFluctuationRatio)); + + //修改订单货物金额 + orderItem.setFlowPrice(priceDetailDTO.getFlowPrice()); + orderItem.setUnitPrice(CurrencyUtil.div(priceDetailDTO.getFlowPrice(), orderItem.getNum())); + orderItem.setPriceDetail(JSONUtil.toJsonStr(priceDetailDTO)); + countUpdatePrice = CurrencyUtil.add(countUpdatePrice, priceDetailDTO.getUpdatePrice()); } - - //获取订单货物占订单金额的百分比 - Double priceFluctuationRatio = CurrencyUtil.div(priceDetailDTO.getOriginalPrice(), order.getPriceDetailDTO().getOriginalPrice()); - - //计算修改后的订单货物金额 - double flowPrice = CurrencyUtil.mul(order.getFlowPrice(), priceFluctuationRatio); - - // 记录修改金额 - priceDetailDTO.setUpdatePrice(CurrencyUtil.sub(priceDetailDTO.getOriginalPrice(), flowPrice)); - priceDetailDTO.setFlowPrice(flowPrice); - - //计算平台佣金=交易金额*分类佣金比例/100 - Double platFormCommission = CurrencyUtil.div(CurrencyUtil.mul(flowPrice, categoryService.getById(orderItem.getCategoryId()).getCommissionRate()), 100); - priceDetailDTO.setPlatFormCommission(platFormCommission); - - // 最终结算金额 = 流水金额-平台佣金-分销提佣 - double billPrice = CurrencyUtil.sub(CurrencyUtil.sub(priceDetailDTO.getFlowPrice(),priceDetailDTO.getPlatFormCommission()), - priceDetailDTO.getDistributionCommission()); - priceDetailDTO.setBillPrice(billPrice); - - //修改订单货物金额 - orderItem.setFlowPrice(flowPrice); - orderItem.setPriceDetail(JSONUtil.toJsonStr(priceDetailDTO)); - orderItemService.update(orderItem, new LambdaUpdateWrapper().eq(OrderItem::getId, orderItem.getId())); } + orderItemService.updateBatchById(orderItems); + } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java index 297e3c8c..9af389f3 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java @@ -2,170 +2,281 @@ package cn.lili.modules.order.order.serviceimpl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.json.JSONUtil; -import cn.lili.common.aop.syslog.annotation.SystemLogPoint; -import cn.lili.common.delayqueue.DelayQueueTools; -import cn.lili.common.delayqueue.DelayQueueType; -import cn.lili.common.delayqueue.PintuanOrderMessage; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.GoodsTagsEnum; -import cn.lili.common.rocketmq.tags.MqOrderTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.model.TimeExecuteConstant; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import cn.lili.common.utils.*; -import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; -import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.common.utils.SnowFlake; import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage; -import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; import cn.lili.modules.member.entity.dto.MemberAddressDTO; +import cn.lili.modules.member.service.StoreLogisticsService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.order.aop.OrderLogPoint; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.dos.OrderItem; -import cn.lili.modules.order.order.entity.dos.Receipt; +import cn.lili.modules.order.order.entity.dos.*; +import cn.lili.modules.order.order.entity.dto.OrderBatchDeliverDTO; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.dto.OrderSearchParams; -import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.order.order.entity.enums.*; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; import cn.lili.modules.order.order.entity.vo.OrderVO; +import cn.lili.modules.order.order.entity.vo.PaymentLog; import cn.lili.modules.order.order.mapper.OrderItemMapper; import cn.lili.modules.order.order.mapper.OrderMapper; -import cn.lili.modules.order.order.service.OrderItemService; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.order.order.service.ReceiptService; -import cn.lili.modules.order.order.service.StoreFlowService; +import cn.lili.modules.order.order.service.*; import cn.lili.modules.order.trade.entity.dos.OrderLog; import cn.lili.modules.order.trade.service.OrderLogService; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.service.PintuanService; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.util.StatisticsDateUtil; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; +import cn.lili.modules.store.service.StoreDetailService; +import cn.lili.modules.system.aspect.annotation.SystemLogPoint; import cn.lili.modules.system.entity.dos.Logistics; +import cn.lili.modules.system.entity.dto.LogisticsSetting; import cn.lili.modules.system.entity.vo.Traces; import cn.lili.modules.system.service.LogisticsService; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; +import cn.lili.rocketmq.tags.OrderTagsEnum; +import cn.lili.trigger.enums.DelayTypeEnums; +import cn.lili.trigger.interfaces.TimeTrigger; +import cn.lili.trigger.message.PintuanOrderMessage; +import cn.lili.trigger.model.TimeExecuteConstant; +import cn.lili.trigger.model.TimeTriggerMsg; +import cn.lili.trigger.util.DelayQueueTools; +import com.baomidou.mybatisplus.core.conditions.Wrapper; 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.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.*; +import java.util.stream.Collectors; /** * 子订单业务层实现 * * @author Chopper - * @date 2020/11/17 7:38 下午 + * @since 2020/11/17 7:38 下午 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Slf4j public class OrderServiceImpl extends ServiceImpl implements OrderService { private static final String ORDER_SN_COLUMN = "order_sn"; - //订单数据层 - private final OrderMapper orderMapper; - - //延时任务 - private final TimeTrigger timeTrigger; - - //订单货物数据层 - private final OrderItemMapper orderItemMapper; - //发票 + /** + * 延时任务 + */ + @Autowired + private TimeTrigger timeTrigger; + /** + * 订单货物数据层 + */ + @Resource + private OrderItemMapper orderItemMapper; + /** + * 发票 + */ @Autowired private ReceiptService receiptService; - //订单货物 + /** + * 订单货物 + */ @Autowired private OrderItemService orderItemService; - //物流公司 + /** + * 物流公司 + */ @Autowired private LogisticsService logisticsService; - //订单日志 + /** + * 订单日志 + */ @Autowired private OrderLogService orderLogService; - //RocketMQ + /** + * RocketMQ + */ @Autowired private RocketMQTemplate rocketMQTemplate; - //RocketMQ配置 + /** + * RocketMQ配置 + */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; - //订单流水 + /** + * 订单流水 + */ @Autowired private StoreFlowService storeFlowService; - //拼团 + /** + * 拼团 + */ @Autowired private PintuanService pintuanService; - //规格商品 + @Autowired - private GoodsSkuService goodsSkuService; + private TradeService tradeService; + + + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + + @Autowired + private StoreDetailService storeDetailService; @Override + @Transactional(rollbackFor = Exception.class) public void intoDB(TradeDTO tradeDTO) { + //检查TradeDTO信息 + checkTradeDTO(tradeDTO); + //存放购物车,即业务中的订单 List orders = new ArrayList<>(tradeDTO.getCartList().size()); + //存放自订单/订单日志 List orderItems = new ArrayList<>(); List orderLogs = new ArrayList<>(); - if (tradeDTO.getParentOrderSn() != null) { - Order parentOrder = this.getBySn(tradeDTO.getParentOrderSn()); - if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { - throw new ServiceException("不能参与自己发起的拼团活动!"); - } - } - List list = new ArrayList<>(); + + //订单集合 + List orderVOS = new ArrayList<>(); + //循环购物车 tradeDTO.getCartList().forEach(item -> { + //当前购物车订单子项 + List currentOrderItems = new ArrayList<>(); Order order = new Order(item, tradeDTO); - if (OrderTypeEnum.PINTUAN.name().equals(order.getOrderType())) { - Pintuan pintuan = pintuanService.getPintuanById(order.getPromotionId()); - Integer limitNum = pintuan.getLimitNum(); - if (limitNum != 0 && order.getGoodsNum() > limitNum) { - throw new ServiceException("购买数量超过拼团活动限制数量"); - } - } //构建orderVO对象 OrderVO orderVO = new OrderVO(); BeanUtil.copyProperties(order, orderVO); + //持久化DO orders.add(order); String message = "订单[" + item.getSn() + "]创建"; + //记录日志 orderLogs.add(new OrderLog(item.getSn(), UserContext.getCurrentUser().getId(), UserContext.getCurrentUser().getRole().getRole(), UserContext.getCurrentUser().getUsername(), message)); - item.getSkuList().forEach( - sku -> orderItems.add(new OrderItem(sku, item, tradeDTO)) + item.getCheckedSkuList().forEach( + sku -> { + orderItems.add(new OrderItem(sku, item, tradeDTO)); + currentOrderItems.add(new OrderItem(sku, item, tradeDTO)); + } ); - orderVO.setOrderItems(orderItems); - list.add(orderVO); + //写入子订单信息 + orderVO.setOrderItems(currentOrderItems); + //orderVO 记录 + orderVOS.add(orderVO); }); - tradeDTO.setOrderVO(list); + tradeDTO.setOrderVO(orderVOS); //批量保存订单 this.saveBatch(orders); //批量保存 子订单 orderItemService.saveBatch(orderItems); - // 批量记录订单操作日志 + //批量记录订单操作日志 orderLogService.saveBatch(orderLogs); - // 赠品根据店铺单独生成订单 - this.generatorGiftOrder(tradeDTO); } @Override public IPage queryByParams(OrderSearchParams orderSearchParams) { - return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), orderSearchParams.queryWrapper()); + QueryWrapper queryWrapper = orderSearchParams.queryWrapper(); + queryWrapper.groupBy("o.id"); + queryWrapper.orderByDesc("o.id"); + return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), queryWrapper); + } + + /** + * 订单信息 + * + * @param orderSearchParams 查询参数 + * @return 订单信息 + */ + @Override + public List queryListByParams(OrderSearchParams orderSearchParams) { + return this.baseMapper.queryListByParams(orderSearchParams.queryWrapper()); + } + + /** + * 根据促销查询订单 + * + * @param orderPromotionType 订单类型 + * @param payStatus 支付状态 + * @param parentOrderSn 依赖订单编号 + * @param orderSn 订单编号 + * @return 订单信息 + */ + @Override + public List queryListByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + //查找团长订单和已和当前拼团订单拼团的订单 + queryWrapper.eq(Order::getOrderPromotionType, orderPromotionType) + .eq(Order::getPayStatus, payStatus) + .and(i -> i.eq(Order::getParentOrderSn, parentOrderSn).or(j -> j.eq(Order::getSn, orderSn))); + return this.list(queryWrapper); + } + + /** + * 根据促销查询订单 + * + * @param orderPromotionType 订单类型 + * @param payStatus 支付状态 + * @param parentOrderSn 依赖订单编号 + * @param orderSn 订单编号 + * @return 订单信息 + */ + @Override + public long queryCountByPromotion(String orderPromotionType, String payStatus, String parentOrderSn, String orderSn) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + //查找团长订单和已和当前拼团订单拼团的订单 + queryWrapper.eq(Order::getOrderPromotionType, orderPromotionType) + .eq(Order::getPayStatus, payStatus) + .and(i -> i.eq(Order::getParentOrderSn, parentOrderSn).or(j -> j.eq(Order::getSn, orderSn))); + return this.count(queryWrapper); + } + + /** + * 父级拼团订单 + * + * @param pintuanId 拼团id + * @return 拼团订单信息 + */ + @Override + public List queryListByPromotion(String pintuanId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()); + queryWrapper.eq(Order::getPromotionId, pintuanId); + queryWrapper.nested(i -> i.eq(Order::getPayStatus, PayStatusEnum.PAID.name()).or(j -> j.eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()))); + return this.list(queryWrapper); + } + + @Override + public List queryExportOrder(OrderSearchParams orderSearchParams) { + return this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper()); } @Override @@ -188,35 +299,44 @@ public class OrderServiceImpl extends ServiceImpl implements @Override @OrderLogPoint(description = "'订单['+#orderSn+']取消,原因为:'+#reason", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) public Order cancel(String orderSn, String reason) { Order order = OperationalJudgment.judgment(this.getBySn(orderSn)); - if (order.getOrderType().equals(OrderTypeEnum.PINTUAN.name()) && !order.getOrderStatus().equals(OrderStatusEnum.UNDELIVERED.name())) { - throw new ServiceException("未成团订单不可取消"); + //如果订单促销类型不为空&&订单是拼团订单,并且订单未成团,则抛出异常 + if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderPromotionType()) + && !CharSequenceUtil.equalsAny(order.getOrderStatus(), OrderStatusEnum.UNDELIVERED.name(), OrderStatusEnum.STAY_PICKED_UP.name())) { + throw new ServiceException(ResultCode.ORDER_CAN_NOT_CANCEL); } if (CharSequenceUtil.equalsAny(order.getOrderStatus(), OrderStatusEnum.UNDELIVERED.name(), OrderStatusEnum.UNPAID.name(), + OrderStatusEnum.STAY_PICKED_UP.name(), OrderStatusEnum.PAID.name())) { order.setOrderStatus(OrderStatusEnum.CANCELLED.name()); order.setCancelReason(reason); //修改订单 this.updateById(order); + //生成店铺退款流水 + this.generatorStoreRefundFlow(order); orderStatusMessage(order); return order; } else { - throw new ServiceException("当前订单状态不可取消"); + throw new ServiceException(ResultCode.ORDER_CAN_NOT_CANCEL); } } @Override @OrderLogPoint(description = "'订单['+#orderSn+']系统取消,原因为:'+#reason", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) public void systemCancel(String orderSn, String reason) { Order order = this.getBySn(orderSn); order.setOrderStatus(OrderStatusEnum.CANCELLED.name()); order.setCancelReason(reason); this.updateById(order); + //生成店铺退款流水 + this.generatorStoreRefundFlow(order); orderStatusMessage(order); } @@ -228,17 +348,18 @@ public class OrderServiceImpl extends ServiceImpl implements */ @Override public Order getBySn(String orderSn) { - QueryWrapper orderWrapper = new QueryWrapper<>(); - orderWrapper.eq("sn", orderSn); - return this.getOne(orderWrapper); + return this.getOne(new LambdaQueryWrapper().eq(Order::getSn, orderSn)); } + @Override + @Transactional(rollbackFor = Exception.class) public void payOrder(String orderSn, String paymentMethod, String receivableNo) { Order order = this.getBySn(orderSn); //如果订单已支付,就不能再次进行支付 if (order.getPayStatus().equals(PayStatusEnum.PAID.name())) { + log.error("订单[ {} ]检测到重复付款,请处理", orderSn); throw new ServiceException(ResultCode.PAY_DOUBLE_ERROR); } @@ -248,11 +369,13 @@ public class OrderServiceImpl extends ServiceImpl implements order.setPayStatus(PayStatusEnum.PAID.name()); order.setOrderStatus(OrderStatusEnum.PAID.name()); order.setReceivableNo(receivableNo); + order.setCanReturn(!PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); this.updateById(order); - //记录订单流水 + //记录店铺订单支付流水 storeFlowService.payOrder(orderSn); + //发送订单已付款消息 OrderMessage orderMessage = new OrderMessage(); orderMessage.setOrderSn(order.getSn()); orderMessage.setPaymentMethod(paymentMethod); @@ -260,84 +383,42 @@ public class OrderServiceImpl extends ServiceImpl implements this.sendUpdateStatusMessage(orderMessage); String message = "订单付款,付款方式[" + PaymentMethodEnum.valueOf(paymentMethod).paymentName() + "]"; - OrderLog orderLog = new OrderLog(orderSn, "-1", UserEnums.SYSTEM.name(), "系统操作", message); + OrderLog orderLog = new OrderLog(orderSn, "-1", UserEnums.SYSTEM.getRole(), "系统操作", message); orderLogService.save(orderLog); - } @Override @OrderLogPoint(description = "'库存确认'", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) public void afterOrderConfirm(String orderSn) { Order order = this.getBySn(orderSn); - LambdaUpdateWrapper orderLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); - - //如果为虚拟订单-修改订单状态为待核验 - if (order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name())) { - //填写提货码 - String code = CommonUtil.getRandomNum(); - orderLambdaUpdateWrapper.eq(Order::getSn, orderSn); - orderLambdaUpdateWrapper.set(Order::getQrCode, code); - orderLambdaUpdateWrapper.set(Order::getOrderStatus, OrderStatusEnum.TAKE.name()); - orderLambdaUpdateWrapper.set(Order::getCanReturn, !PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); - - this.update(orderLambdaUpdateWrapper); - - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setNewStatus(OrderStatusEnum.TAKE); - orderMessage.setOrderSn(order.getSn()); - this.sendUpdateStatusMessage(orderMessage); - } - //如果为商品订单-修改订单状态为待发货 - else { - orderLambdaUpdateWrapper.eq(Order::getSn, orderSn); - //拼团订单 - if (order.getOrderType().equals(OrderTypeEnum.PINTUAN.name()) && order.getPromotionId() != null) { - //校验拼团是否成团 对拼团结果进行处理 - this.checkPintuanOrder(order.getPromotionId(), order.getParentOrderSn()); + //判断是否为拼团订单,进行特殊处理 + //判断订单类型进行不同的订单确认操作 + if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderPromotionType())) { + String parentOrderSn = CharSequenceUtil.isEmpty(order.getParentOrderSn()) ? orderSn : order.getParentOrderSn(); + this.checkPintuanOrder(order.getPromotionId(), parentOrderSn); + } else { + //判断订单类型 + if (order.getOrderType().equals(OrderTypeEnum.NORMAL.name())) { + normalOrderConfirm(orderSn); } else { - //普通订单直接修改为代发货状态 - orderLambdaUpdateWrapper.set(Order::getOrderStatus, OrderStatusEnum.UNDELIVERED.name()); - orderLambdaUpdateWrapper.set(Order::getCanReturn, !PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); - this.update(orderLambdaUpdateWrapper); - - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setNewStatus(OrderStatusEnum.UNDELIVERED); - orderMessage.setOrderSn(order.getSn()); - this.sendUpdateStatusMessage(orderMessage); + virtualOrderConfirm(orderSn); } } - - // 发送当前商品购买完成的信息(用于更新商品数据) - List orderItems = orderItemService.getByOrderSn(orderSn); - List goodsCompleteMessageList = new ArrayList<>(); - for (OrderItem orderItem : orderItems) { - GoodsCompleteMessage goodsCompleteMessage = new GoodsCompleteMessage(); - goodsCompleteMessage.setGoodsId(orderItem.getGoodsId()); - goodsCompleteMessage.setSkuId(orderItem.getSkuId()); - goodsCompleteMessage.setBuyNum(orderItem.getNum()); - goodsCompleteMessage.setMemberId(order.getMemberId()); - goodsCompleteMessageList.add(goodsCompleteMessage); - } - if (!goodsCompleteMessageList.isEmpty()) { - String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.BUY_GOODS_COMPLETE.name(); - //发送订单变更mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsCompleteMessageList), RocketmqSendCallbackBuilder.commonCallback()); - } - - } @Override @SystemLogPoint(description = "修改订单", customerLog = "'订单[' + #orderSn + ']收货信息修改,修改为'+#memberAddressDTO.consigneeDetail+'") + @Transactional(rollbackFor = Exception.class) public Order updateConsignee(String orderSn, MemberAddressDTO memberAddressDTO) { Order order = OperationalJudgment.judgment(this.getBySn(orderSn)); //要记录之前的收货地址,所以需要以代码方式进行调用 不采用注解 String message = "订单[" + orderSn + "]收货信息修改,由[" + order.getConsigneeDetail() + "]修改为[" + memberAddressDTO.getConsigneeDetail() + "]"; - - BeanUtil.copyProperties(memberAddressDTO, order);// 记录订单操作日志 + //记录订单操作日志 + BeanUtil.copyProperties(memberAddressDTO, order); this.updateById(order); OrderLog orderLog = new OrderLog(orderSn, UserContext.getCurrentUser().getId(), UserContext.getCurrentUser().getRole().getRole(), UserContext.getCurrentUser().getUsername(), message); @@ -348,6 +429,7 @@ public class OrderServiceImpl extends ServiceImpl implements @Override @OrderLogPoint(description = "'订单['+#orderSn+']发货,发货单号['+#logisticsNo+']'", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) public Order delivery(String orderSn, String logisticsNo, String logisticsId) { Order order = OperationalJudgment.judgment(this.getBySn(orderSn)); //如果订单未发货,并且订单状态值等于待发货 @@ -366,8 +448,6 @@ public class OrderServiceImpl extends ServiceImpl implements this.updateById(order); //修改订单状态为已发送 this.updateStatus(orderSn, OrderStatusEnum.DELIVERED); - - //修改订单货物可以进行售后、投诉 orderItemService.update(new UpdateWrapper().eq(ORDER_SN_COLUMN, orderSn) .set("after_sale_status", OrderItemAfterSaleStatusEnum.NOT_APPLIED) @@ -377,66 +457,132 @@ public class OrderServiceImpl extends ServiceImpl implements orderMessage.setNewStatus(OrderStatusEnum.DELIVERED); orderMessage.setOrderSn(order.getSn()); this.sendUpdateStatusMessage(orderMessage); - - } else { throw new ServiceException(ResultCode.ORDER_DELIVER_ERROR); } return order; } + @Override + @Transactional(rollbackFor = Exception.class) + public Order shunFengDelivery(String orderSn) { + OrderDetailVO orderDetailVO = this.queryDetail(orderSn); + String logisticsNo = logisticsService.sfCreateOrder(orderDetailVO); + Logistics logistics = logisticsService.getOne(new LambdaQueryWrapper().eq(Logistics::getCode,"SF")); + return delivery(orderSn,logisticsNo,logistics.getId()); + } + @Override public Traces getTraces(String orderSn) { //获取订单信息 Order order = this.getBySn(orderSn); //获取踪迹信息 - return logisticsService.getLogistic(order.getLogisticsCode(), order.getLogisticsNo()); + return logisticsService.getLogisticTrack(order.getLogisticsCode(), order.getLogisticsNo(), order.getConsigneeMobile()); } @Override - @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#qrCode+']'", orderSn = "#orderSn") - public Order take(String orderSn, String qrCode) { - //是否可以查询到订单 - Order order = OperationalJudgment.judgment(this.getBySn(orderSn)); - //判断是否为虚拟订单 - if (!order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name())) { - throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); - } - //判断虚拟订单状态 - if (order.getOrderStatus().equals(OrderStatusEnum.TAKE.name())) { - //判断提货码是否正确\修改订单状态 - if (order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()) && qrCode.equals(order.getQrCode())) { - order.setOrderStatus(OrderStatusEnum.COMPLETED.name()); + public Traces getMapTraces(String orderSn) { + //获取订单信息 + Order order = this.getBySn(orderSn); + //获取店家信息 + StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDTO = storeDetailService.getStoreDeliverGoodsAddressDto(order.getStoreId()); + String from = storeDeliverGoodsAddressDTO.getSalesConsignorAddressPath().substring(0, storeDeliverGoodsAddressDTO.getSalesConsignorAddressPath().indexOf(",") - 1); + String to = order.getConsigneeAddressPath().substring(0, order.getConsigneeAddressPath().indexOf(",") - 1); + //获取踪迹信息 + return logisticsService.getLogisticMapTrack(order.getLogisticsCode(), order.getLogisticsNo(), order.getConsigneeMobile(), from, to); + } - this.updateById(order); + @Override + @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#verificationCode+']'", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) + public Order take(String orderSn, String verificationCode) { - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setNewStatus(OrderStatusEnum.COMPLETED); - orderMessage.setOrderSn(order.getSn()); - this.sendUpdateStatusMessage(orderMessage); - } - return order; + //获取订单信息 + Order order = this.getBySn(orderSn); + //检测虚拟订单信息 + checkVerificationOrder(order, verificationCode); + order.setOrderStatus(OrderStatusEnum.COMPLETED.name()); + //订单完成 + this.complete(orderSn); + return order; + } + + @Override + public Order take(String verificationCode) { + String storeId = OperationalJudgment.judgment(UserContext.getCurrentUser()).getStoreId(); + Order order = this.getOne(new LambdaQueryWrapper().eq(Order::getVerificationCode, verificationCode).eq(Order::getStoreId, storeId)); + if (order == null) { + throw new ServiceException(ResultCode.ORDER_NOT_EXIST); } - throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + order.setOrderStatus(OrderStatusEnum.COMPLETED.name()); + //订单完成 + this.complete(order.getSn()); + return order; + } + + @Override + public Order getOrderByVerificationCode(String verificationCode) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return this.getOne(new LambdaQueryWrapper() + .in(Order::getOrderStatus, OrderStatusEnum.TAKE.name(), OrderStatusEnum.STAY_PICKED_UP.name()) + .eq(Order::getStoreId, storeId) + .eq(Order::getVerificationCode, verificationCode)); } @Override @OrderLogPoint(description = "'订单['+#orderSn+']完成'", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) public void complete(String orderSn) { //是否可以查询到订单 Order order = OperationalJudgment.judgment(this.getBySn(orderSn)); + complete(order, orderSn); + } - //修改订单状态为完成 + @Override + @OrderLogPoint(description = "'订单['+#orderSn+']完成'", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) + public void systemComplete(String orderSn) { + Order order = this.getBySn(orderSn); + complete(order, orderSn); + } + + /** + * 完成订单方法封装 + * + * @param order 订单 + * @param orderSn 订单编号 + */ + @Transactional(rollbackFor = Exception.class) + public void complete(Order order, String orderSn) {//修改订单状态为完成 this.updateStatus(orderSn, OrderStatusEnum.COMPLETED); //修改订单货物可以进行评价 orderItemService.update(new UpdateWrapper().eq(ORDER_SN_COLUMN, orderSn) .set("comment_status", CommentStatusEnum.UNFINISHED)); + this.update(new LambdaUpdateWrapper().eq(Order::getSn, orderSn).set(Order::getCompleteTime, new Date())); //发送订单状态改变消息 OrderMessage orderMessage = new OrderMessage(); orderMessage.setNewStatus(OrderStatusEnum.COMPLETED); orderMessage.setOrderSn(order.getSn()); this.sendUpdateStatusMessage(orderMessage); + + //发送当前商品购买完成的信息(用于更新商品数据) + List orderItems = orderItemService.getByOrderSn(orderSn); + List goodsCompleteMessageList = new ArrayList<>(); + for (OrderItem orderItem : orderItems) { + GoodsCompleteMessage goodsCompleteMessage = new GoodsCompleteMessage(); + goodsCompleteMessage.setGoodsId(orderItem.getGoodsId()); + goodsCompleteMessage.setSkuId(orderItem.getSkuId()); + goodsCompleteMessage.setBuyNum(orderItem.getNum()); + goodsCompleteMessage.setMemberId(order.getMemberId()); + goodsCompleteMessageList.add(goodsCompleteMessage); + } + //发送商品购买消息 + if (!goodsCompleteMessageList.isEmpty()) { + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.BUY_GOODS_COMPLETE.name(); + //发送订单变更mq消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsCompleteMessageList), RocketmqSendCallbackBuilder.commonCallback()); + } } @Override @@ -446,13 +592,13 @@ public class OrderServiceImpl extends ServiceImpl implements } @Override + @Transactional(rollbackFor = Exception.class) public void sendUpdateStatusMessage(OrderMessage orderMessage) { - String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.STATUS_CHANGE.name(); - //发送订单变更mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback()); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("发送订单变更mq消息", rocketmqCustomProperties.getOrderTopic(), OrderTagsEnum.STATUS_CHANGE.name(), JSONUtil.toJsonStr(orderMessage))); } @Override + @Transactional(rollbackFor = Exception.class) public void deleteOrder(String sn) { Order order = this.getBySn(sn); if (order == null) { @@ -467,21 +613,6 @@ public class OrderServiceImpl extends ServiceImpl implements this.orderItemService.update(orderItemLambdaUpdateWrapper); } - @Override - public IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { - - QueryWrapper queryWrapper = new QueryWrapper<>(); - Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); - queryWrapper.between("o.create_time", dates[0], dates[1]); - queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()), - "o.store_id", statisticsQueryParam.getStoreId()); - - queryWrapper.eq("o.delete_flag", false); - queryWrapper.groupBy("o.id"); - queryWrapper.orderByDesc("o.id"); - return orderMapper.queryByParams(PageUtil.initPage(pageVO), queryWrapper); - } - @Override public Boolean invoice(String sn) { //根据订单号查询发票信息 @@ -501,31 +632,238 @@ public class OrderServiceImpl extends ServiceImpl implements * @param parentOrderSn 拼团订单sn */ @Override + @Transactional(rollbackFor = Exception.class) public void agglomeratePintuanOrder(String pintuanId, String parentOrderSn) { //获取拼团配置 - Pintuan pintuan = pintuanService.getPintuanById(pintuanId); + Pintuan pintuan = pintuanService.getById(pintuanId); List list = this.getPintuanOrder(pintuanId, parentOrderSn); if (Boolean.TRUE.equals(pintuan.getFictitious()) && pintuan.getRequiredNum() > list.size()) { - // 如果开启虚拟成团且当前订单数量不足成团数量,则认为拼团成功 + //如果开启虚拟成团且当前订单数量不足成团数量,则认为拼团成功 this.pintuanOrderSuccess(list); } else if (Boolean.FALSE.equals(pintuan.getFictitious()) && pintuan.getRequiredNum() > list.size()) { - // 如果未开启虚拟成团且当前订单数量不足成团数量,则认为拼团失败 + //如果未开启虚拟成团且当前订单数量不足成团数量,则认为拼团失败 this.pintuanOrderFailed(list); } } + @Override + public void getBatchDeliverList(HttpServletResponse response, List logisticsName) { + ExcelWriter writer = ExcelUtil.getWriter(); + //Excel 头部 + ArrayList rows = new ArrayList<>(); + rows.add("订单编号"); + rows.add("物流公司"); + rows.add("物流编号"); + writer.writeHeadRow(rows); + + //存放下拉列表 ----店铺已选择物流公司列表 + String[] logiList = logisticsName.toArray(new String[]{}); + CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 200, 1, 1); + writer.addSelect(cellRangeAddressList, logiList); + + ServletOutputStream out = null; + try { + //设置公共属性,列表名称 + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("批量发货导入模板", "UTF8") + ".xls"); + out = response.getOutputStream(); + writer.flush(out, true); + } catch (Exception e) { + log.error("获取待发货订单编号列表错误", e); + } finally { + writer.close(); + IoUtil.close(out); + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchDeliver(MultipartFile files) { + + InputStream inputStream; + List orderBatchDeliverDTOList = new ArrayList<>(); + try { + inputStream = files.getInputStream(); + //2.应用HUtool ExcelUtil获取ExcelReader指定输入流和sheet + ExcelReader excelReader = ExcelUtil.getReader(inputStream); + //可以加上表头验证 + //3.读取第二行到最后一行数据 + List> read = excelReader.read(1, excelReader.getRowCount()); + for (List objects : read) { + OrderBatchDeliverDTO orderBatchDeliverDTO = new OrderBatchDeliverDTO(); + orderBatchDeliverDTO.setOrderSn(objects.get(0).toString()); + orderBatchDeliverDTO.setLogisticsName(objects.get(1).toString()); + orderBatchDeliverDTO.setLogisticsNo(objects.get(2).toString()); + orderBatchDeliverDTOList.add(orderBatchDeliverDTO); + } + } catch (Exception e) { + throw new ServiceException(ResultCode.ORDER_BATCH_DELIVER_ERROR); + } + //循环检查是否符合规范 + checkBatchDeliver(orderBatchDeliverDTOList); + //订单批量发货 + for (OrderBatchDeliverDTO orderBatchDeliverDTO : orderBatchDeliverDTOList) { + this.delivery(orderBatchDeliverDTO.getOrderSn(), orderBatchDeliverDTO.getLogisticsNo(), orderBatchDeliverDTO.getLogisticsId()); + } + } + + + @Override + public Double getPaymentTotal(String orderSn) { + Order order = this.getBySn(orderSn); + Trade trade = tradeService.getBySn(order.getTradeSn()); + //如果交易不为空,则返回交易的金额,否则返回订单金额 + if (CharSequenceUtil.isNotEmpty(trade.getPayStatus()) + && trade.getPayStatus().equals(PayStatusEnum.PAID.name())) { + return trade.getFlowPrice(); + } + return order.getFlowPrice(); + } + + @Override + public IPage queryPaymentLogs(IPage page, Wrapper queryWrapper) { + return baseMapper.queryPaymentLogs(page, queryWrapper); + } + + /** + * 循环检查批量发货订单列表 + * + * @param list 待发货订单列表 + */ + private void checkBatchDeliver(List list) { + + List logistics = logisticsService.list(); + for (OrderBatchDeliverDTO orderBatchDeliverDTO : list) { + //查看订单号是否存在-是否是当前店铺的订单 + Order order = this.getOne(new LambdaQueryWrapper() + .eq(Order::getStoreId, UserContext.getCurrentUser().getStoreId()) + .eq(Order::getSn, orderBatchDeliverDTO.getOrderSn())); + if (order == null) { + throw new ServiceException("订单编号:'" + orderBatchDeliverDTO.getOrderSn() + " '不存在"); + } else if (!order.getOrderStatus().equals(OrderStatusEnum.UNDELIVERED.name())) { + throw new ServiceException("订单编号:'" + orderBatchDeliverDTO.getOrderSn() + " '不能发货"); + } + //获取物流公司 + logistics.forEach(item -> { + if (item.getName().equals(orderBatchDeliverDTO.getLogisticsName())) { + orderBatchDeliverDTO.setLogisticsId(item.getId()); + } + }); + if (CharSequenceUtil.isEmpty(orderBatchDeliverDTO.getLogisticsId())) { + throw new ServiceException("物流公司:'" + orderBatchDeliverDTO.getLogisticsName() + " '不存在"); + } + } + + + } + + /** + * 检查是否开始虚拟成团 + * + * @param pintuanId 拼团活动id + * @param requiredNum 成团人数 + * @param fictitious 是否开启成团 + * @return 是否成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean checkFictitiousOrder(String pintuanId, Integer requiredNum, Boolean fictitious) { + Map> collect = this.queryListByPromotion(pintuanId) + .stream().collect(Collectors.groupingBy(Order::getParentOrderSn)); + + for (Map.Entry> entry : collect.entrySet()) { + //是否开启虚拟成团 + if (Boolean.FALSE.equals(fictitious) && CharSequenceUtil.isNotEmpty(entry.getKey()) && entry.getValue().size() < requiredNum) { + //如果未开启虚拟成团且已参团人数小于成团人数,则自动取消订单 + String reason = "拼团活动结束订单未付款,系统自动取消订单"; + if (CharSequenceUtil.isNotEmpty(entry.getKey())) { + this.systemCancel(entry.getKey(), reason); + } else { + for (Order order : entry.getValue()) { + this.systemCancel(order.getSn(), reason); + } + } + } else if (Boolean.TRUE.equals(fictitious)) { + this.fictitiousPintuan(entry, requiredNum); + } + } + return false; + } + + /** + * 虚拟成团 + * + * @param entry 订单列表 + * @param requiredNum 必须参团人数 + */ + private void fictitiousPintuan(Map.Entry> entry, Integer requiredNum) { + Map> listMap = entry.getValue().stream().collect(Collectors.groupingBy(Order::getPayStatus)); + //未付款订单 + List unpaidOrders = listMap.get(PayStatusEnum.UNPAID.name()); + //未付款订单自动取消 + if (unpaidOrders != null && !unpaidOrders.isEmpty()) { + for (Order unpaidOrder : unpaidOrders) { + this.systemCancel(unpaidOrder.getSn(), "拼团活动结束订单未付款,系统自动取消订单"); + } + } + List paidOrders = listMap.get(PayStatusEnum.PAID.name()); + //如待参团人数大于0,并已开启虚拟成团 + if (!paidOrders.isEmpty()) { + //待参团人数 + int waitNum = requiredNum - paidOrders.size(); + //添加虚拟成团 + for (int i = 0; i < waitNum; i++) { + Order order = new Order(); + BeanUtil.copyProperties(paidOrders.get(0), order, "id", "sn"); + order.setSn(SnowFlake.createStr("G")); + order.setParentOrderSn(paidOrders.get(0).getParentOrderSn()); + order.setMemberId("-1"); + order.setMemberName("参团人员"); + order.setDeleteFlag(true); + this.save(order); + paidOrders.add(order); + } + for (Order paidOrder : paidOrders) { + paidOrder.setOrderStatus(OrderStatusEnum.UNDELIVERED.name()); + this.updateById(paidOrder); + orderStatusMessage(paidOrder); + } + } + } + /** * 订单状态变更消息 * - * @param order + * @param order 订单信息 */ - private void orderStatusMessage(Order order) { + @Transactional(rollbackFor = Exception.class) + public void orderStatusMessage(Order order) { OrderMessage orderMessage = new OrderMessage(); orderMessage.setOrderSn(order.getSn()); orderMessage.setNewStatus(OrderStatusEnum.valueOf(order.getOrderStatus())); this.sendUpdateStatusMessage(orderMessage); } + /** + * 生成店铺退款流水 + * + * @param order 订单信息 + */ + private void generatorStoreRefundFlow(Order order) { + // 判断订单是否是付款 + if (!PayStatusEnum.PAID.name().equals((order.getPayStatus()))) { + return; + } + List items = orderItemService.getByOrderSn(order.getSn()); + List storeFlows = new ArrayList<>(); + for (OrderItem item : items) { + StoreFlow storeFlow = new StoreFlow(order, item, FlowTypeEnum.REFUND); + storeFlows.add(storeFlow); + } + storeFlowService.saveBatch(storeFlows); + } + /** * 此方法只提供内部调用,调用前应该做好权限处理 * 修改订单状态 @@ -537,27 +875,33 @@ public class OrderServiceImpl extends ServiceImpl implements this.baseMapper.updateStatus(orderStatus.name(), orderSn); } + /** + * 检测拼团订单内容 + * 此方法用与订单确认 + * 判断拼团是否达到人数进行下一步处理 + * + * @param pintuanId 拼团活动ID + * @param parentOrderSn 拼团父订单编号 + */ private void checkPintuanOrder(String pintuanId, String parentOrderSn) { - //拼团有效参数判定 - if (CharSequenceUtil.isEmpty(parentOrderSn)) { - return; - } //获取拼团配置 - Pintuan pintuan = pintuanService.getPintuanById(pintuanId); + Pintuan pintuan = pintuanService.getById(pintuanId); List list = this.getPintuanOrder(pintuanId, parentOrderSn); int count = list.size(); if (count == 1) { - // 如果为开团订单,则发布一个一小时的延时任务,时间到达后,如果未成团则自动结束(未开启虚拟成团的情况下) + //如果为开团订单,则发布一个24小时的延时任务,时间到达后,如果未成团则自动结束(未开启虚拟成团的情况下) PintuanOrderMessage pintuanOrderMessage = new PintuanOrderMessage(); - long startTime = DateUtil.offsetHour(new Date(), 1).getTime(); + //开团结束时间 + long startTime = DateUtil.offsetHour(new Date(), 24).getTime(); pintuanOrderMessage.setOrderSn(parentOrderSn); pintuanOrderMessage.setPintuanId(pintuanId); TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, startTime, pintuanOrderMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PINTUAN_ORDER, (pintuanId + parentOrderSn)), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PINTUAN_ORDER, (pintuanId + parentOrderSn)), rocketmqCustomProperties.getPromotionTopic()); - this.timeTrigger.addDelay(timeTriggerMsg, cn.lili.common.utils.DateUtil.getDelayTime(startTime)); + + this.timeTrigger.addDelay(timeTriggerMsg); } //拼团所需人数,小于等于 参团后的人数,则说明成团,所有订单成团 if (pintuan.getRequiredNum() <= count) { @@ -576,9 +920,9 @@ public class OrderServiceImpl extends ServiceImpl implements //寻找拼团的所有订单 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Order::getPromotionId, pintuanId) - .eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) + .eq(Order::getOrderPromotionType, OrderPromotionTypeEnum.PINTUAN.name()) .eq(Order::getPayStatus, PayStatusEnum.PAID.name()); - // 拼团sn=开团订单sn 或者 参团订单的开团订单sn + //拼团sn=开团订单sn 或者 参团订单的开团订单sn queryWrapper.and(i -> i.eq(Order::getSn, parentOrderSn) .or(j -> j.eq(Order::getParentOrderSn, parentOrderSn))); //参团后的订单数(人数) @@ -587,16 +931,17 @@ public class OrderServiceImpl extends ServiceImpl implements /** * 根据提供的拼团订单列表更新拼团状态为拼团成功 + * 循环订单列表根据不同的订单类型进行确认订单 * - * @param list 需要更新拼团状态为成功的拼团订单列表 + * @param orderList 需要更新拼团状态为成功的拼团订单列表 */ - private void pintuanOrderSuccess(List list) { - for (Order order : list) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Order::getId, order.getId()); - updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.UNDELIVERED.name()); - updateWrapper.set(Order::getCanReturn, !PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); - this.update(updateWrapper); + private void pintuanOrderSuccess(List orderList) { + for (Order order : orderList) { + if (order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name())) { + this.virtualOrderConfirm(order.getSn()); + } else if (order.getOrderType().equals(OrderTypeEnum.NORMAL.name())) { + this.normalOrderConfirm(order.getSn()); + } } } @@ -607,106 +952,99 @@ public class OrderServiceImpl extends ServiceImpl implements */ private void pintuanOrderFailed(List list) { for (Order order : list) { -// LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); -// updateWrapper.eq(Order::getId, order.getId()); -// updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.CANCELLED.name()); -// updateWrapper.set(Order::getCancelReason, "拼团人数不足,拼团失败!"); -// this.update(updateWrapper); try { - this.cancel(order.getSn(), "拼团人数不足,拼团失败!"); + this.systemCancel(order.getSn(), "拼团人数不足,拼团失败!"); } catch (Exception e) { log.error("拼团订单取消失败", e); } } } + /** - * 生成赠品订单 + * 检查交易信息 * - * @param tradeDTO 生成订单所需参数 + * @param tradeDTO 交易DTO */ - private void generatorGiftOrder(TradeDTO tradeDTO) { - List orders = new ArrayList<>(tradeDTO.getCartList().size()); - List orderItems = new ArrayList<>(); - List orderLogs = new ArrayList<>(); - for (CartVO cartVO : tradeDTO.getCartList()) { - if (cartVO.getGiftList() != null && !cartVO.getGiftList().isEmpty()) { - Order order = new Order(); - PriceDetailDTO priceDetailDTO = new PriceDetailDTO(); - BeanUtil.copyProperties(cartVO, order, "id"); - BeanUtil.copyProperties(priceDetailDTO, order, "id"); - order.setSn(SnowFlake.createStr("G")); - order.setTradeSn(tradeDTO.getSn()); - order.setOrderType(OrderTypeEnum.GIFT.name()); - order.setOrderStatus(OrderStatusEnum.UNPAID.name()); - order.setPayStatus(PayStatusEnum.UNPAID.name()); - order.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); - order.setMemberId(tradeDTO.getMemberId()); - order.setMemberName(tradeDTO.getMemberName()); - order.setNeedReceipt(false); - order.setPriceDetailDTO(priceDetailDTO); - order.setClientType(tradeDTO.getClientType()); - - if (tradeDTO.getMemberAddress() != null) { - order.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath()); - order.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath()); - order.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail()); - order.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile()); - order.setConsigneeName(tradeDTO.getMemberAddress().getName()); - } - orders.add(order); - String message = "赠品订单[" + order.getSn() + "]创建"; - orderLogs.add(new OrderLog(order.getSn(), UserContext.getCurrentUser().getId(), UserContext.getCurrentUser().getRole().getRole(), UserContext.getCurrentUser().getUsername(), message)); - for (String giftGoodsId : cartVO.getGiftList()) { - GoodsSku goodsSkuByIdFromCache = goodsSkuService.getGoodsSkuByIdFromCache(giftGoodsId); - OrderItem orderItem = new OrderItem(); - BeanUtil.copyProperties(goodsSkuByIdFromCache, orderItem, "id"); - BeanUtil.copyProperties(priceDetailDTO, orderItem, "id"); - orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name()); - orderItem.setCommentStatus(CommentStatusEnum.NEW.name()); - orderItem.setComplainStatus(OrderComplaintStatusEnum.NEW.name()); - orderItem.setNum(cartVO.getGoodsNum()); - orderItem.setOrderSn(order.getSn()); - orderItem.setTradeSn(tradeDTO.getSn()); - orderItem.setImage(goodsSkuByIdFromCache.getThumbnail()); - orderItem.setGoodsName(goodsSkuByIdFromCache.getGoodsName()); - orderItem.setSkuId(goodsSkuByIdFromCache.getId()); - orderItem.setCategoryId(goodsSkuByIdFromCache.getCategoryPath().substring( - goodsSkuByIdFromCache.getCategoryPath().lastIndexOf(",") + 1 - )); - orderItem.setGoodsPrice(goodsSkuByIdFromCache.getPrice()); - orderItem.setPriceDetailDTO(priceDetailDTO); - orderItems.add(orderItem); - } - } - } - if (!orders.isEmpty()) { - this.saveBatch(orders); - orderItemService.saveBatch(orderItems); - orderLogService.saveBatch(orderLogs); - for (Order order : orders) { - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setOrderSn(order.getSn()); - orderMessage.setPaymentMethod(PaymentMethodEnum.BANK_TRANSFER.name()); - orderMessage.setNewStatus(OrderStatusEnum.PAID); - this.sendUpdateStatusMessage(orderMessage); + private void checkTradeDTO(TradeDTO tradeDTO) { + //检测是否为拼团订单 + if (tradeDTO.getParentOrderSn() != null) { + //判断用户不能参与自己发起的拼团活动 + Order parentOrder = this.getBySn(tradeDTO.getParentOrderSn()); + if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { + throw new ServiceException(ResultCode.PINTUAN_JOIN_ERROR); } } } - @Autowired - public void setStoreFlowService(StoreFlowService storeFlowService) { - this.storeFlowService = storeFlowService; + /** + * 普通商品订单确认 + * 修改订单状态为待发货 + * 发送订单状态变更消息 + * + * @param orderSn 订单编号 + */ + @Transactional(rollbackFor = Exception.class) + public void normalOrderConfirm(String orderSn) { + OrderStatusEnum orderStatusEnum = null; + Order order = this.getBySn(orderSn); + if (DeliveryMethodEnum.SELF_PICK_UP.name().equals(order.getDeliveryMethod())) { + orderStatusEnum = OrderStatusEnum.STAY_PICKED_UP; + } else if (DeliveryMethodEnum.LOGISTICS.name().equals(order.getDeliveryMethod())) { + orderStatusEnum = OrderStatusEnum.UNDELIVERED; + } + //修改订单 + this.update(new LambdaUpdateWrapper() + .eq(Order::getSn, orderSn) + .set(Order::getOrderStatus, orderStatusEnum.name())); + //修改订单 + OrderMessage orderMessage = new OrderMessage(); + orderMessage.setNewStatus(orderStatusEnum); + orderMessage.setOrderSn(orderSn); + this.sendUpdateStatusMessage(orderMessage); } - @Autowired - public void setPintuanService(PintuanService pintuanService) { - this.pintuanService = pintuanService; + /** + * 虚拟商品订单确认 + * 修改订单状态为待核验 + * 发送订单状态变更消息 + * + * @param orderSn 订单编号 + */ + @Transactional(rollbackFor = Exception.class) + public void virtualOrderConfirm(String orderSn) { + //修改订单 + this.update(new LambdaUpdateWrapper() + .eq(Order::getSn, orderSn) + .set(Order::getOrderStatus, OrderStatusEnum.TAKE.name())); + OrderMessage orderMessage = new OrderMessage(); + orderMessage.setNewStatus(OrderStatusEnum.TAKE); + orderMessage.setOrderSn(orderSn); + this.sendUpdateStatusMessage(orderMessage); } - @Autowired - private void setGoodsSkuService(GoodsSkuService goodsSkuService) { - this.goodsSkuService = goodsSkuService; + /** + * 检测虚拟订单信息 + * + * @param order 订单 + * @param verificationCode 验证码 + */ + private void checkVerificationOrder(Order order, String verificationCode) { + //判断查询是否可以查询到订单 + if (order == null) { + throw new ServiceException(ResultCode.ORDER_NOT_EXIST); + } + //判断是否为虚拟订单 或 自提订单 + if (!order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && !order.getDeliveryMethod().equals(DeliveryMethodEnum.SELF_PICK_UP.name())) { + throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + } + //判断虚拟订单状态 或 待自提 + if (!order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()) && !order.getOrderStatus().equals(OrderStatusEnum.STAY_PICKED_UP.name())) { + throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + } + //判断验证码是否正确 + if (!verificationCode.equals(order.getVerificationCode())) { + throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + } } - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java index 4c076927..6986fc56 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java @@ -2,42 +2,31 @@ package cn.lili.modules.order.order.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; +import cn.lili.mybatis.util.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.order.order.entity.dos.Receipt; import cn.lili.modules.order.order.entity.dto.OrderReceiptDTO; import cn.lili.modules.order.order.entity.dto.ReceiptSearchParams; -import cn.lili.modules.order.order.mapper.OrderItemMapper; import cn.lili.modules.order.order.mapper.ReceiptMapper; import cn.lili.modules.order.order.service.ReceiptService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 发票业务层实现 * * @author Bulbasaur - * @date 2020/11/17 7:38 下午 + * @since 2020/11/17 7:38 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ReceiptServiceImpl extends ServiceImpl implements ReceiptService { - //发票mapper - private final ReceiptMapper receiptMapper; - - @Override public IPage getReceiptData(ReceiptSearchParams searchParams, PageVO pageVO) { - return receiptMapper.getReceipt(PageUtil.initPage(pageVO), searchParams.wrapper()); + return this.baseMapper.getReceipt(PageUtil.initPage(pageVO), searchParams.wrapper()); } @Override @@ -64,7 +53,7 @@ public class ReceiptServiceImpl extends ServiceImpl impl this.save(receipt); return receipt; } - throw new ServiceException(ResultCode.ERROR); + return null; } @Override @@ -76,6 +65,6 @@ public class ReceiptServiceImpl extends ServiceImpl impl this.saveOrUpdate(receipt); return receipt; } - throw new ServiceException(ResultCode.ERROR); + throw new ServiceException(ResultCode.USER_RECEIPT_NOT_EXIST); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java index 8c7772ea..2616b74c 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java @@ -1,62 +1,71 @@ package cn.lili.modules.order.order.serviceimpl; -import cn.lili.common.utils.*; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.utils.SnowFlake; import cn.lili.common.vo.PageVO; -import cn.lili.modules.goods.service.CategoryService; -import cn.lili.modules.goods.service.GoodsService; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.OrderItem; import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO; import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; -import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.StoreFlowMapper; import cn.lili.modules.order.order.service.OrderItemService; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.StoreFlowService; import cn.lili.modules.payment.entity.RefundLog; -import cn.lili.modules.payment.service.PaymentService; import cn.lili.modules.payment.service.RefundLogService; +import cn.lili.modules.store.entity.dos.Bill; +import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO; +import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO; +import cn.lili.modules.store.service.BillService; +import cn.lili.mybatis.util.PageUtil; 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.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Date; import java.util.List; /** * 商家订单流水业务层实现 * * @author Chopper - * @date 2020/11/17 7:38 下午 + * @since 2020/11/17 7:38 下午 */ @Slf4j @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreFlowServiceImpl extends ServiceImpl implements StoreFlowService { - //商品 - private final GoodsService goodsService; - //商品分类 - private final CategoryService categoryService; - //订单 + /** + * 订单 + */ + @Autowired private OrderService orderService; - //订单货物 + /** + * 订单货物 + */ + @Autowired private OrderItemService orderItemService; - //退款日志 + /** + * 退款日志 + */ + @Autowired private RefundLogService refundLogService; - //支付日志 - private PaymentService paymentService; + @Autowired + private BillService billService; + + /** + * 店铺订单支付流水 + * + * @param orderSn 订单编号 + */ @Override public void payOrder(String orderSn) { //根据订单编号获取子订单列表 @@ -64,47 +73,20 @@ public class StoreFlowServiceImpl extends ServiceImpl sns = new ArrayList<>(); - sns.add(order.getSn()); - sns.add(order.getTradeSn()); - - //如果查询到多条支付记录,打印日志 - if (order.getPayStatus().equals(PayStatusEnum.PAID.name())) { - log.error("订单[{}]检测到重复付款,请处理", orderSn); - } //循环子订单记录流水 for (OrderItem item : orderItems) { - StoreFlow storeFlow = new StoreFlow(); - BeanUtil.copyProperties(item, storeFlow); - - //入账 - storeFlow.setId(SnowFlake.getIdStr()); - storeFlow.setFlowType(FlowTypeEnum.PAY.name()); - storeFlow.setSn(SnowFlake.createStr("SF")); - storeFlow.setOrderSn(item.getOrderSn()); - storeFlow.setOrderItemSn(item.getSn()); - storeFlow.setStoreId(order.getStoreId()); - storeFlow.setStoreName(order.getStoreName()); - storeFlow.setMemberId(order.getMemberId()); - storeFlow.setMemberName(order.getMemberName()); - storeFlow.setGoodsName(item.getGoodsName()); - - //计算平台佣金 - storeFlow.setFinalPrice(item.getPriceDetailDTO().getFlowPrice()); - storeFlow.setCommissionPrice(item.getPriceDetailDTO().getPlatFormCommission()); - storeFlow.setDistributionRebate(item.getPriceDetailDTO().getDistributionCommission()); - storeFlow.setBillPrice(item.getPriceDetailDTO().getBillPrice()); - - //添加支付方式 - storeFlow.setPaymentName(order.getPaymentMethod()); - //添加第三方支付流水号 - storeFlow.setTransactionId(order.getReceivableNo()); - + StoreFlow storeFlow = new StoreFlow(order, item, FlowTypeEnum.PAY); //添加付款交易流水 this.save(storeFlow); } } + + /** + * 店铺订单退款流水 + * + * @param afterSale 售后单 + */ @Override public void refundOrder(AfterSale afterSale) { StoreFlow storeFlow = new StoreFlow(); @@ -126,57 +108,107 @@ public class StoreFlowServiceImpl extends ServiceImpl().eq(StoreFlow::getOrderItemSn, afterSale.getOrderItemSn())); + StoreFlow payStoreFlow = this.getOne(new LambdaUpdateWrapper().eq(StoreFlow::getOrderItemSn, afterSale.getOrderItemSn()) + .eq(StoreFlow::getFlowType, FlowTypeEnum.PAY)); + //申请商品退款数量 storeFlow.setNum(afterSale.getNum()); + //分类ID storeFlow.setCategoryId(payStoreFlow.getCategoryId()); - //佣金 + //佣金 = (佣金/订单商品数量)* 售后商品数量 storeFlow.setCommissionPrice(CurrencyUtil.mul(CurrencyUtil.div(payStoreFlow.getCommissionPrice(), payStoreFlow.getNum()), afterSale.getNum())); - //分销佣金 + //分销佣金 =(分销佣金/订单商品数量)* 售后商品数量 storeFlow.setDistributionRebate(CurrencyUtil.mul(CurrencyUtil.div(payStoreFlow.getDistributionRebate(), payStoreFlow.getNum()), afterSale.getNum())); - //流水金额 - storeFlow.setFinalPrice(afterSale.getActualRefundPrice()); - //最终结算金额 - storeFlow.setBillPrice(CurrencyUtil.add(CurrencyUtil.add(storeFlow.getFinalPrice(), storeFlow.getDistributionRebate()), storeFlow.getCommissionPrice())); - //获取第三方支付流水号 - RefundLog refundLog = refundLogService.getOne(new LambdaQueryWrapper().eq(RefundLog::getAfterSaleNo, afterSale.getSn())); + //流水金额 = 支付最终结算金额 + storeFlow.setFinalPrice(payStoreFlow.getBillPrice()); + //最终结算金额 =实际退款金额 + storeFlow.setBillPrice(afterSale.getActualRefundPrice()); + //站点优惠券补贴返还金额=(站点优惠券补贴金额/购买商品数量)*退款商品数量 + storeFlow.setSiteCouponCommission(CurrencyUtil.mul(CurrencyUtil.div(payStoreFlow.getSiteCouponCommission(), payStoreFlow.getNum()), afterSale.getNum())); + //平台优惠券 使用金额 + storeFlow.setSiteCouponPrice(payStoreFlow.getSiteCouponPrice()); + //站点优惠券佣金比例 + storeFlow.setSiteCouponPoint(payStoreFlow.getSiteCouponPoint()); + //退款日志 + RefundLog refundLog = refundLogService.queryByAfterSaleSn(afterSale.getSn()); + //第三方流水单号 storeFlow.setTransactionId(refundLog.getReceivableNo()); + //支付方式 storeFlow.setPaymentName(refundLog.getPaymentName()); this.save(storeFlow); } @Override - public IPage getStoreFlow(String storeId, String type, boolean distribution, PageVO pageVO, Date startTime, Date endTime) { + public IPage getStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO) { + + return this.page(PageUtil.initPage(storeFlowQueryDTO.getPageVO()), generatorQueryWrapper(storeFlowQueryDTO)); + } + + @Override + public StoreFlow queryOne(StoreFlowQueryDTO storeFlowQueryDTO) { + return this.getOne(generatorQueryWrapper(storeFlowQueryDTO)); + } + + @Override + public List getStoreFlowPayDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO) { + return baseMapper.getStoreFlowPayDownloadVO(generatorQueryWrapper(storeFlowQueryDTO)); + } + + @Override + public List getStoreFlowRefundDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO) { + return baseMapper.getStoreFlowRefundDownloadVO(generatorQueryWrapper(storeFlowQueryDTO)); + } + + + @Override + public IPage getStoreFlow(String id, String type, PageVO pageVO) { + Bill bill = billService.getById(id); + return this.getStoreFlow(StoreFlowQueryDTO.builder().type(type).pageVO(pageVO).bill(bill).build()); + } + + @Override + public IPage getDistributionFlow(String id, PageVO pageVO) { + Bill bill = billService.getById(id); + return this.getStoreFlow(StoreFlowQueryDTO.builder().pageVO(pageVO).bill(bill).build()); + } + + @Override + public List listStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO) { + return this.list(generatorQueryWrapper(storeFlowQueryDTO)); + } + + /** + * 生成查询wrapper + * + * @param storeFlowQueryDTO 搜索参数 + * @return 查询wrapper + */ + private LambdaQueryWrapper generatorQueryWrapper(StoreFlowQueryDTO storeFlowQueryDTO) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(StoreFlow::getStoreId, storeId); - if (distribution) { - lambdaQueryWrapper.isNotNull(StoreFlow::getDistributionRebate); + //分销订单过滤是否判定 + lambdaQueryWrapper.isNotNull(storeFlowQueryDTO.getJustDistribution() != null && storeFlowQueryDTO.getJustDistribution(), + StoreFlow::getDistributionRebate); + + //流水类型判定 + lambdaQueryWrapper.eq(CharSequenceUtil.isNotEmpty(storeFlowQueryDTO.getType()), + StoreFlow::getFlowType, storeFlowQueryDTO.getType()); + + //售后编号判定 + lambdaQueryWrapper.eq(CharSequenceUtil.isNotEmpty(storeFlowQueryDTO.getRefundSn()), + StoreFlow::getRefundSn, storeFlowQueryDTO.getRefundSn()); + + //售后编号判定 + lambdaQueryWrapper.eq(CharSequenceUtil.isNotEmpty(storeFlowQueryDTO.getOrderSn()), + StoreFlow::getOrderSn, storeFlowQueryDTO.getOrderSn()); + + //结算单非空,则校对结算单参数 + if (storeFlowQueryDTO.getBill() != null) { + Bill bill = storeFlowQueryDTO.getBill(); + lambdaQueryWrapper.eq(CharSequenceUtil.isNotEmpty(bill.getStoreId()), StoreFlow::getStoreId, bill.getStoreId()); + lambdaQueryWrapper.between(bill.getStartTime() != null && bill.getEndTime() != null, + StoreFlow::getCreateTime, bill.getStartTime(), bill.getEndTime()); } - lambdaQueryWrapper.between(StoreFlow::getCreateTime, startTime, endTime); - if (StringUtils.isNotEmpty(type)) { - lambdaQueryWrapper.eq(StoreFlow::getFlowType, type); - } - - return this.page(PageUtil.initPage(pageVO), lambdaQueryWrapper); - } - - @Autowired - public void setOrderItemService(OrderItemService orderItemService) { - this.orderItemService = orderItemService; - } - - @Autowired - public void setOrderService(OrderService orderService) { - this.orderService = orderService; - } - - @Autowired - public void setRefundLogService(RefundLogService refundLogService) { - this.refundLogService = refundLogService; - } - - @Autowired - public void setPaymentService(PaymentService paymentService) { - this.paymentService = paymentService; + return lambdaQueryWrapper; } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java index 4dfcd7f3..954ddb3f 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java @@ -1,153 +1 @@ -package cn.lili.modules.order.order.serviceimpl; - -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.MqOrderTagsEnum; -import cn.lili.config.rocketmq.RocketmqCustomProperties; -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; -import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.vo.CartVO; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.dos.Trade; -import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.order.order.mapper.TradeMapper; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.order.order.service.TradeService; -import cn.lili.modules.promotion.service.CouponService; -import cn.lili.modules.promotion.service.MemberCouponService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 交易业务层实现 - * - * @author Chopper - * @date 2020/11/17 7:39 下午 - */ -@Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class TradeServiceImpl extends ServiceImpl implements TradeService { - - //缓存 - private final Cache cache; - //订单 - private final OrderService orderService; - //会员 - private final MemberService memberService; - //优惠券 - private final CouponService couponService; - //会员优惠券 - private final MemberCouponService memberCouponService; - //RocketMQ - private final RocketMQTemplate rocketMQTemplate; - //RocketMQ 配置 - private final RocketmqCustomProperties rocketmqCustomProperties; - - - @Override - @Transactional(rollbackFor = Exception.class) - public Trade createTrade(TradeDTO tradeDTO) { - Trade trade = new Trade(tradeDTO); - String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); - //积分预处理 - pointPretreatment(tradeDTO); - //优惠券预处理 - couponPretreatment(tradeDTO); - this.save(trade); - orderService.intoDB(tradeDTO); - //写入缓存,给消费者调用 - cache.put(key, tradeDTO); - //构建订单创建消息 - String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); - //发送订单创建消息 - rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); - return trade; - } - - @Override - public Trade getBySn(String sn) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Trade::getSn, sn); - return this.getOne(queryWrapper); - } - - - @Override - public void payTrade(String tradeSn, String paymentName, String receivableNo) { - LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); - orderQueryWrapper.eq(Order::getTradeSn, tradeSn); - List orders = orderService.list(orderQueryWrapper); - for (Order order : orders) { - orderService.payOrder(order.getSn(), paymentName, receivableNo); - } - Trade trade = this.getBySn(tradeSn); - trade.setPayStatus(PayStatusEnum.PAID.name()); - this.saveOrUpdate(trade); - } - - /** - * 积分预处理 - * 下单同时,使用积分 - * - * @param tradeDTO - */ - private void pointPretreatment(TradeDTO tradeDTO) { - StringBuilder orderSns = new StringBuilder(); - for (CartVO item : tradeDTO.getCartList()) { - orderSns.append(item.getSn()).append(","); - } - if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { - Member userInfo = memberService.getUserInfo(); - if (userInfo.getPoint() < tradeDTO.getPriceDetailDTO().getPayPoint()) { - throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); - } - boolean result = memberService.updateMemberPoint(tradeDTO.getPriceDetailDTO(). - getPayPoint().longValue(), 0, tradeDTO.getMemberId(), - "订单【" + orderSns + "】创建,积分扣减"); - - if (!result) { - throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); - } - } - } - - - /** - * 优惠券预处理 - * 下单同时,扣除优惠券 - * - * @param tradeDTO - */ - private void couponPretreatment(TradeDTO tradeDTO) { - List memberCouponDTOList = new ArrayList<>(); - if (null != tradeDTO.getPlatformCoupon()) { - memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); - } - Collection storeCoupons = tradeDTO.getStoreCoupons().values(); - if (!storeCoupons.isEmpty()) { - memberCouponDTOList.addAll(storeCoupons); - } - List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); - memberCouponService.used(ids); - memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); - - } - - -} \ No newline at end of file +package cn.lili.modules.order.order.serviceimpl; import cn.hutool.json.JSONUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.KanjiaActivityService; import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.OrderTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 交易业务层实现 * * @author Chopper * @since 2020/11/17 7:39 下午 */ @Service public class TradeServiceImpl extends ServiceImpl implements TradeService { /** * 缓存 */ @Autowired private Cache cache; /** * 订单 */ @Autowired private OrderService orderService; /** * 会员 */ @Autowired private MemberService memberService; /** * 优惠券 */ @Autowired private CouponService couponService; /** * 会员优惠券 */ @Autowired private MemberCouponService memberCouponService; /** * 砍价 */ @Autowired private KanjiaActivityService kanjiaActivityService; /** * RocketMQ */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * RocketMQ 配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //优惠券预处理 couponPretreatment(tradeDTO); //积分预处理 pointPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //砍价订单处理 kanjiaPretreatment(tradeDTO); //写入缓存,给消费者调用 cache.put(key, JSONUtil.toJsonStr(tradeDTO)); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO 购物车视图 */ private void createTradeCheck(TradeDTO tradeDTO) { if(tradeDTO.getStoreAddress() == null){ //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } //订单配送区域校验 if (tradeDTO.getNotSupportFreight() != null && !tradeDTO.getNotSupportFreight().isEmpty()) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> stringBuilder.append(sku.getGoodsSku().getGoodsName())); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } if (tradeDTO.getCartList().stream().noneMatch(CartVO::getChecked)) { throw new ServiceException(ResultCode.ORDER_NOT_EXIST_VALID); } if(tradeDTO.getCartList().stream().allMatch(item -> item.getDeliveryMethod().equals(DeliveryMethodEnum.SELF_PICK_UP.name()))){ throw new ServiceException(ResultCode.STORE_ADDRESS_NOT_EXIST); } } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO 购物车视图 */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(tradeDTO.getMemberId(), ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } /** * 创建交易,积分处理 * * @param tradeDTO 购物车视图 */ private void pointPretreatment(TradeDTO tradeDTO) { //需要支付积分 if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()); } boolean result = memberService.updateMemberPoint(tradeDTO.getPriceDetailDTO().getPayPoint(), PointTypeEnum.REDUCE.name(), tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } /** * 创建交易、砍价处理 * * @param tradeDTO 购物车视图 */ private void kanjiaPretreatment(TradeDTO tradeDTO) { if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) { String kanjiaId = tradeDTO.getSkuList().get(0).getKanjiaId(); kanjiaActivityService.endKanjiaActivity(kanjiaId); } } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/support/OrderStep.java b/framework/src/main/java/cn/lili/modules/order/order/support/OrderStep.java deleted file mode 100644 index 2b83289e..00000000 --- a/framework/src/main/java/cn/lili/modules/order/order/support/OrderStep.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.lili.modules.order.order.support; - - -import cn.lili.modules.order.order.entity.enums.OrderOperateEnum; -import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; - -import java.util.ArrayList; -import java.util.List; - -/** - * 订单流程 - * - * @author Chopper - * @date 2020/11/17 7:40 下午 - */ -public class OrderStep implements Cloneable { - - - /** - * 允许的操作 - */ - private List allowableOperate; - - public OrderStep(OrderStatusEnum orderStatus, OrderOperateEnum... operates) { - /** - * 订单状态 - */ - this.allowableOperate = new ArrayList(); - for (OrderOperateEnum orderOperate : operates) { - allowableOperate.add(orderOperate); - } - } - - @Override - public Object clone() { - OrderStep orderStep = null; - try { - orderStep = (OrderStep) super.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - ArrayList list = (ArrayList) allowableOperate; - orderStep.allowableOperate = (List) list.clone(); - return orderStep; - } - - public List getOperate() { - return this.allowableOperate; - } - - public static void main(String[] args) throws CloneNotSupportedException { - OrderStep step1 = new OrderStep(OrderStatusEnum.UNPAID, OrderOperateEnum.CONFIRM, OrderOperateEnum.CANCEL); - OrderStep step2 = (OrderStep) step1.clone(); - - step2.getOperate().remove(OrderOperateEnum.CONFIRM); - step2.getOperate().add(OrderOperateEnum.PAY); - - System.out.println(step1); - System.out.println(step2); - - step1.getOperate().forEach(orderOperateEnum -> { - System.out.println(orderOperateEnum); - }); - - System.out.println("--------"); - step2.getOperate().forEach(orderOperateEnum -> { - System.out.println(orderOperateEnum); - }); - - } - - - public boolean checkAllowable(OrderOperateEnum operate) { - for (OrderOperateEnum orderOperate : allowableOperate) { - if (operate.compareTo(orderOperate) == 0) { - return true; - } - } - return false; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/OrderLog.java b/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/OrderLog.java index 39c8a263..acf475b2 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/OrderLog.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/OrderLog.java @@ -2,9 +2,9 @@ package cn.lili.modules.order.trade.entity.dos; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.StringUtils; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -15,34 +15,22 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 订单日志 * * @author Chopper - * @date 2020-03-25 2:30 下午 + * @since 2020-03-25 2:30 下午 */ @Data -@Entity -@Table(name = "li_order_log") @TableName("li_order_log") @ApiModel(value = "订单日志") @NoArgsConstructor -public class OrderLog { +public class OrderLog extends BaseIdEntity { private static final long serialVersionUID = -1599270944927160096L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; @CreatedBy @TableField(fill = FieldFill.INSERT) diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleRefundWayEnum.java b/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleRefundWayEnum.java index 58a7ab2e..0e2935ab 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleRefundWayEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleRefundWayEnum.java @@ -8,8 +8,13 @@ package cn.lili.modules.order.trade.entity.enums; **/ public enum AfterSaleRefundWayEnum { - + /** + * "原路退回" + */ ORIGINAL("原路退回"), + /** + * "线下支付" + */ OFFLINE("线下支付"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleStatusEnum.java b/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleStatusEnum.java index f0ff1d64..0ac00c29 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.trade.entity.enums; * 售后状态 * * @author Chopper - * @date 2020-08-20 15:39 + * @since 2020-08-20 15:39 */ public enum AfterSaleStatusEnum { @@ -14,7 +14,7 @@ public enum AfterSaleStatusEnum { APPLY("申请中"), PASS("已通过"), REFUSE("已拒绝"), - BUYER_RETURN("买家退货,待卖家收货"), + BUYER_RETURN("待卖家收货"), SELLER_CONFIRM("卖家确认收货"), SELLER_TERMINATION("卖家终止售后"), BUYER_CANCEL("买家取消售后"), diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleTypeEnum.java index 6b0d26a4..d7ddfc2d 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/AfterSaleTypeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.order.trade.entity.enums; * 售后类型 * * @author Chopper - * @date 2020/8/20 15:39 + * @since 2020/8/20 15:39 */ public enum AfterSaleTypeEnum { diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/DepositQueryVO.java b/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/DepositQueryVO.java index dfd438a8..29bcad3f 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/DepositQueryVO.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/DepositQueryVO.java @@ -12,7 +12,7 @@ import java.io.Serializable; * 预存款充值记录查询条件 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data @ApiModel(value = "预存款变动记录查询条件") diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/RechargeQueryVO.java b/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/RechargeQueryVO.java index 7bd5d894..d65882ae 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/RechargeQueryVO.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/entity/vo/RechargeQueryVO.java @@ -12,7 +12,7 @@ import java.io.Serializable; * 预存款充值记录查询条件 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data @ApiModel(value = "预存款充值记录查询条件") diff --git a/framework/src/main/java/cn/lili/modules/order/trade/mapper/OrderLogMapper.java b/framework/src/main/java/cn/lili/modules/order/trade/mapper/OrderLogMapper.java index 91cfb106..2feeaa49 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/mapper/OrderLogMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/mapper/OrderLogMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 订单日志数据处理层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface OrderLogMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/order/trade/service/OrderLogService.java b/framework/src/main/java/cn/lili/modules/order/trade/service/OrderLogService.java index e2be3e7d..ece01032 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/service/OrderLogService.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/service/OrderLogService.java @@ -9,7 +9,7 @@ import java.util.List; * 订单日志业务层 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface OrderLogService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/OrderLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/OrderLogServiceImpl.java index a8689098..f032a02c 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/OrderLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/OrderLogServiceImpl.java @@ -17,17 +17,15 @@ import java.util.List; * 订单日志业务层实现 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderLogServiceImpl extends ServiceImpl implements OrderLogService { @Override public List getOrderLog(String orderSn) { - LambdaQueryWrapper lambdaQueryWrapper= Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(OrderLog::getOrderSn,orderSn); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(OrderLog::getOrderSn, orderSn); return this.list(lambdaQueryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/entity/dos/Article.java b/framework/src/main/java/cn/lili/modules/page/entity/dos/Article.java index 95bd10f0..7e65a45d 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/dos/Article.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/dos/Article.java @@ -1,16 +1,15 @@ package cn.lili.modules.page.entity.dos; -import cn.lili.base.BaseEntity; -import cn.lili.common.enums.SwitchEnum; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.http.HtmlUtil; import cn.lili.modules.page.entity.enums.ArticleEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -18,11 +17,9 @@ import javax.validation.constraints.NotNull; * 文章DO * * @author Bulbasaur - * @date 2020/12/10 17:42 + * @since 2020/12/10 17:42 */ @Data -@Entity -@Table(name = "li_article") @TableName("li_article") @ApiModel(value = "文章") public class Article extends BaseEntity { @@ -45,14 +42,19 @@ public class Article extends BaseEntity { @NotEmpty(message = "文章内容不能为空") private String content; - /** - * @see SwitchEnum - */ - @ApiModelProperty(value = "状态", allowableValues = "OPEN,CLOSE") - private String openStatus; + @ApiModelProperty(value = "状态") + private Boolean openStatus; /** * @see ArticleEnum */ @ApiModelProperty(value = "类型") private String type; + + public String getContent() { + if (CharSequenceUtil.isNotEmpty(content)) { + return HtmlUtil.unescape(content); + } + return content; + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/entity/dos/ArticleCategory.java b/framework/src/main/java/cn/lili/modules/page/entity/dos/ArticleCategory.java index 1ef9e680..014fd669 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/dos/ArticleCategory.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/dos/ArticleCategory.java @@ -1,6 +1,6 @@ package cn.lili.modules.page.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import cn.lili.modules.page.entity.enums.ArticleCategoryEnum; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; @@ -9,20 +9,19 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; /** * 文章分类 * * @author pikachu * @author Bulbasaur - * @date 2020/12/10 17:42 + * @since 2020/12/10 17:42 */ @Data -@Entity -@Table(name = "li_article_category") @TableName("li_article_category") @ApiModel(value = "文章分类") @NoArgsConstructor @@ -39,10 +38,15 @@ public class ArticleCategory extends BaseEntity { @ApiModelProperty(value = "父分类ID") private String parentId; - @ApiModelProperty(value = "排序,正序123") + @ApiModelProperty(value = "排序") + @Min(value = 0,message = "排序值最小0,最大9999999999") + @Max(value = 999999999,message = "排序值最小0,最大9999999999") + @NotNull(message = "排序值不能为空") private Integer sort; @ApiModelProperty(value = "层级") + @Min(value = 0,message = "层级最小为0") + @Max(value = 3,message = "层级最大为3") private Integer level; /** @@ -51,4 +55,17 @@ public class ArticleCategory extends BaseEntity { @ApiModelProperty(value = "类型") private String type; + public Integer getSort() { + if (sort == null) { + return 0; + } + return sort; + } + + public Integer getLevel() { + if (level == null) { + return 1; + } + return level; + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/entity/dos/Feedback.java b/framework/src/main/java/cn/lili/modules/page/entity/dos/Feedback.java index 432df5f2..49bf52f2 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/dos/Feedback.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/dos/Feedback.java @@ -1,48 +1,37 @@ package cn.lili.modules.page.entity.dos; -import cn.lili.base.BaseEntity; -import cn.lili.common.utils.SnowFlake; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; import cn.lili.modules.page.entity.enums.FeedbackTypeEnum; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import org.hibernate.validator.constraints.Length; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; -import java.io.Serializable; import java.util.Date; /** * 意见反馈 * * @author Bulbasaur - * @date 2020/12/10 17:42 + * @since 2020/12/10 17:42 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_feedback") @TableName("li_feedback") @ApiModel(value = "意见反馈") -public class Feedback implements Serializable { +public class Feedback extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @@ -60,9 +49,12 @@ public class Feedback implements Serializable { private String context; @ApiModelProperty(value = "手机号") + @Length(max = 11, message = "手机号不能超过11位") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String mobile; @ApiModelProperty(value = "图片,多个图片使用:(,)分割") + @Length(max = 255, message = "图片上传太多啦,请选择删除掉") private String images; /** diff --git a/framework/src/main/java/cn/lili/modules/page/entity/dos/PageData.java b/framework/src/main/java/cn/lili/modules/page/entity/dos/PageData.java index 9261b7f5..ffac1f70 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/dos/PageData.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/dos/PageData.java @@ -1,27 +1,25 @@ package cn.lili.modules.page.entity.dos; -import cn.lili.base.BaseEntity; -import cn.lili.common.security.context.UserContext; +import cn.hutool.http.HtmlUtil; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.SwitchEnum; +import cn.lili.common.utils.StringUtils; import cn.lili.modules.page.entity.enums.PageEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 页面数据DO * * @author Bulbasaur - * @date 2020/12/10 17:42 + * @since 2020/12/10 17:42 */ @Data -@Entity -@Table(name = "li_page_data") @TableName("li_page_data") @ApiModel(value = "页面数据DO") @NoArgsConstructor @@ -49,7 +47,7 @@ public class PageData extends BaseEntity { private String pageType; /** - * @see cn.lili.modules.base.entity.enums.ClientTypeEnum + * @see ClientTypeEnum */ @ApiModelProperty(value = "客户端类型", allowableValues = "PC,H5,WECHAT_MP,APP") private String pageClientType; @@ -57,13 +55,19 @@ public class PageData extends BaseEntity { @ApiModelProperty(value = "值") private String num; - //店铺首页 - public PageData(String name, String pageClientType, String pageData) { + public PageData(String name, String pageClientType, String pageData, String num) { + this.name = name; this.pageClientType = pageClientType; this.pageData = pageData; - this.num = UserContext.getCurrentUser().getStoreId(); + this.num = num; this.pageShow = SwitchEnum.CLOSE.name(); this.pageType = PageEnum.STORE.name(); } + public String getPageData() { + if (StringUtils.isNotEmpty(pageData)) { + return HtmlUtil.unescape(pageData); + } + return pageData; + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/entity/dos/Special.java b/framework/src/main/java/cn/lili/modules/page/entity/dos/Special.java index 62a8531e..c536e2a9 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/dos/Special.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/dos/Special.java @@ -1,23 +1,20 @@ package cn.lili.modules.page.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; +import cn.lili.common.enums.ClientTypeEnum; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 专题活动 * * @author Bulbasaur - * @date 2020/12/10 17:42 + * @since 2020/12/10 17:42 */ @Data -@Entity -@Table(name = "li_special") @TableName("li_special") @ApiModel(value = "专题活动") public class Special extends BaseEntity { @@ -26,7 +23,7 @@ public class Special extends BaseEntity { private String specialName; /** - * @see cn.lili.modules.base.entity.enums.ClientTypeEnum + * @see ClientTypeEnum */ @ApiModelProperty(value = "楼层对应连接端类型", allowableValues = "PC,H5,WECHAT_MP,APP") private String clientType; diff --git a/framework/src/main/java/cn/lili/modules/page/entity/dto/ArticleSearchParams.java b/framework/src/main/java/cn/lili/modules/page/entity/dto/ArticleSearchParams.java index b62f1bb4..00271be7 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/dto/ArticleSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/dto/ArticleSearchParams.java @@ -10,7 +10,7 @@ import lombok.Data; * 商品查询条件 * * @author pikachu - * @date 2020-02-24 19:27:20 + * @since 2020-02-24 19:27:20 */ @Data public class ArticleSearchParams extends PageVO { @@ -28,7 +28,6 @@ public class ArticleSearchParams extends PageVO { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq(StringUtils.isNotBlank(categoryId), "category_id", categoryId); queryWrapper.like(StringUtils.isNotBlank(title), "title", title); - //queryWrapper.orderByAsc("a.sort"); return queryWrapper; } } diff --git a/framework/src/main/java/cn/lili/modules/page/entity/dto/PageDataDTO.java b/framework/src/main/java/cn/lili/modules/page/entity/dto/PageDataDTO.java index 98af786b..70be533c 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/dto/PageDataDTO.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/dto/PageDataDTO.java @@ -1,5 +1,6 @@ package cn.lili.modules.page.entity.dto; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.modules.page.entity.enums.PageEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,7 +10,7 @@ import lombok.NoArgsConstructor; * 楼层装修数据DTO * * @author Bulbasaur - * @date 2020/12/10 17:44 + * @since 2020/12/10 17:44 */ @Data @NoArgsConstructor @@ -25,7 +26,7 @@ public class PageDataDTO { private String pageType; /** - * @see cn.lili.modules.base.entity.enums.ClientTypeEnum + * @see ClientTypeEnum */ @ApiModelProperty(value = "客户端类型", allowableValues = "PC,H5,WECHAT_MP,APP") private String pageClientType; diff --git a/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleCategoryEnum.java b/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleCategoryEnum.java index b914f792..d49f7865 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleCategoryEnum.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleCategoryEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.page.entity.enums; * 文章分类枚举 * * @author Bulbasaur - * @date 2020/12/7 10:50 + * @since 2020/12/7 10:50 */ public enum ArticleCategoryEnum { diff --git a/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleEnum.java b/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleEnum.java index 6a92d460..9a971e8e 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleEnum.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/enums/ArticleEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.page.entity.enums; * 文章分类枚举 * * @author Bulbasaur - * @date 2020/12/7 10:50 + * @since 2020/12/7 10:50 */ public enum ArticleEnum { @@ -24,6 +24,10 @@ public enum ArticleEnum { * 证照信息 */ LICENSE_INFORMATION, + /** + * 店铺入驻 + */ + STORE_REGISTER, /** * 其他文章 */ diff --git a/framework/src/main/java/cn/lili/modules/page/entity/enums/FeedbackTypeEnum.java b/framework/src/main/java/cn/lili/modules/page/entity/enums/FeedbackTypeEnum.java index cca95dfb..ee088002 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/enums/FeedbackTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/enums/FeedbackTypeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.page.entity.enums; * 功能反馈枚举 * * @author Bulbasaur - * @date 2020/12/7 10:50 + * @since 2020/12/7 10:50 */ public enum FeedbackTypeEnum { diff --git a/framework/src/main/java/cn/lili/modules/page/entity/enums/PageEnum.java b/framework/src/main/java/cn/lili/modules/page/entity/enums/PageEnum.java index 0c5b2948..c8747c8b 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/enums/PageEnum.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/enums/PageEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.page.entity.enums; * 楼层装修枚举 * * @author Bulbasaur - * @date 2020/12/7 10:50 + * @since 2020/12/7 10:50 */ public enum PageEnum { diff --git a/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleCategoryVO.java b/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleCategoryVO.java index 9ca34f72..8d86542f 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleCategoryVO.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleCategoryVO.java @@ -13,7 +13,7 @@ import java.util.List; * 文章分类VO * * @author Chopper - * @date 2021-03-26 11:32 + * @since 2021-03-26 11:32 */ @Data public class ArticleCategoryVO extends ArticleCategory { diff --git a/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleVO.java b/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleVO.java index 74ff538f..5bd1df3c 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleVO.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/vos/ArticleVO.java @@ -7,7 +7,7 @@ import lombok.Data; * 文章VO * * @author Chopper - * @date 2021-03-26 11:32 + * @since 2021-03-26 11:32 */ @Data public class ArticleVO { @@ -24,6 +24,6 @@ public class ArticleVO { @ApiModelProperty(value = "文章排序") private Integer sort; - @ApiModelProperty(value = "状态, allowableValues = OPEN,CLOSE") - private String openStatus; + @ApiModelProperty(value = "开启状态") + private Boolean openStatus; } diff --git a/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataListVO.java b/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataListVO.java index 1eb61f9c..87bd7553 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataListVO.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataListVO.java @@ -8,7 +8,7 @@ import lombok.Data; * 楼层装修数据VO * * @author Bulbasaur - * @date 2020/12/10 17:42 + * @since 2020/12/10 17:42 */ @Data public class PageDataListVO { diff --git a/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataVO.java b/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataVO.java index 8df6902c..5a555dab 100644 --- a/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataVO.java +++ b/framework/src/main/java/cn/lili/modules/page/entity/vos/PageDataVO.java @@ -7,7 +7,7 @@ import lombok.Data; * 楼层装修数据VO * * @author Bulbasaur - * @date 2020/12/10 17:42 + * @since 2020/12/10 17:42 */ @Data public class PageDataVO { diff --git a/framework/src/main/java/cn/lili/modules/page/mapper/ArticleCategoryMapper.java b/framework/src/main/java/cn/lili/modules/page/mapper/ArticleCategoryMapper.java index 933db36b..ed28617f 100644 --- a/framework/src/main/java/cn/lili/modules/page/mapper/ArticleCategoryMapper.java +++ b/framework/src/main/java/cn/lili/modules/page/mapper/ArticleCategoryMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 文章分类数据处理层 * * @author pikachu - * @date 2020-05-5 15:10:16 + * @since 2020-05-5 15:10:16 */ public interface ArticleCategoryMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/page/mapper/ArticleMapper.java b/framework/src/main/java/cn/lili/modules/page/mapper/ArticleMapper.java index 366c0c80..f20cdaaf 100644 --- a/framework/src/main/java/cn/lili/modules/page/mapper/ArticleMapper.java +++ b/framework/src/main/java/cn/lili/modules/page/mapper/ArticleMapper.java @@ -14,10 +14,17 @@ import org.apache.ibatis.annotations.Select; * 文章数据处理层 * * @author pikachu - * @date 2020-05-06 15:18:56 + * @since 2020-05-06 15:18:56 */ public interface ArticleMapper extends BaseMapper
{ + /** + * 获取文章VO分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 文章VO分页 + */ @Select("select a.id,a.title,a.sort,ac.article_category_name,a.open_status from " + "li_article as a inner join li_article_category ac on a.category_id=ac.id ${ew.customSqlSegment}") IPage getArticleList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); diff --git a/framework/src/main/java/cn/lili/modules/page/mapper/FeedbackMapper.java b/framework/src/main/java/cn/lili/modules/page/mapper/FeedbackMapper.java index 4db2f07d..e0364725 100644 --- a/framework/src/main/java/cn/lili/modules/page/mapper/FeedbackMapper.java +++ b/framework/src/main/java/cn/lili/modules/page/mapper/FeedbackMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 意见反馈处理层 * * @author pikachu - * @date 2020-05-06 15:18:56 + * @since 2020-05-06 15:18:56 */ public interface FeedbackMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/page/mapper/PageDataMapper.java b/framework/src/main/java/cn/lili/modules/page/mapper/PageDataMapper.java index 548918a6..e1c6956d 100644 --- a/framework/src/main/java/cn/lili/modules/page/mapper/PageDataMapper.java +++ b/framework/src/main/java/cn/lili/modules/page/mapper/PageDataMapper.java @@ -14,16 +14,35 @@ import org.apache.ibatis.annotations.Select; * 楼层装修设置数据处理层 * * @author paulGao - * @date 2020/12/7 11:26 + * @since 2020/12/7 11:26 */ public interface PageDataMapper extends BaseMapper { + /** + * 获取页面数据VO + * + * @param queryWrapper 查询条件 + * @return 页面数据VO + */ @Select("SELECT page_data FROM li_page_data ${ew.customSqlSegment}") PageDataVO getPageData(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 获取页面数量 + * + * @param queryWrapper 查询条件 + * @return 页面数量 + */ @Select("SELECT COUNT(id) FROM li_page_data ${ew.customSqlSegment}") Integer getPageDataNum(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 获取页面数据分页 + * + * @param page 页面 + * @param queryWrapper 查询条件 + * @return 页面数据分页 + */ @Select("SELECT id,name,page_show FROM li_page_data ${ew.customSqlSegment}") IPage getPageDataList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); diff --git a/framework/src/main/java/cn/lili/modules/page/mapper/SpecialMapper.java b/framework/src/main/java/cn/lili/modules/page/mapper/SpecialMapper.java index ddbfc783..0da88e5b 100644 --- a/framework/src/main/java/cn/lili/modules/page/mapper/SpecialMapper.java +++ b/framework/src/main/java/cn/lili/modules/page/mapper/SpecialMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 专题活动数据处理层 * * @author Bulbasaur - * @date 2020/12/7 11:26 + * @since 2020/12/7 11:26 */ public interface SpecialMapper extends BaseMapper { } diff --git a/framework/src/main/java/cn/lili/modules/page/service/ArticleCategoryService.java b/framework/src/main/java/cn/lili/modules/page/service/ArticleCategoryService.java index c31ffb32..323dab06 100644 --- a/framework/src/main/java/cn/lili/modules/page/service/ArticleCategoryService.java +++ b/framework/src/main/java/cn/lili/modules/page/service/ArticleCategoryService.java @@ -11,7 +11,7 @@ import java.util.List; * 文章分类业务层 * * @author Bulbasaur - * @date 2020/11/24 17:07 + * @since 2020/11/24 17:07 */ public interface ArticleCategoryService extends IService { @@ -19,6 +19,7 @@ public interface ArticleCategoryService extends IService { * 添加文章分类 * * @param articleCategory 文章分类 + * @return 文章分类 */ ArticleCategory saveArticleCategory(ArticleCategory articleCategory); @@ -26,6 +27,7 @@ public interface ArticleCategoryService extends IService { * 修改文章分类 * * @param articleCategory 文章分类 + * @return 文章分类 */ ArticleCategory updateArticleCategory(ArticleCategory articleCategory); @@ -40,6 +42,7 @@ public interface ArticleCategoryService extends IService { * 删除文章分类 * * @param id 文章分类id + * @return 操作状态 */ boolean deleteById(String id); diff --git a/framework/src/main/java/cn/lili/modules/page/service/ArticleService.java b/framework/src/main/java/cn/lili/modules/page/service/ArticleService.java index b397e94c..67e97b56 100644 --- a/framework/src/main/java/cn/lili/modules/page/service/ArticleService.java +++ b/framework/src/main/java/cn/lili/modules/page/service/ArticleService.java @@ -16,11 +16,17 @@ import java.util.List; * 文章业务层 * * @author pikachu - * @date 2020/11/18 11:40 上午 + * @since 2020/11/18 11:40 上午 */ @CacheConfig(cacheNames = "{article}") public interface ArticleService extends IService
{ + /** + * 管理端获取文章 + * @param articleSearchParams + * @return + */ + IPage managerArticlePage(ArticleSearchParams articleSearchParams); /** * 获取文章分页 * @@ -47,7 +53,7 @@ public interface ArticleService extends IService
{ Article updateArticle(Article article); /** - * 删除文章 + * 删除文章--id * * @param id */ @@ -58,6 +64,7 @@ public interface ArticleService extends IService
{ * 读取文章 * * @param id + * @return 文章 */ @Cacheable(key = "#id") Article customGet(String id); @@ -66,7 +73,26 @@ public interface ArticleService extends IService
{ * 读取文章 * * @param type + * @return 文章 */ @Cacheable(key = "#type") Article customGetByType(String type); + + /** + * 修改文章状态 + * + * @param id 文章ID + * @param status 显示状态 + * @return 操作状态 + */ + @CacheEvict(key = "#id") + Boolean updateArticleStatus(String id, boolean status); + + /** + * 修改文章--文章类型修改 + * @param article + * @return + */ + @CacheEvict(key = "#article.type") + Article updateArticleType(Article article); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/service/FeedbackService.java b/framework/src/main/java/cn/lili/modules/page/service/FeedbackService.java index c2b2a51c..6f95c782 100644 --- a/framework/src/main/java/cn/lili/modules/page/service/FeedbackService.java +++ b/framework/src/main/java/cn/lili/modules/page/service/FeedbackService.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 意见反馈业务层 * * @author pikachu - * @date 2020/11/18 11:40 上午 + * @since 2020/11/18 11:40 上午 */ public interface FeedbackService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/page/service/PageDataService.java b/framework/src/main/java/cn/lili/modules/page/service/PageDataService.java index 1ddea4c7..93107829 100644 --- a/framework/src/main/java/cn/lili/modules/page/service/PageDataService.java +++ b/framework/src/main/java/cn/lili/modules/page/service/PageDataService.java @@ -12,7 +12,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 页面业务层 * * @author Bulbasaur - * @date 2020/12/10 17:23 + * @since 2020/12/10 17:23 */ public interface PageDataService extends IService { @@ -74,4 +74,12 @@ public interface PageDataService extends IService { * @return */ IPage getPageDataList(PageVO pageVO, PageDataDTO pageDataDTO); + + + /** + * 获取专题信息 + * @param id id + * @return + */ + PageData getSpecial(String id); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/service/SpecialService.java b/framework/src/main/java/cn/lili/modules/page/service/SpecialService.java index 76c8f424..30863ab6 100644 --- a/framework/src/main/java/cn/lili/modules/page/service/SpecialService.java +++ b/framework/src/main/java/cn/lili/modules/page/service/SpecialService.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 专题活动业务层 * * @author Bulbasaur - * @date 2020/12/7 11:27 + * @since 2020/12/7 11:27 */ public interface SpecialService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleCategoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleCategoryServiceImpl.java index 7a94edaa..199f73b5 100644 --- a/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleCategoryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleCategoryServiceImpl.java @@ -1,10 +1,9 @@ package cn.lili.modules.page.serviceimpl; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.StringUtils; import cn.lili.modules.page.entity.dos.Article; import cn.lili.modules.page.entity.dos.ArticleCategory; import cn.lili.modules.page.entity.enums.ArticleCategoryEnum; @@ -15,7 +14,6 @@ import cn.lili.modules.page.service.ArticleCategoryService; import cn.lili.modules.page.service.ArticleService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,56 +26,61 @@ import java.util.List; * 文章分类业务层实现 * * @author pikachu - * @date 2020-05-5 15:10:16 + * @since 2020-05-5 15:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ArticleCategoryServiceImpl extends ServiceImpl implements ArticleCategoryService { - //缓存 - private final Cache cache; - //文章 + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 文章 + */ + @Autowired private ArticleService articleService; + /** + * 顶级父分类ID + */ + private String parentId = "0"; + /** + * 最大分类等级 + */ + private int maxLevel = 2; @Override + @Transactional(rollbackFor = Exception.class) public ArticleCategory saveArticleCategory(ArticleCategory articleCategory) { - //不能添加重复的分类名称 - List list = this.list( - new LambdaQueryWrapper().eq(ArticleCategory::getArticleCategoryName, articleCategory.getArticleCategoryName())); - if (StringUtils.isNotEmpty(list)) { - throw new ServiceException(ResultCode.SUCCESS.ARTICLE_CATEGORY_NAME_EXIST); - } - // 非顶级分类 - if (articleCategory.getParentId() != null && !articleCategory.getParentId().equals("0")) { + //非顶级分类 + if (articleCategory.getParentId() != null && !parentId.equals(articleCategory.getParentId())) { ArticleCategory parent = this.getById(articleCategory.getParentId()); if (parent == null) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_PARENT_NOT_EXIST); } - if (articleCategory.getLevel() >= 2) { + if (articleCategory.getLevel() >= maxLevel) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_BEYOND_TWO); } } articleCategory.setType(ArticleCategoryEnum.OTHER.name()); - if (this.save(articleCategory)) { - //清除文章分类缓存 - this.clearCache(); - return articleCategory; - } - throw new ServiceException(ResultCode.ERROR); + this.save(articleCategory); + //清除文章分类缓存 + this.clearCache(); + return articleCategory; } @Override public ArticleCategory updateArticleCategory(ArticleCategory articleCategory) { - // 非顶级分类校验是否存在 - if (!articleCategory.getParentId().equals("0")) { + //非顶级分类校验是否存在 + if (!parentId.equals(articleCategory.getParentId())) { ArticleCategory parent = this.getById(articleCategory.getParentId()); if (parent == null) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_PARENT_NOT_EXIST); } - // 替换catPath 根据path规则来匹配级别 - if (articleCategory.getLevel() >= 2) { + //替换catPath 根据path规则来匹配级别 + if (articleCategory.getLevel() >= maxLevel) { throw new ServiceException(ResultCode.ARTICLE_CATEGORY_BEYOND_TWO); } } @@ -92,7 +95,7 @@ public class ArticleCategoryServiceImpl extends ServiceImpl allChildren() { - // 从缓存取所有的分类 + //从缓存取所有的分类 Object all = cache.get(CachePrefix.ARTICLE_CATEGORY.getPrefix()); List articleCategories; if (all == null) { - // 调用初始化分类缓存方法 + //调用初始化分类缓存方法 articleCategories = initCategory(); } else { articleCategories = (List) all; diff --git a/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleServiceImpl.java b/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleServiceImpl.java index 7fb7b283..77ddd2f8 100644 --- a/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/page/serviceimpl/ArticleServiceImpl.java @@ -1,27 +1,24 @@ package cn.lili.modules.page.serviceimpl; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.BeanUtil; -import cn.lili.common.utils.PageUtil; import cn.lili.modules.page.entity.dos.Article; import cn.lili.modules.page.entity.dto.ArticleSearchParams; import cn.lili.modules.page.entity.enums.ArticleEnum; import cn.lili.modules.page.entity.vos.ArticleVO; import cn.lili.modules.page.mapper.ArticleMapper; import cn.lili.modules.page.service.ArticleService; +import cn.lili.mybatis.util.PageUtil; 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.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -29,19 +26,23 @@ import java.util.List; * 文章业务层实现 * * @author Chopper - * @date 2020/11/18 11:40 上午 + * @since 2020/11/18 11:40 上午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ArticleServiceImpl extends ServiceImpl implements ArticleService { - private final ArticleMapper articleMapper; + @Override + public IPage managerArticlePage(ArticleSearchParams articleSearchParams) { + articleSearchParams.setSort("a.sort"); + return this.baseMapper.getArticleList(PageUtil.initPage(articleSearchParams), articleSearchParams.queryWrapper()); + } @Override public IPage articlePage(ArticleSearchParams articleSearchParams) { articleSearchParams.setSort("a.sort"); - return this.baseMapper.getArticleList(PageUtil.initPage(articleSearchParams), articleSearchParams.queryWrapper()); + QueryWrapper queryWrapper = articleSearchParams.queryWrapper(); + queryWrapper.eq("open_status", true); + return this.baseMapper.getArticleList(PageUtil.initPage(articleSearchParams), queryWrapper); } @Override @@ -64,9 +65,9 @@ public class ArticleServiceImpl extends ServiceImpl impl @Override public void customRemove(String id) { //判断是否为默认文章 - if(this.getById(id).getType().equals(ArticleEnum.OTHER.name())){ + if (this.getById(id).getType().equals(ArticleEnum.OTHER.name())) { this.removeById(id); - }else{ + } else { throw new ServiceException(ResultCode.ARTICLE_NO_DELETION); } } @@ -78,9 +79,24 @@ public class ArticleServiceImpl extends ServiceImpl impl @Override public Article customGetByType(String type) { - if(!StrUtil.equals(type, ArticleEnum.OTHER.name())){ - return this.getOne(new LambdaUpdateWrapper
().eq(Article::getType,type)); + if (!CharSequenceUtil.equals(type, ArticleEnum.OTHER.name())) { + return this.getOne(new LambdaUpdateWrapper
().eq(Article::getType, type)); } return null; } + + @Override + public Boolean updateArticleStatus(String id, boolean status) { + Article article = this.getById(id); + article.setOpenStatus(status); + return this.updateById(article); + } + + @Override + public Article updateArticleType(Article article) { + Article oldArticle = this.getById(article.getId()); + BeanUtil.copyProperties(article, oldArticle); + this.updateById(oldArticle); + return oldArticle; + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/serviceimpl/FeedbackServiceImpl.java b/framework/src/main/java/cn/lili/modules/page/serviceimpl/FeedbackServiceImpl.java index 1c7ee821..4d17d5ed 100644 --- a/framework/src/main/java/cn/lili/modules/page/serviceimpl/FeedbackServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/page/serviceimpl/FeedbackServiceImpl.java @@ -5,20 +5,15 @@ import cn.lili.modules.page.entity.dos.Feedback; import cn.lili.modules.page.mapper.FeedbackMapper; import cn.lili.modules.page.service.FeedbackService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 意见反馈业务层实现 * * @author Chopper - * @date 2020/11/18 11:40 上午 + * @since 2020/11/18 11:40 上午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FeedbackServiceImpl extends ServiceImpl implements FeedbackService { } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java index 795f5934..a3c9cebc 100644 --- a/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java @@ -1,11 +1,14 @@ package cn.lili.modules.page.serviceimpl; -import cn.lili.common.enums.SwitchEnum; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.SwitchEnum; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.PageUtil; +import cn.lili.common.properties.SystemSettingProperties; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; import cn.lili.common.vo.PageVO; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; import cn.lili.modules.page.entity.dos.PageData; import cn.lili.modules.page.entity.dto.PageDataDTO; import cn.lili.modules.page.entity.enums.PageEnum; @@ -13,28 +16,32 @@ import cn.lili.modules.page.entity.vos.PageDataListVO; import cn.lili.modules.page.entity.vos.PageDataVO; import cn.lili.modules.page.mapper.PageDataMapper; import cn.lili.modules.page.service.PageDataService; +import cn.lili.mybatis.util.PageUtil; +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.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 楼层装修管理业务层实现 * * @author Bulbasaur - * @date 2020/12/11 9:15 + * @since 2020/12/11 9:15 */ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PageDataServiceImpl extends ServiceImpl implements PageDataService { - private final PageDataMapper pageDataMapper; + + @Autowired + private SystemSettingProperties systemSettingProperties; @Override + @Transactional(rollbackFor = Exception.class) public void addStorePageData(String storeId) { //设置店铺的PC页面 PageData pageData = new PageData(); @@ -54,24 +61,68 @@ public class PageDataServiceImpl extends ServiceImpl i } @Override + @Transactional(rollbackFor = Exception.class) public PageData addPageData(PageData pageData) { + + + //演示站点判定 + if (systemSettingProperties.getDemoSite()) { + //如果开启页面,并且是平台楼层装修 + if (pageData.getPageShow().equals(SwitchEnum.OPEN.name()) && pageData.getPageType().equals(PageEnum.INDEX.name())) { + pageData.setPageShow(SwitchEnum.CLOSE.name()); + } + } + + + //如果页面为发布,则关闭其他页面,开启此页面 + if (pageData.getPageShow().equals(SwitchEnum.OPEN.name())) { + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), PageData::getNum, UserContext.getCurrentUser().getStoreId()); + lambdaUpdateWrapper.eq(PageData::getPageType, pageData.getPageType()); + lambdaUpdateWrapper.eq(PageData::getPageClientType, pageData.getPageClientType()); + lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name()); + this.update(lambdaUpdateWrapper); + } else { + pageData.setPageShow(SwitchEnum.CLOSE.name()); + } this.save(pageData); return pageData; } @Override + @Transactional(rollbackFor = Exception.class) public PageData updatePageData(PageData pageData) { + //如果页面为发布,则关闭其他页面,开启此页面 + if (pageData.getPageShow() != null && pageData.getPageShow().equals(SwitchEnum.OPEN.name())) { + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(CharSequenceUtil.isNotEmpty(pageData.getPageType()), PageData::getPageType, pageData.getPageType()); + lambdaUpdateWrapper.eq(CharSequenceUtil.isNotEmpty(pageData.getPageClientType()), PageData::getPageClientType, pageData.getPageClientType()); + lambdaUpdateWrapper.eq(PageData::getNum, pageData.getNum()); + lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name()); + this.update(lambdaUpdateWrapper); + } else { + pageData.setPageShow(SwitchEnum.CLOSE.name()); + } + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.set(PageData::getPageData, pageData.getPageData()); lambdaUpdateWrapper.eq(PageData::getId, pageData.getId()); + lambdaUpdateWrapper.eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), PageData::getPageType, PageEnum.STORE.name()); + lambdaUpdateWrapper.eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), PageData::getNum, UserContext.getCurrentUser().getStoreId()); this.updateById(pageData); return pageData; } @Override + @Transactional(rollbackFor = Exception.class) public PageData releasePageData(String id) { - PageData pageData = this.getById(id); - + PageData pageData = this.getOne(new LambdaQueryWrapper() + .eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), PageData::getPageType, PageEnum.STORE.name()) + .eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), PageData::getNum, UserContext.getCurrentUser().getStoreId()) + .eq(PageData::getId, id)); + if (pageData == null) { + throw new ServiceException(ResultCode.PAGE_NOT_EXIST); + } //如果已经发布,不能重复发布 if (pageData.getPageShow().equals(SwitchEnum.OPEN.name())) { @@ -98,10 +149,18 @@ public class PageDataServiceImpl extends ServiceImpl i } @Override + @Transactional(rollbackFor = Exception.class) public boolean removePageData(String id) { - PageData pageData = this.getById(id); + PageData pageData = this.getOne(new LambdaQueryWrapper() + .eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), PageData::getPageType, PageEnum.STORE.name()) + .eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), PageData::getNum, UserContext.getCurrentUser().getStoreId()) + .eq(PageData::getId, id)); + if (pageData == null) { + throw new ServiceException(ResultCode.PAGE_NOT_EXIST); + } + //专题则直接进行删除 - if (pageData.getPageType().equals(PageEnum.SPECIAL)) { + if (pageData.getPageType().equals(PageEnum.SPECIAL.name())) { return this.removeById(id); } //店铺、平台首页需要判断是否开启,开启则无法删除 @@ -113,11 +172,11 @@ public class PageDataServiceImpl extends ServiceImpl i queryWrapper.eq(pageData.getPageType() != null, "page_type", pageData.getPageType()); queryWrapper.eq(pageData.getPageClientType() != null, "page_client_type", pageData.getPageClientType()); //如果为店铺页面需要设置店铺ID - if (pageData.getPageType().equals(PageEnum.STORE)) { + if (pageData.getPageType().equals(PageEnum.STORE.name())) { queryWrapper.eq(pageData.getNum() != null, "num", pageData.getNum()); } //判断是否为唯一的页面 - if (pageDataMapper.getPageDataNum(queryWrapper) == 1) { + if (this.baseMapper.getPageDataNum(queryWrapper) == 1) { throw new ServiceException(ResultCode.PAGE_DELETE_ERROR); } return this.removeById(id); @@ -137,7 +196,7 @@ public class PageDataServiceImpl extends ServiceImpl i queryWrapper.eq("page_client_type", pageDataDTO.getPageClientType()); - return pageDataMapper.getPageData(queryWrapper); + return this.baseMapper.getPageData(queryWrapper); } @Override @@ -147,7 +206,12 @@ public class PageDataServiceImpl extends ServiceImpl i queryWrapper.eq(pageDataDTO.getNum() != null, "num", pageDataDTO.getNum()); queryWrapper.eq(pageDataDTO.getPageClientType() != null, "page_client_type", pageDataDTO.getPageClientType()); - return pageDataMapper.getPageDataList(PageUtil.initPage(pageVO), queryWrapper); + return this.baseMapper.getPageDataList(PageUtil.initPage(pageVO), queryWrapper); } + + @Override + public PageData getSpecial(String id) { + return this.getById(id); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/page/serviceimpl/SpecialServiceImpl.java b/framework/src/main/java/cn/lili/modules/page/serviceimpl/SpecialServiceImpl.java index b401e3be..70639808 100644 --- a/framework/src/main/java/cn/lili/modules/page/serviceimpl/SpecialServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/page/serviceimpl/SpecialServiceImpl.java @@ -6,29 +6,30 @@ import cn.lili.modules.page.mapper.SpecialMapper; import cn.lili.modules.page.service.PageDataService; import cn.lili.modules.page.service.SpecialService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 专题活动业务层实现 * * @author Bulbasaur - * @date 2020/12/7 11:27 + * @since 2020/12/7 11:27 */ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SpecialServiceImpl extends ServiceImpl implements SpecialService { - //专题 - private final SpecialMapper specialMapper; - //页面数据 - private final PageDataService pageDataService; + /** + * 页面数据 + */ + @Autowired + private PageDataService pageDataService; @Override + @Transactional(rollbackFor = Exception.class) public Special addSpecial(Special special) { //新建页面 - PageData pageData=new PageData(); + PageData pageData = new PageData(); pageDataService.save(pageData); //设置专题页面 @@ -38,10 +39,11 @@ public class SpecialServiceImpl extends ServiceImpl impl } @Override + @Transactional(rollbackFor = Exception.class) public boolean removeSpecial(String id) { //删除页面内容 - Special special=this.getById(id); + Special special = this.getById(id); pageDataService.removeById(special.getPageDataId()); //删除专题 diff --git a/framework/src/main/java/cn/lili/modules/payment/entity/RefundLog.java b/framework/src/main/java/cn/lili/modules/payment/entity/RefundLog.java index 9023b991..c6a0663a 100644 --- a/framework/src/main/java/cn/lili/modules/payment/entity/RefundLog.java +++ b/framework/src/main/java/cn/lili/modules/payment/entity/RefundLog.java @@ -1,8 +1,9 @@ package cn.lili.modules.payment.entity; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -14,34 +15,21 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 退款日志 * * @author Chopper - * @date 2021/1/28 09:21 + * @since 2021/1/28 09:21 */ @Data -@Entity -@Table(name = "li_refund_log") @TableName("li_refund_log") @Builder @NoArgsConstructor @AllArgsConstructor @ApiModel(value = "退款日志") -public class RefundLog { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class RefundLog extends BaseIdEntity { @ApiModelProperty(value = "会员ID") private String memberId; @@ -59,8 +47,11 @@ public class RefundLog { private Double payPrice; @ApiModelProperty(value = "是否已退款") - private Boolean isRefund ; + private Boolean isRefund; + /** + * @see PaymentMethodEnum + */ @ApiModelProperty(value = "退款方式") private String paymentName; diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/enums/CashierEnum.java b/framework/src/main/java/cn/lili/modules/payment/entity/enums/CashierEnum.java similarity index 73% rename from framework/src/main/java/cn/lili/modules/payment/kit/enums/CashierEnum.java rename to framework/src/main/java/cn/lili/modules/payment/entity/enums/CashierEnum.java index f5acc84f..fb93a72a 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/enums/CashierEnum.java +++ b/framework/src/main/java/cn/lili/modules/payment/entity/enums/CashierEnum.java @@ -1,10 +1,10 @@ -package cn.lili.modules.payment.kit.enums; +package cn.lili.modules.payment.entity.enums; /** * 订单类型 * * @author Chopper - * @date 2020-12-19 11:50 + * @since 2020-12-19 11:50 */ public enum CashierEnum { diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/enums/PaymentClientEnum.java b/framework/src/main/java/cn/lili/modules/payment/entity/enums/PaymentClientEnum.java similarity index 84% rename from framework/src/main/java/cn/lili/modules/payment/kit/enums/PaymentClientEnum.java rename to framework/src/main/java/cn/lili/modules/payment/entity/enums/PaymentClientEnum.java index 325cf6e0..9d85a992 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/enums/PaymentClientEnum.java +++ b/framework/src/main/java/cn/lili/modules/payment/entity/enums/PaymentClientEnum.java @@ -1,10 +1,10 @@ -package cn.lili.modules.payment.kit.enums; +package cn.lili.modules.payment.entity.enums; /** * 支付方式枚举 * * @author Chopper - * @date 2020/12/18 18:08 + * @since 2020/12/18 18:08 */ public enum PaymentClientEnum { diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/enums/PaymentMethodEnum.java b/framework/src/main/java/cn/lili/modules/payment/entity/enums/PaymentMethodEnum.java similarity index 78% rename from framework/src/main/java/cn/lili/modules/payment/kit/enums/PaymentMethodEnum.java rename to framework/src/main/java/cn/lili/modules/payment/entity/enums/PaymentMethodEnum.java index 963a1c69..fe8b6973 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/enums/PaymentMethodEnum.java +++ b/framework/src/main/java/cn/lili/modules/payment/entity/enums/PaymentMethodEnum.java @@ -1,16 +1,33 @@ -package cn.lili.modules.payment.kit.enums; +package cn.lili.modules.payment.entity.enums; /** * 支付方式枚举 * * @author Chopper - * @date 2020/12/18 18:08 + * @since 2020/12/18 18:08 */ public enum PaymentMethodEnum { + /** + * 微信 + */ WECHAT("wechatPlugin", "微信"), + /** + * 支付宝 + */ ALIPAY("aliPayPlugin", "支付宝"), + + /** + * 银联-云闪付 + */ + UNIONPAY("unionPayPlugin", "银联-云闪付"), + /** + * 余额支付 + */ WALLET("walletPlugin", "余额支付"), + /** + * 线下转账 + */ BANK_TRANSFER("bankTransferPlugin", "线下转账"); /** diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java b/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java index a289ec9b..77f6454a 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/CashierSupport.java @@ -1,16 +1,15 @@ package cn.lili.modules.payment.kit; import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.SpringContextUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.member.service.MemberWalletService; +import cn.lili.modules.payment.entity.enums.PaymentClientEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.dto.PayParam; -import cn.lili.modules.payment.kit.enums.PaymentClientEnum; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.params.CashierExecute; import cn.lili.modules.payment.kit.params.dto.CashierParam; import cn.lili.modules.system.entity.dos.Setting; @@ -19,7 +18,9 @@ import cn.lili.modules.system.entity.dto.payment.PaymentSupportSetting; import cn.lili.modules.system.entity.dto.payment.dto.PaymentSupportItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.dto.TransferResultDTO; +import cn.lili.modules.wallet.service.MemberWalletService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -32,18 +33,26 @@ import java.util.List; * 收银台工具 * * @author Chopper - * @date 2020-12-19 09:25 + * @since 2020-12-19 09:25 */ @Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CashierSupport { - //收银台 - private final List cashierExecuteList; - //预存款 - private final MemberWalletService memberWalletService; - //配置 - private final SettingService settingService; + /** + * 收银台 + */ + @Autowired + private List cashierExecuteList; + /** + * 预存款 + */ + @Autowired + private MemberWalletService memberWalletService; + /** + * 配置 + */ + @Autowired + private SettingService settingService; /** * 支付 @@ -56,7 +65,7 @@ public class CashierSupport { HttpServletRequest request, HttpServletResponse response, PayParam payParam) { if (paymentClientEnum == null || paymentMethodEnum == null) { - throw new ServiceException("未知的支付方式"); + throw new ServiceException(ResultCode.PAY_NOT_SUPPORT); } //获取支付插件 Payment payment = (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin()); @@ -69,7 +78,7 @@ public class CashierSupport { case APP: return payment.appPay(request, payParam); case JSAPI: - return payment.JSApiPay(request, payParam); + return payment.jsApiPay(request, payParam); case NATIVE: return payment.nativePay(request, payParam); case MP: @@ -135,6 +144,17 @@ public class CashierSupport { payment.notify(request); } + /** + * 用户提现 + * + * @param paymentMethodEnum 支付渠道 + * @param memberWithdrawApply 用户提现申请 + */ + public TransferResultDTO transfer(PaymentMethodEnum paymentMethodEnum, MemberWithdrawApply memberWithdrawApply) { + Payment payment = (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin()); + return payment.transfer(memberWithdrawApply); + } + /** * 获取收银台参数 * @@ -144,20 +164,32 @@ public class CashierSupport { public CashierParam cashierParam(PayParam payParam) { for (CashierExecute paramInterface : cashierExecuteList) { CashierParam cashierParam = paramInterface.getPaymentParams(payParam); - if (cashierParam != null) { - cashierParam.setSupport(support(payParam.getClientType())); - cashierParam.setWalletValue(memberWalletService.getMemberWallet(UserContext.getCurrentUser().getId()).getMemberWallet()); - OrderSetting orderSetting = JSONUtil.toBean(settingService.get(SettingEnum.ORDER_SETTING.name()).getSettingValue(), OrderSetting.class); - Integer minute = orderSetting.getAutoCancel(); - cashierParam.setAutoCancel(cashierParam.getCreateTime().getTime() + minute * 1000 * 60); - return cashierParam; + //如果为空,则表示收银台参数初始化不匹配,继续匹配下一条 + if (cashierParam == null) { + continue; } + //如果订单不需要付款,则抛出异常,直接返回 + if (cashierParam.getPrice() <= 0) { + throw new ServiceException(ResultCode.PAY_UN_WANTED); + } + cashierParam.setSupport(support(payParam.getClientType())); + cashierParam.setWalletValue(memberWalletService.getMemberWallet(UserContext.getCurrentUser().getId()).getMemberWallet()); + OrderSetting orderSetting = JSONUtil.toBean(settingService.get(SettingEnum.ORDER_SETTING.name()).getSettingValue(), OrderSetting.class); + Integer minute = orderSetting.getAutoCancel(); + cashierParam.setAutoCancel(cashierParam.getCreateTime().getTime() + minute * 1000 * 60); + return cashierParam; } - log.error("错误的支付请求:{}", payParam.toString()); throw new ServiceException(ResultCode.PAY_CASHIER_ERROR); } + + /** + * 支付结果 + * + * @param payParam + * @return + */ public Boolean paymentResult(PayParam payParam) { for (CashierExecute cashierExecute : cashierExecuteList) { if (cashierExecute.cashierEnum().name().equals(payParam.getOrderType())) { diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java b/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java index 1308cb24..c0b92fa7 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/Payment.java @@ -1,22 +1,22 @@ package cn.lili.modules.payment.kit; -import cn.hutool.core.net.URLEncoder; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.payment.entity.RefundLog; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.dto.PayParam; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.dto.TransferResultDTO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.nio.charset.StandardCharsets; /** * 支付接口 * * @author Chopper - * @date 2020-12-21 09:32 + * @since 2020-12-21 09:32 */ public interface Payment { /** @@ -38,7 +38,7 @@ public interface Payment { * @param payParam api参数 * @return 公众号内部支付参数 */ - default ResultMessage JSApiPay(HttpServletRequest request, PayParam payParam) { + default ResultMessage jsApiPay(HttpServletRequest request, PayParam payParam) { throw new ServiceException(ResultCode.PAY_ERROR); } @@ -85,17 +85,6 @@ public interface Payment { throw new ServiceException(ResultCode.PAY_ERROR); } - - /** - * 取消支付订单 - * - * @param refundLog 支付参数 - */ - default void cancel(RefundLog refundLog) { - throw new ServiceException(ResultCode.PAY_ERROR); - } - - /** * 回调 * @@ -123,6 +112,13 @@ public interface Payment { throw new ServiceException(ResultCode.PAY_ERROR); } + /** + * 提现 + */ + default TransferResultDTO transfer(MemberWithdrawApply memberWithdrawApply) { + throw new ServiceException(ResultCode.PAY_ERROR); + } + /** * 支付回调地址 * @@ -131,7 +127,7 @@ public interface Payment { * @return 回调地址 */ default String callbackUrl(String api, PaymentMethodEnum paymentMethodEnum) { - return api + "/buyer/cashier/callback/" + paymentMethodEnum.name(); + return api + "/buyer/payment/cashier/callback/" + paymentMethodEnum.name(); } /** @@ -142,7 +138,7 @@ public interface Payment { * @return 异步通知地址 */ default String notifyUrl(String api, PaymentMethodEnum paymentMethodEnum) { - return api + "/buyer/cashier/notify/" + paymentMethodEnum.name(); + return api + "/buyer/payment/cashier/notify/" + paymentMethodEnum.name(); } /** @@ -153,14 +149,7 @@ public interface Payment { * @return 异步通知地址 */ default String refundNotifyUrl(String api, PaymentMethodEnum paymentMethodEnum) { - return api + "/buyer/cashier/refund/notify/" + paymentMethodEnum.name(); - } - - public static void main(String[] args) { - String str = "orderType=TRADE&sn=O202104271386961176205721601"; - System.out.println(str.length()); - URLEncoder urlEncoder = new URLEncoder(); - System.out.println(urlEncoder.encode(str, StandardCharsets.UTF_8)); + return api + "/buyer/payment/cashierRefund/notify/" + paymentMethodEnum.name(); } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/RefundSupport.java b/framework/src/main/java/cn/lili/modules/payment/kit/RefundSupport.java index ce1e7d07..5f8d9dd7 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/RefundSupport.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/RefundSupport.java @@ -2,39 +2,37 @@ package cn.lili.modules.payment.kit; import cn.lili.common.utils.SnowFlake; import cn.lili.common.utils.SpringContextUtil; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.service.AfterSaleService; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.StoreFlowService; import cn.lili.modules.payment.entity.RefundLog; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; -import java.util.Date; /** * 退款支持 * * @author Chopper - * @date 2020-12-19 09:25 + * @since 2020-12-19 09:25 */ @Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class RefundSupport { - //店铺流水 - private final StoreFlowService storeFlowService; - //售后 + /** + * 店铺流水 + */ @Autowired - private AfterSaleService afterSaleService; - - private final OrderService orderService; + private StoreFlowService storeFlowService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; /** * 售后退款 @@ -59,40 +57,10 @@ public class RefundSupport { Payment payment = (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin()); payment.refund(refundLog); - //记录售后单中的退款金额 - afterSaleService.update(new LambdaUpdateWrapper() - .eq(AfterSale::getId, afterSale.getId()) - .set(AfterSale::getRefundTime, new Date())); //记录退款流水 storeFlowService.refundOrder(afterSale); } - /** - * 订单取消 - * - * @param afterSale - */ - public void cancel(AfterSale afterSale) { - - Order order = orderService.getBySn(afterSale.getOrderSn()); - RefundLog refundLog = RefundLog.builder() - .isRefund(false) - .totalAmount(afterSale.getActualRefundPrice()) - .payPrice(afterSale.getActualRefundPrice()) - .memberId(afterSale.getMemberId()) - .paymentName(order.getPaymentMethod()) - .afterSaleNo(afterSale.getSn()) - .paymentReceivableNo(order.getReceivableNo()) - .outOrderNo("AF" + SnowFlake.getIdStr()) - .orderSn(afterSale.getOrderSn()) - .refundReason(afterSale.getReason()) - .build(); - PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.paymentNameOf(order.getPaymentMethod()); - Payment payment = (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin()); - payment.refund(refundLog); - } - - /** * 退款通知 * diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/PaymentHttpResponse.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/PaymentHttpResponse.java index 239303ef..d418940b 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/PaymentHttpResponse.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/PaymentHttpResponse.java @@ -13,7 +13,7 @@ import java.util.Map; * 支付接口响应 * * @author Chopper - * @date 2020/12/18 15:13 + * @since 2020/12/18 15:13 */ public class PaymentHttpResponse implements Serializable { private static final long serialVersionUID = 6089103955998013402L; diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/XmlHelper.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/XmlHelper.java index d6b15471..29979e1e 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/XmlHelper.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/XmlHelper.java @@ -37,32 +37,32 @@ public class XmlHelper { private XmlHelper(InputSource inputSource) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory dbf = getDocumentBuilderFactory(); - // This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all - // XML entity attacks are prevented - // Xerces 2 only - - // http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl + //This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all + //XML entity attacks are prevented + //Xerces 2 only - + //http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - // If you can't completely disable DTDs, then at least do the following: - // Xerces 1 - - // http://xerces.apache.org/xerces-j/features.html#external-general-entities - // Xerces 2 - - // http://xerces.apache.org/xerces2-j/features.html#external-general-entities - // JDK7+ - http://xml.org/sax/features/external-general-entities + //If you can't completely disable DTDs, then at least do the following: + //Xerces 1 - + //http://xerces.apache.org/xerces-j/features.html#external-general-entities + //Xerces 2 - + //http://xerces.apache.org/xerces2-j/features.html#external-general-entities + //JDK7+ - http://xml.org/sax/features/external-general-entities dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - // Xerces 1 - - // http://xerces.apache.org/xerces-j/features.html#external-parameter-entities - // Xerces 2 - - // http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities - // JDK7+ - http://xml.org/sax/features/external-parameter-entities + //Xerces 1 - + //http://xerces.apache.org/xerces-j/features.html#external-parameter-entities + //Xerces 2 - + //http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities + //JDK7+ - http://xml.org/sax/features/external-parameter-entities dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - // Disable external DTDs as well + //Disable external DTDs as well dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); - // and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and - // Entity Attacks" + //and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and + //Entity Attacks" dbf.setXIncludeAware(false); dbf.setExpandEntityReferences(false); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -218,24 +218,24 @@ public class XmlHelper { public Map toMap() { Element root = doc.getDocumentElement(); - // 将节点封装成map形式 + //将节点封装成map形式 NodeList list = root.getChildNodes(); Map params = new HashMap(list.getLength()); for (int i = 0; i < list.getLength(); i++) { Node node = list.item(i); params.put(node.getNodeName(), node.getTextContent()); } - // 含有空白符会生成一个#text参数 + //含有空白符会生成一个#text参数 params.remove("#text"); return params; } private static DocumentBuilderFactory getDocumentBuilderFactory() { - return XmlHelper.XmlHelperHolder.documentBuilderFactory; + return XmlHelperHolder.documentBuilderFactory; } private static XPathFactory getXpathFactory() { - return XmlHelper.XmlHelperHolder.xPathFactory; + return XmlHelperHolder.xPathFactory; } /** @@ -246,4 +246,4 @@ public class XmlHelper { private static XPathFactory xPathFactory = XPathFactory.newInstance(); } -} \ No newline at end of file +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/RequestMethodEnums.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/RequestMethodEnums.java index f98591a1..95419cdb 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/RequestMethodEnums.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/RequestMethodEnums.java @@ -4,7 +4,7 @@ package cn.lili.modules.payment.kit.core.enums; * HTTP 请求的方法 * * @author Chopper - * @date 2021-01-25 15:10 + * @since 2021-01-25 15:10 */ public enum RequestMethodEnums { /** diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/SignType.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/SignType.java index d3994217..b7a605a8 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/SignType.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/enums/SignType.java @@ -4,7 +4,7 @@ package cn.lili.modules.payment.kit.core.enums; * 签名方式 * * @author Chopper - * @date 2021-01-25 15:10 + * @since 2021-01-25 15:10 */ public enum SignType { /** diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/http/AbstractHttpDelegate.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/http/AbstractHttpDelegate.java index 4a4906ff..28bf2645 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/http/AbstractHttpDelegate.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/http/AbstractHttpDelegate.java @@ -1,10 +1,11 @@ package cn.lili.modules.payment.kit.core.http; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.net.SSLContextBuilder; +import cn.hutool.core.net.SSLProtocols; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; -import cn.hutool.http.ssl.SSLSocketFactoryBuilder; import cn.lili.modules.payment.kit.core.PaymentHttpResponse; import javax.net.ssl.KeyManager; @@ -20,7 +21,7 @@ import java.util.Map; * Http 代理类 * * @author Chopper - * @date 2021-01-25 15:10 + * @since 2021-01-25 15:10 */ public abstract class AbstractHttpDelegate { @@ -235,12 +236,12 @@ public abstract class AbstractHttpDelegate { try { File file = FileUtil.newFile(filePath); return HttpRequest.post(url) - .setSSLSocketFactory(SSLSocketFactoryBuilder + .setSSLSocketFactory(SSLContextBuilder .create() .setProtocol(protocol) .setKeyManagers(getKeyManager(certPass, certPath, null)) .setSecureRandom(new SecureRandom()) - .build() + .build().getSocketFactory() ) .header("Content-Type", "multipart/form-data;boundary=\"boundary\"") .form("file", file) @@ -263,7 +264,7 @@ public abstract class AbstractHttpDelegate { * @return {@link String} 请求返回的结果 */ public String upload(String url, String data, String certPath, String certPass, String filePath) { - return upload(url, data, certPath, certPass, filePath, SSLSocketFactoryBuilder.TLSv1); + return upload(url, data, certPath, certPass, filePath, SSLProtocols.TLSv1); } /** @@ -279,12 +280,12 @@ public abstract class AbstractHttpDelegate { public String post(String url, String data, String certPath, String certPass, String protocol) { try { return HttpRequest.post(url) - .setSSLSocketFactory(SSLSocketFactoryBuilder + .setSSLSocketFactory(SSLContextBuilder .create() .setProtocol(protocol) .setKeyManagers(getKeyManager(certPass, certPath, null)) .setSecureRandom(new SecureRandom()) - .build() + .build().getSocketFactory() ) .body(data) .execute() @@ -304,7 +305,7 @@ public abstract class AbstractHttpDelegate { * @return {@link String} 请求返回的结果 */ public String post(String url, String data, String certPath, String certPass) { - return post(url, data, certPath, certPass, SSLSocketFactoryBuilder.TLSv1); + return post(url, data, certPath, certPass, SSLProtocols.TLSv1); } /** @@ -320,12 +321,12 @@ public abstract class AbstractHttpDelegate { public String post(String url, String data, InputStream certFile, String certPass, String protocol) { try { return HttpRequest.post(url) - .setSSLSocketFactory(SSLSocketFactoryBuilder + .setSSLSocketFactory(SSLContextBuilder .create() .setProtocol(protocol) .setKeyManagers(getKeyManager(certPass, null, certFile)) .setSecureRandom(new SecureRandom()) - .build() + .build().getSocketFactory() ) .body(data) .execute() @@ -345,7 +346,7 @@ public abstract class AbstractHttpDelegate { * @return {@link String} 请求返回的结果 */ public String post(String url, String data, InputStream certFile, String certPass) { - return post(url, data, certFile, certPass, SSLSocketFactoryBuilder.TLSv1); + return post(url, data, certFile, certPass, SSLProtocols.TLSv1); } /** diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/HttpKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/HttpKit.java index 767d4ad1..56e26508 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/HttpKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/HttpKit.java @@ -1,6 +1,7 @@ package cn.lili.modules.payment.kit.core.kit; import cn.lili.modules.payment.kit.core.http.AbstractHttpDelegate; +import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; @@ -13,6 +14,7 @@ import java.util.Map; * * @author */ +@Slf4j public class HttpKit { private static AbstractHttpDelegate delegate = new DefaultHttpKit(); @@ -44,7 +46,7 @@ public class HttpKit { try { br.close(); } catch (IOException e) { - e.printStackTrace(); + log.error("readData错误",e); } } } @@ -57,7 +59,7 @@ public class HttpKit { * @return 转化后的 Map */ public static Map toMap(HttpServletRequest request) { - Map params = new HashMap<>(); + Map params = new HashMap<>(16); Map requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { String[] values = requestParams.get(name); diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/IpKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/IpKit.java index cecaed0c..d6c3d606 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/IpKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/IpKit.java @@ -1,7 +1,7 @@ package cn.lili.modules.payment.kit.core.kit; // -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) +//Source code recreated from a .class file by IntelliJ IDEA +//(powered by Fernflower decompiler) // import javax.servlet.http.HttpServletRequest; @@ -29,13 +29,13 @@ public class IpKit { if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } - // 对于通过多个代理的情况,第一个 IP 为客户端真实 IP,多个IP按照','分割 + //对于通过多个代理的情况,第一个 IP 为客户端真实 IP,多个IP按照','分割 if (ip != null && ip.length() > 15) { if (ip.indexOf(",") > 0) { ip = ip.substring(0, ip.indexOf(",")); } } -// return ip; +// return ip; return "27.189.225.9"; } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/PayKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/PayKit.java index 9f94e796..35cb4187 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/PayKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/PayKit.java @@ -8,6 +8,7 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.digest.HmacAlgorithm; import cn.lili.modules.payment.kit.core.XmlHelper; import cn.lili.modules.payment.kit.core.enums.RequestMethodEnums; +import lombok.extern.slf4j.Slf4j; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; @@ -30,9 +31,9 @@ import java.util.*; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/12/18 15:24 */ +@Slf4j public class PayKit { /** @@ -43,7 +44,7 @@ public class PayKit { * @return sha256 字符串 */ public static String hmacSha256(String data, String key) { - return SecureUtil.hmac(HmacAlgorithm.HmacSHA256, key).digestHex(data, CharsetUtil.UTF_8); + return SecureUtil.hmac(HmacAlgorithm.HmacSHA256, key).digestHex(data); } /** @@ -144,7 +145,7 @@ public class PayKit { for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = params.get(key); - // 拼接时,不包括最后一个&字符 + //拼接时,不包括最后一个&字符 if (i == keys.size() - 1) { if (quotes) { content.append(key).append("=").append('"').append(encode ? urlEncode(value) : value).append('"'); @@ -173,7 +174,7 @@ public class PayKit { try { return URLEncoder.encode(src, CharsetUtil.UTF_8).replace("+", "%20"); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + log.error("URL 编码错误",e); return null; } } @@ -194,7 +195,7 @@ public class PayKit { for (Map.Entry entry : params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); - // 略过空值 + //略过空值 if (StrUtil.isEmpty(value)) { continue; } @@ -320,9 +321,9 @@ public class PayKit { if (StrUtil.isEmpty(signMessage)) { return null; } - // 获取商户私钥 + //获取商户私钥 PrivateKey privateKey = PayKit.getPrivateKey(keyPath); - // 生成签名 + //生成签名 return RsaKit.encryptByPrivateKey(signMessage, privateKey); } @@ -338,7 +339,7 @@ public class PayKit { if (StrUtil.isEmpty(signMessage)) { return null; } - // 生成签名 + //生成签名 return RsaKit.encryptByPrivateKey(signMessage, privateKey); } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/QrCodeKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/QrCodeKit.java index 7291fa52..6e730660 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/QrCodeKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/QrCodeKit.java @@ -7,12 +7,11 @@ import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import lombok.extern.slf4j.Slf4j; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; -import java.io.IOException; -import java.io.OutputStream; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; @@ -22,6 +21,7 @@ import java.util.Map; * * @author */ +@Slf4j public class QrCodeKit { /** * 图形码生成工具 @@ -40,7 +40,7 @@ public class QrCodeKit { boolean bool = false; BufferedImage bufImg; Map hints = new HashMap(3); - // 指定纠错等级 + //指定纠错等级 hints.put(EncodeHintType.ERROR_CORRECTION, errorLevel); hints.put(EncodeHintType.MARGIN, margin); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); @@ -50,40 +50,11 @@ public class QrCodeKit { bufImg = MatrixToImageWriter.toBufferedImage(bitMatrix, config); bool = writeToFile(bufImg, format, saveImgFilePath); } catch (Exception e) { - e.printStackTrace(); + log.error("图形码生成工具生成错误",e); } return bool; } - /** - * @param outputStream 可以来自response,也可以来自文件 - * @param contents 内容 - * @param barcodeFormat BarcodeFormat对象 - * @param margin 图片格式,可选[png,jpg,bmp] - * @param errorLevel 纠错级别 一般为:ErrorCorrectionLevel.H - * @param format 图片格式,可选[png,jpg,bmp] - * @param width 宽 - * @param height 高 - */ - public static void encodeOutPutSteam(OutputStream outputStream, String contents, BarcodeFormat barcodeFormat, Integer margin, ErrorCorrectionLevel errorLevel, String format, int width, int height) throws IOException { - Map hints = new HashMap(3); - hints.put(EncodeHintType.ERROR_CORRECTION, errorLevel); - hints.put(EncodeHintType.MARGIN, margin); - hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); - - try { - BitMatrix bitMatrix = (new MultiFormatWriter()).encode(contents, barcodeFormat, width, height, hints); - MatrixToImageWriter.writeToStream(bitMatrix, format, outputStream); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (outputStream != null) { - outputStream.close(); - } - } - - } - /** * @param srcImgFilePath 要解码的图片地址 * @return {Result} @@ -105,7 +76,7 @@ public class QrCodeKit { throw new IllegalArgumentException("Could not decode image."); } } catch (Exception e) { - e.printStackTrace(); + log.error("图片解码错误",e); } return result; } @@ -123,19 +94,8 @@ public class QrCodeKit { try { bool = ImageIO.write(bufImg, format, new File(saveImgFilePath)); } catch (Exception e) { - e.printStackTrace(); + log.error("将BufferedImage对象写入文件错误",e); } return bool; } - - public static void main(String[] args) { - String saveImgFilePath = "/Users//Documents/dev/IJPay/qrCode.png"; - boolean encode = encode("https://gitee.com/205/IJPay", BarcodeFormat.QR_CODE, 3, - ErrorCorrectionLevel.H, "png", 200, 200, saveImgFilePath); - if (encode) { - Result result = decode(saveImgFilePath); - String text = result.getText(); - System.out.println(text); - } - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java index f6d5f06a..e045ea41 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java @@ -2,6 +2,7 @@ package cn.lili.modules.payment.kit.core.kit; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; @@ -19,6 +20,7 @@ import java.util.Map; * * @author */ +@Slf4j public class RsaKit { /** @@ -77,29 +79,7 @@ public class RsaKit { RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2); return (RSAPublicKey) keyFactory.generatePublic(keySpec); } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 使用模和指数生成RSA私钥 - * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA - * /None/NoPadding】 - * - * @param modulus 模 - * @param exponent 指数 - * @return {@link RSAPrivateKey} - */ - public static RSAPrivateKey getPrivateKey(String modulus, String exponent) { - try { - BigInteger b1 = new BigInteger(modulus); - BigInteger b2 = new BigInteger(exponent); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2); - return (RSAPrivateKey) keyFactory.generatePrivate(keySpec); - } catch (Exception e) { - e.printStackTrace(); + log.error("使用模和指数生成RSA公钥错误",e); return null; } } @@ -143,7 +123,7 @@ public class RsaKit { X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key key = keyFactory.generatePublic(x509KeySpec); - // 对数据加密 + //对数据加密 Cipher cipher = Cipher.getInstance(fillMode); cipher.init(Cipher.ENCRYPT_MODE, key); int inputLen = dataByte.length; @@ -151,7 +131,7 @@ public class RsaKit { int offSet = 0; byte[] cache; int i = 0; - // 对数据分段加密 + //对数据分段加密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(dataByte, offSet, MAX_ENCRYPT_BLOCK); @@ -285,7 +265,7 @@ public class RsaKit { int offSet = 0; byte[] cache; int i = 0; - // 对数据分段解密 + //对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/WxPayKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/WxPayKit.java index 2d23e1fc..3e3f3c62 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/WxPayKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/WxPayKit.java @@ -5,6 +5,8 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; import cn.lili.modules.payment.kit.core.PaymentHttpResponse; import cn.lili.modules.payment.kit.core.enums.RequestMethodEnums; import cn.lili.modules.payment.kit.core.enums.SignType; @@ -103,7 +105,7 @@ public class WxPayKit { if (signType == null) { signType = SignType.MD5; } - // 生成签名前先去除sign + //生成签名前先去除sign params.remove(FIELD_SIGN); String tempStr = PayKit.createLinkString(params); String stringSignTemp = tempStr + "&key=" + partnerKey; @@ -114,6 +116,30 @@ public class WxPayKit { } } + /** + * APP 单独生成签名 + * app 支付环境中,如果遇到签名错误,百思不得其解,则可以使用这个方法调用签名尝试解决 + * + * @param params 需要签名的参数 + * @return 签名后的数据 + */ + public static String createAppSign(Map params, String privateKey) { + + String appid = params.get("appid"); + String timestamp = params.get("timestamp"); + String noncestr = params.get("noncestr"); + String prepayid = params.get("prepayid"); + + String encrypt = appid + "\n" + timestamp + "\n" + noncestr + "\n" + prepayid + "\n"; + + try { + return PayKit.createSign(encrypt, privateKey); + } catch (Exception e) { + throw new ServiceException(ResultCode.ERROR); + } + } + + /** * 生成签名 * @@ -122,7 +148,7 @@ public class WxPayKit { * @return 签名后的数据 */ public static String createSign(Map params, String secret) { - // 生成签名前先去除sign + //生成签名前先去除sign params.remove(FIELD_SIGN); String tempStr = PayKit.createLinkString(params); String stringSignTemp = tempStr + "&secret=" + secret; @@ -351,6 +377,8 @@ public class WxPayKit { signType = SignType.MD5; } String packageSign = createSign(packageParams, partnerKey, signType); + // 部分微信APP支付 提示签名错误 解开下方注释 替换上边的代码就好。 + // String packageSign = createAppSign(packageParams, partnerKey); packageParams.put("sign", packageSign); return packageParams; } @@ -432,10 +460,10 @@ public class WxPayKit { public static String buildAuthorization(RequestMethodEnums method, String urlSuffix, String mchId, String serialNo, String keyPath, String body, String nonceStr, long timestamp, String authType) throws Exception { - // 构建签名参数 + //构建签名参数 String buildSignMessage = PayKit.buildSignMessage(method, urlSuffix, timestamp, nonceStr, body); String signature = PayKit.createSign(buildSignMessage, keyPath); - // 根据平台规则生成请求头 authorization + //根据平台规则生成请求头 authorization return PayKit.getAuthorization(mchId, serialNo, nonceStr, String.valueOf(timestamp), signature, authType); } @@ -457,10 +485,10 @@ public class WxPayKit { public static String buildAuthorization(RequestMethodEnums method, String urlSuffix, String mchId, String serialNo, PrivateKey privateKey, String body, String nonceStr, long timestamp, String authType) throws Exception { - // 构建签名参数 + //构建签名参数 String buildSignMessage = PayKit.buildSignMessage(method, urlSuffix, timestamp, nonceStr, body); String signature = PayKit.createSign(buildSignMessage, privateKey); - // 根据平台规则生成请求头 authorization + //根据平台规则生成请求头 authorization return PayKit.getAuthorization(mchId, serialNo, nonceStr, String.valueOf(timestamp), signature, authType); } @@ -585,7 +613,7 @@ public class WxPayKit { */ public static boolean verifySignature(String signature, String body, String nonce, String timestamp, InputStream certInputStream) throws Exception { String buildSignMessage = PayKit.buildSignMessage(timestamp, nonce, body); - // 获取证书 + //获取证书 X509Certificate certificate = PayKit.getCertificate(certInputStream); PublicKey publicKey = certificate.getPublicKey(); return RsaKit.checkByPublicKey(buildSignMessage, signature, publicKey); @@ -624,11 +652,11 @@ public class WxPayKit { public static String verifyNotify(String serialNo, String body, String signature, String nonce, String timestamp, String key, String certPath) throws Exception { BufferedInputStream inputStream = FileUtil.getInputStream(certPath); - // 获取平台证书序列号 + //获取平台证书序列号 X509Certificate certificate = PayKit.getCertificate(inputStream); String serialNumber = certificate.getSerialNumber().toString(16).toUpperCase(); System.out.println(serialNumber); - // 验证证书序列号 + //验证证书序列号 if (serialNumber.equals(serialNo)) { boolean verifySignature = WxPayKit.verifySignature(signature, body, nonce, timestamp, certificate.getPublicKey()); if (verifySignature) { @@ -639,7 +667,7 @@ public class WxPayKit { String associatedData = resource.getStr("associated_data"); AesUtil aesUtil = new AesUtil(key.getBytes(StandardCharsets.UTF_8)); - // 密文解密 + //密文解密 return aesUtil.decryptToString( associatedData.getBytes(StandardCharsets.UTF_8), nonceStr.getBytes(StandardCharsets.UTF_8), @@ -665,7 +693,7 @@ public class WxPayKit { public static String verifyNotify(String serialNo, String body, String signature, String nonce, String timestamp, String key, X509Certificate certificate) throws Exception { String serialNumber = certificate.getSerialNumber().toString(16).toUpperCase(); - // 验证证书序列号 + //验证证书序列号 if (serialNumber.equals(serialNo)) { boolean verifySignature = WxPayKit.verifySignature(signature, body, nonce, timestamp, certificate.getPublicKey()); if (verifySignature) { @@ -676,7 +704,7 @@ public class WxPayKit { String associatedData = resource.getStr("associated_data"); AesUtil aesUtil = new AesUtil(key.getBytes(StandardCharsets.UTF_8)); - // 密文解密 + //密文解密 return aesUtil.decryptToString( associatedData.getBytes(StandardCharsets.UTF_8), nonceStr.getBytes(StandardCharsets.UTF_8), diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/dto/PayParam.java b/framework/src/main/java/cn/lili/modules/payment/kit/dto/PayParam.java index c743ca1d..a0b1f664 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/dto/PayParam.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/dto/PayParam.java @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; * 支付参数 * * @author Chopper - * @date 2020/12/19 11:46 + * @since 2020/12/19 11:46 */ @Data @ToString diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/params/CashierExecute.java b/framework/src/main/java/cn/lili/modules/payment/kit/params/CashierExecute.java index c756bf6d..2385c426 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/params/CashierExecute.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/params/CashierExecute.java @@ -2,14 +2,14 @@ package cn.lili.modules.payment.kit.params; import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; import cn.lili.modules.payment.kit.dto.PayParam; -import cn.lili.modules.payment.kit.enums.CashierEnum; +import cn.lili.modules.payment.entity.enums.CashierEnum; import cn.lili.modules.payment.kit.params.dto.CashierParam; /** * 收银台接口 * * @author Chopper - * @date 2021-01-25 19:08 + * @since 2021-01-25 19:08 */ public interface CashierExecute { diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/params/dto/CashierParam.java b/framework/src/main/java/cn/lili/modules/payment/kit/params/dto/CashierParam.java index 47391397..75bf50d2 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/params/dto/CashierParam.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/params/dto/CashierParam.java @@ -1,5 +1,7 @@ package cn.lili.modules.payment.kit.params.dto; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.utils.StringUtils; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.ToString; @@ -11,12 +13,14 @@ import java.util.List; * 支付参数 * * @author Chopper - * @date 2021-01-25 19:09 + * @since 2021-01-25 19:09 */ @Data @ToString public class CashierParam { + static final Long MAX_DETAIL_LENGTH = 30L; + @ApiModelProperty(value = "价格") private Double price; @@ -41,4 +45,11 @@ public class CashierParam { @ApiModelProperty(value = "剩余余额") private Double walletValue; + + public String getDetail() { + if (CharSequenceUtil.isEmpty(detail)) { + return "清单详细"; + } + return StringUtils.filterSpecialChart(StringUtils.sub(detail, 30)); + } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/OrderCashier.java b/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/OrderCashier.java index bc12803b..0582b54c 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/OrderCashier.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/OrderCashier.java @@ -9,15 +9,14 @@ import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; import cn.lili.modules.payment.kit.dto.PayParam; -import cn.lili.modules.payment.kit.enums.CashierEnum; +import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; +import cn.lili.modules.payment.entity.enums.CashierEnum; import cn.lili.modules.payment.kit.params.CashierExecute; import cn.lili.modules.payment.kit.params.dto.CashierParam; import cn.lili.modules.system.entity.dto.BaseSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -28,16 +27,21 @@ import java.util.List; * 订单支付信息获取 * * @author Chopper - * @date 2021-01-25 20:00 + * @since 2021-01-25 20:00 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderCashier implements CashierExecute { - //订单 - private final OrderService orderService; - //设置 - private final SettingService settingService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; @Override public CashierEnum cashierEnum() { @@ -105,7 +109,7 @@ public class OrderCashier implements CashierExecute { if (payParam.getOrderType().equals(CashierEnum.ORDER.name())) { Order order = orderService.getBySn(payParam.getSn()); if (order != null) { - return order.getPayStatus().equals(PayStatusEnum.PAID.name()); + return PayStatusEnum.PAID.name().equals(order.getPayStatus()); } else { throw new ServiceException(ResultCode.PAY_NOT_EXIST_ORDER); } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/RechargeCashier.java b/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/RechargeCashier.java index 703bb73b..e7be3721 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/RechargeCashier.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/RechargeCashier.java @@ -4,17 +4,16 @@ import cn.hutool.json.JSONUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.order.trade.entity.dos.Recharge; -import cn.lili.modules.order.trade.service.RechargeService; -import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; +import cn.lili.modules.payment.entity.enums.CashierEnum; import cn.lili.modules.payment.kit.dto.PayParam; -import cn.lili.modules.payment.kit.enums.CashierEnum; +import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; import cn.lili.modules.payment.kit.params.CashierExecute; import cn.lili.modules.payment.kit.params.dto.CashierParam; import cn.lili.modules.system.entity.dto.BaseSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.wallet.entity.dos.Recharge; +import cn.lili.modules.wallet.service.RechargeService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -23,16 +22,21 @@ import org.springframework.stereotype.Component; * 充值信息获取 * * @author Chopper - * @date 2021-01-25 20:00 + * @since 2021-01-25 20:00 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class RechargeCashier implements CashierExecute { - //余额 - private final RechargeService rechargeService; - //设置 - private final SettingService settingService; + /** + * 余额 + */ + @Autowired + private RechargeService rechargeService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; @Override @@ -44,7 +48,7 @@ public class RechargeCashier implements CashierExecute { public void paymentSuccess(PaymentSuccessParams paymentSuccessParams) { PayParam payParam = paymentSuccessParams.getPayParam(); if (payParam.getOrderType().equals(CashierEnum.RECHARGE.name())) { - rechargeService.paySuccess(payParam.getSn(), paymentSuccessParams.getReceivableNo()); + rechargeService.paySuccess(payParam.getSn(), paymentSuccessParams.getReceivableNo(),paymentSuccessParams.getPaymentMethod()); log.info("会员充值-订单号{},第三方流水:{}", payParam.getSn(), paymentSuccessParams.getReceivableNo()); } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/TradeCashier.java b/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/TradeCashier.java index f3713c0b..3e6db689 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/TradeCashier.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/params/impl/TradeCashier.java @@ -9,15 +9,14 @@ import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; -import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; import cn.lili.modules.payment.kit.dto.PayParam; -import cn.lili.modules.payment.kit.enums.CashierEnum; +import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; +import cn.lili.modules.payment.entity.enums.CashierEnum; import cn.lili.modules.payment.kit.params.CashierExecute; import cn.lili.modules.payment.kit.params.dto.CashierParam; import cn.lili.modules.system.entity.dto.BaseSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -29,19 +28,27 @@ import java.util.stream.Collectors; * 整笔交易信息获取 * * @author Chopper - * @date 2021-01-25 20:00 + * @since 2021-01-25 20:00 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class TradeCashier implements CashierExecute { - //交易 - private final TradeService tradeService; - //订单 - private final OrderService orderService; - //设置 - private final SettingService settingService; + /** + * 交易 + */ + @Autowired + private TradeService tradeService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; @Override @@ -112,7 +119,7 @@ public class TradeCashier implements CashierExecute { if (payParam.getOrderType().equals(CashierEnum.TRADE.name())) { Trade trade = tradeService.getBySn(payParam.getSn()); if (trade != null) { - return trade.equals(PayStatusEnum.PAID.name()); + return PayStatusEnum.PAID.name().equals(trade.getPayStatus()); } else { throw new ServiceException(ResultCode.PAY_NOT_EXIST_ORDER); } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApi.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApi.java index d6158200..c3770c14 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApi.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApi.java @@ -1,5 +1,6 @@ package cn.lili.modules.payment.kit.plugin.alipay; +import cn.hutool.http.HtmlUtil; import com.alibaba.fastjson.JSONObject; import com.alipay.api.*; import com.alipay.api.domain.*; @@ -22,7 +23,7 @@ import java.util.Map; * 支付宝支付 * * @author Chopper - * @date 2020/12/15 19:26 + * @since 2020/12/15 19:26 */ public class AliPayApi { @@ -244,7 +245,7 @@ public class AliPayApi { */ public static AlipayTradePayResponse tradePayToResponse(AlipayTradePayModel model, String notifyUrl) throws AlipayApiException { AlipayTradePayRequest request = new AlipayTradePayRequest(); - // 填充业务参数 + //填充业务参数 request.setBizModel(model); request.setNotifyUrl(notifyUrl); return doExecute(request); @@ -316,7 +317,7 @@ public class AliPayApi { if (response.isSuccess()) { return true; } else { - // 调用查询接口查询数据 + //调用查询接口查询数据 JSONObject jsonObject = JSONObject.parseObject(result); String outBizNo = jsonObject.getJSONObject("alipay_fund_trans_toaccount_transfer_response").getString("out_biz_no"); AlipayFundTransOrderQueryModel queryModel = new AlipayFundTransOrderQueryModel(); @@ -941,7 +942,7 @@ public class AliPayApi { * @return 转化后的Map */ public static Map toMap(HttpServletRequest request) { - Map params = new HashMap(); + Map params = new HashMap(16); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) { String name = iter.next(); @@ -950,7 +951,7 @@ public class AliPayApi { for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } - params.put(name, valueStr); + params.put(name, HtmlUtil.unescape(valueStr)); } return params; } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApiConfigKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApiConfigKit.java index 119dab5a..2c21c767 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApiConfigKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayApiConfigKit.java @@ -2,7 +2,6 @@ package cn.lili.modules.payment.kit.plugin.alipay; import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONUtil; -import cn.lili.common.enums.MessageCode; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.SpringContextUtil; @@ -20,7 +19,7 @@ import java.util.Date; * AliPayApiConfigKit * * @author Chopper - * @date 2020-12-16 09:31 + * @since 2020-12-16 09:31 */ public class AliPayApiConfigKit { @@ -74,7 +73,7 @@ public class AliPayApiConfigKit { certAlipayRequest.setAlipayPublicCertPath(setting.getAlipayPublicCertPath()); certAlipayRequest.setRootCertPath(setting.getRootCertPath()); defaultAlipayClient = new DefaultAlipayClient(certAlipayRequest); - nextRebuildDate = DateUtil.date(new Date().getTime() + refreshInterval); + nextRebuildDate = DateUtil.date(System.currentTimeMillis()+ refreshInterval); return defaultAlipayClient; } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java index c82e9ab6..1688f519 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayPlugin.java @@ -3,19 +3,22 @@ package cn.lili.modules.payment.kit.plugin.alipay; import cn.hutool.core.net.URLDecoder; import cn.hutool.core.net.URLEncoder; import cn.hutool.json.JSONUtil; +import cn.lili.common.context.ThreadContextHolder; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.properties.ApiProperties; +import cn.lili.common.properties.DomainProperties; +import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.SnowFlake; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.ResultMessage; -import cn.lili.config.properties.ApiProperties; import cn.lili.modules.payment.entity.RefundLog; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.CashierSupport; import cn.lili.modules.payment.kit.Payment; import cn.lili.modules.payment.kit.dto.PayParam; import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.params.dto.CashierParam; import cn.lili.modules.payment.service.PaymentService; import cn.lili.modules.payment.service.RefundLogService; @@ -23,13 +26,14 @@ import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.payment.AlipayPaymentSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.dto.TransferResultDTO; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.*; import com.alipay.api.internal.util.AlipaySignature; -import com.alipay.api.response.AlipayTradeCancelResponse; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; import com.alipay.api.response.AlipayTradeRefundResponse; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -43,55 +47,74 @@ import java.util.Map; * 支付宝支付 * * @author Chopper - * @date 2020/12/17 09:55 + * @since 2020/12/17 09:55 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class AliPayPlugin implements Payment { - //支付日志 - private final PaymentService paymentService; - //退款日志 - private final RefundLogService refundLogService; - //收银台 - private final CashierSupport cashierSupport; - //设置 - private final SettingService settingService; - //API域名 - private final ApiProperties apiProperties; - + /** + * 支付日志 + */ + @Autowired + private PaymentService paymentService; + /** + * 退款日志 + */ + @Autowired + private RefundLogService refundLogService; + /** + * 收银台 + */ + @Autowired + private CashierSupport cashierSupport; + /** + * 设置 + */ + @Autowired + private SettingService settingService; + /** + * API域名 + */ + @Autowired + private ApiProperties apiProperties; + /** + * 域名配置 + */ + @Autowired + private DomainProperties domainProperties; @Override public ResultMessage h5pay(HttpServletRequest request, HttpServletResponse response, PayParam payParam) { - CashierParam cashierParam = cashierSupport.cashierParam(payParam); //请求订单编号 String outTradeNo = SnowFlake.getIdStr(); - + //准备支付参数 AlipayTradeWapPayModel payModel = new AlipayTradeWapPayModel(); payModel.setBody(cashierParam.getTitle()); payModel.setSubject(cashierParam.getDetail()); payModel.setTotalAmount(cashierParam.getPrice() + ""); //回传数据 - payModel.setPassbackParams(URLEncoder.createAll().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8)); + payModel.setPassbackParams(URLEncoder.createAll().encode(BeanUtil.formatKeyValuePair(payParam), StandardCharsets.UTF_8)); //3分钟超时 payModel.setTimeoutExpress("3m"); payModel.setOutTradeNo(outTradeNo); payModel.setProductCode("QUICK_WAP_PAY"); try { + log.info("支付宝H5支付:{}", JSONUtil.toJsonStr(payModel)); AliPayRequest.wapPay(response, payModel, callbackUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY), notifyUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY)); } catch (Exception e) { - e.printStackTrace(); + log.error("H5支付异常", e); + throw new ServiceException(ResultCode.ALIPAY_EXCEPTION); } return null; } @Override - public ResultMessage JSApiPay(HttpServletRequest request, PayParam payParam) { - throw new ServiceException("当前支付通道暂不支持"); + public ResultMessage jsApiPay(HttpServletRequest request, PayParam payParam) { + throw new ServiceException(ResultCode.PAY_NOT_SUPPORT); } @Override @@ -111,15 +134,20 @@ public class AliPayPlugin implements Payment { //3分钟超时 payModel.setTimeoutExpress("3m"); //回传数据 - payModel.setPassbackParams(URLEncoder.createAll().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8)); + payModel.setPassbackParams(URLEncoder.createAll().encode(BeanUtil.formatKeyValuePair(payParam), StandardCharsets.UTF_8)); payModel.setOutTradeNo(outTradeNo); payModel.setProductCode("QUICK_MSECURITY_PAY"); + log.info("支付宝APP支付:{}", payModel); String orderInfo = AliPayRequest.appPayToResponse(payModel, notifyUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY)).getBody(); + log.info("支付宝APP支付返回内容:{}", orderInfo); return ResultUtil.data(orderInfo); } catch (AlipayApiException e) { - e.printStackTrace(); - return ResultUtil.error(ResultCode.PAY_ERROR); + log.error("支付宝支付异常:", e); + throw new ServiceException(ResultCode.ALIPAY_EXCEPTION); + } catch (Exception e) { + log.error("支付业务异常:", e); + throw new ServiceException(ResultCode.PAY_ERROR); } } @@ -139,18 +167,20 @@ public class AliPayPlugin implements Payment { payModel.setTotalAmount(cashierParam.getPrice() + ""); //回传数据 - payModel.setPassbackParams(URLEncoder.createAll().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8)); -// payModel.setStoreId("store_id"); + payModel.setPassbackParams(URLEncoder.createAll().encode(BeanUtil.formatKeyValuePair(payParam), StandardCharsets.UTF_8)); payModel.setTimeoutExpress("3m"); payModel.setOutTradeNo(outTradeNo); + log.info("支付宝扫码:{}", payModel); + String resultStr = + AliPayRequest.tradePrecreatePayToResponse(payModel, notifyUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY)).getBody(); - String resultStr = AliPayRequest.tradePrecreatePayToResponse(payModel, notifyUrl(apiProperties.getBuyer(), PaymentMethodEnum.ALIPAY)).getBody(); + log.info("支付宝扫码交互返回:{}", resultStr); JSONObject jsonObject = JSONObject.parseObject(resultStr); return ResultUtil.data(jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code")); } catch (Exception e) { - e.printStackTrace(); + log.error("支付业务异常:", e); + throw new ServiceException(ResultCode.PAY_ERROR); } - return null; } @@ -161,11 +191,12 @@ public class AliPayPlugin implements Payment { if (StringUtils.isNotEmpty(refundLog.getPaymentReceivableNo())) { model.setTradeNo(refundLog.getPaymentReceivableNo()); } else { - throw new ServiceException(ResultCode.ERROR); + throw new ServiceException(ResultCode.ALIPAY_PARAMS_EXCEPTION); } model.setRefundAmount(refundLog.getTotalAmount() + ""); model.setRefundReason(refundLog.getRefundReason()); model.setOutRequestNo(refundLog.getOutOrderNo()); + //交互退款 try { AlipayTradeRefundResponse alipayTradeRefundResponse = AliPayApi.tradeRefundToResponse(model); log.error("支付宝退款,参数:{},支付宝响应:{}", JSONUtil.toJsonStr(model), JSONUtil.toJsonStr(alipayTradeRefundResponse)); @@ -173,38 +204,17 @@ public class AliPayPlugin implements Payment { refundLog.setIsRefund(true); refundLog.setReceivableNo(refundLog.getOutOrderNo()); } else { - refundLog.setErrorMessage(String.format("错误码:%s,错误原因:%s", alipayTradeRefundResponse.getSubCode(), alipayTradeRefundResponse.getSubMsg())); + refundLog.setErrorMessage(String.format("错误码:%s,错误原因:%s", alipayTradeRefundResponse.getSubCode(), + alipayTradeRefundResponse.getSubMsg())); } refundLogService.save(refundLog); } catch (Exception e) { - e.printStackTrace(); + log.error("支付退款异常:", e); + throw new ServiceException(ResultCode.PAY_ERROR); } } - @Override - public void cancel(RefundLog refundLog) { - AlipayTradeCancelModel model = new AlipayTradeCancelModel(); - //这里取支付回调时返回的流水 - if (StringUtils.isNotEmpty(refundLog.getPaymentReceivableNo())) { - model.setTradeNo(refundLog.getPaymentReceivableNo()); - } else { - throw new ServiceException(ResultCode.ERROR); - } - try { - AlipayTradeCancelResponse alipayTradeCancelResponse = AliPayApi.tradeCancelToResponse(model); - if (alipayTradeCancelResponse.isSuccess()) { - refundLog.setIsRefund(true); - refundLog.setReceivableNo(refundLog.getOutOrderNo()); - } else { - refundLog.setErrorMessage(String.format("错误码:%s,错误原因:%s", alipayTradeCancelResponse.getSubCode(), alipayTradeCancelResponse.getSubMsg())); - } - refundLogService.save(refundLog); - } catch (Exception e) { - e.printStackTrace(); - } - } - @Override public void refundNotify(HttpServletRequest request) { //不需要实现 @@ -212,8 +222,9 @@ public class AliPayPlugin implements Payment { @Override public void callBack(HttpServletRequest request) { - verifyNotify(request); log.info("支付同步回调:"); + callback(request); + } @Override @@ -222,6 +233,70 @@ public class AliPayPlugin implements Payment { log.info("支付异步通知:"); } + /** + * 支付宝提现 + * 文档地址:https://opendocs.alipay.com/open/02byuo?scene=ca56bca529e64125a2786703c6192d41&ref=api + * + * @param memberWithdrawApply 会员提现申请 + */ + @Override + public TransferResultDTO transfer(MemberWithdrawApply memberWithdrawApply) { + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + model.setOutBizNo(SnowFlake.createStr("T")); + model.setRemark("用户提现"); + model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}"); + model.setBizScene("DIRECT_TRANSFER"); + Participant payeeInfo = new Participant(); + payeeInfo.setIdentity(memberWithdrawApply.getConnectNumber()); + payeeInfo.setIdentityType("ALIPAY_LOGON_ID"); + payeeInfo.setName(memberWithdrawApply.getRealName()); + model.setPayeeInfo(payeeInfo); + + model.setTransAmount(memberWithdrawApply.getApplyMoney().toString()); + model.setProductCode("TRANS_ACCOUNT_NO_PWD"); + model.setOrderTitle("用户提现"); + //交互退款 + try { + AlipayFundTransUniTransferResponse alipayFundTransUniTransferResponse = AliPayApi.uniTransferToResponse(model, null); + log.error("支付宝退款,参数:{},支付宝响应:{}", JSONUtil.toJsonStr(model), JSONUtil.toJsonStr(alipayFundTransUniTransferResponse)); + if (alipayFundTransUniTransferResponse.isSuccess()) { + return TransferResultDTO.builder().result(true).build(); + } else { + log.error(alipayFundTransUniTransferResponse.getSubMsg()); + return TransferResultDTO.builder().result(false).response(alipayFundTransUniTransferResponse.getSubMsg()).build(); + } + } catch (Exception e) { + log.error("用户提现异常:", e); + return TransferResultDTO.builder().result(false).response(e.getMessage()).build(); + } + } + + /** + * 验证支付结果 + * + * @param request + */ + private void callback(HttpServletRequest request) { + try { + AlipayPaymentSetting alipayPaymentSetting = alipayPaymentSetting(); + //获取支付宝反馈信息 + Map map = AliPayApi.toMap(request); + log.info("同步回调:{}", JSONUtil.toJsonStr(map)); + boolean verifyResult = AlipaySignature.rsaCertCheckV1(map, alipayPaymentSetting.getAlipayPublicCertPath(), "UTF-8", + "RSA2"); + if (verifyResult) { + log.info("支付回调通知:支付成功-参数:{}", map); + } else { + log.info("支付回调通知:支付失败-参数:{}", map); + } + + ThreadContextHolder.getHttpResponse().sendRedirect(domainProperties.getWap() + "/pages/order/myOrder?status=0"); + } catch (Exception e) { + log.error("支付回调同步通知异常", e); + } + + } + /** * 验证支付结果 * @@ -230,15 +305,19 @@ public class AliPayPlugin implements Payment { private void verifyNotify(HttpServletRequest request) { try { AlipayPaymentSetting alipayPaymentSetting = alipayPaymentSetting(); - // 获取支付宝反馈信息 + //获取支付宝反馈信息 Map map = AliPayApi.toMap(request); log.info("支付回调响应:{}", JSONUtil.toJsonStr(map)); boolean verifyResult = AlipaySignature.rsaCertCheckV1(map, alipayPaymentSetting.getAlipayPublicCertPath(), "UTF-8", "RSA2"); - + //支付完成判定 + if (!"TRADE_FINISHED".equals(map.get("trade_status")) && + !"TRADE_SUCCESS".equals(map.get("trade_status"))) { + return; + } String payParamStr = map.get("passback_params"); String payParamJson = URLDecoder.decode(payParamStr, StandardCharsets.UTF_8); - PayParam payParam = JSONUtil.toBean(payParamJson, PayParam.class); + PayParam payParam = BeanUtil.formatKeyValuePair(payParamJson, new PayParam()); if (verifyResult) { @@ -253,8 +332,7 @@ public class AliPayPlugin implements Payment { log.info("支付回调通知:支付失败-参数:{}", map); } } catch (AlipayApiException e) { - e.printStackTrace(); - throw new ServiceException("支付回调通知异常"); + log.error("支付回调通知异常", e); } } @@ -269,7 +347,7 @@ public class AliPayPlugin implements Payment { if (setting != null) { return JSONUtil.toBean(setting.getSettingValue(), AlipayPaymentSetting.class); } - throw new ServiceException("支付未配置"); + throw new ServiceException(ResultCode.ALIPAY_NOT_SETTING); } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayRequest.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayRequest.java index ceb0d134..8a6f9982 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayRequest.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/alipay/AliPayRequest.java @@ -13,6 +13,7 @@ import com.alipay.api.request.AlipayTradePrecreateRequest; import com.alipay.api.request.AlipayTradeWapPayRequest; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.alipay.api.response.AlipayTradePrecreateResponse; +import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -22,9 +23,9 @@ import java.io.PrintWriter; * 支付宝支付 * * @author Chopper - * @date 2020/12/15 19:26 + * @since 2020/12/15 19:26 */ - +@Slf4j public class AliPayRequest { /** @@ -40,7 +41,7 @@ public class AliPayRequest { public static void wapPay(HttpServletResponse response, AlipayTradeWapPayModel model, String returnUrl, String notifyUrl) throws AlipayApiException, IOException { String form = wapPayStr(model, returnUrl, notifyUrl); response.setContentType("text/html;charset=UTF-8"); - + log.info("支付表单{}", form); PrintWriter out = response.getWriter(); out.write(form); out.flush(); diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bankTransfer/BankTransferPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bank/BankTransferPlugin.java similarity index 78% rename from framework/src/main/java/cn/lili/modules/payment/kit/plugin/bankTransfer/BankTransferPlugin.java rename to framework/src/main/java/cn/lili/modules/payment/kit/plugin/bank/BankTransferPlugin.java index 529f9427..3113c585 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bankTransfer/BankTransferPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bank/BankTransferPlugin.java @@ -1,16 +1,15 @@ -package cn.lili.modules.payment.kit.plugin.bankTransfer; +package cn.lili.modules.payment.kit.plugin.bank; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.payment.entity.RefundLog; import cn.lili.modules.payment.kit.Payment; import cn.lili.modules.payment.kit.dto.PayParam; import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.params.dto.CashierParam; import cn.lili.modules.payment.service.PaymentService; import cn.lili.modules.payment.service.RefundLogService; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -24,11 +23,16 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class BankTransferPlugin implements Payment { - //退款日志 - private final RefundLogService refundLogService; - //支付日志 + /** + * 退款日志 + */ + @Autowired + private RefundLogService refundLogService; + /** + * 支付日志 + */ + @Autowired private PaymentService paymentService; @Override @@ -37,7 +41,7 @@ public class BankTransferPlugin implements Payment { refundLog.setIsRefund(true); refundLogService.save(refundLog); } catch (Exception e) { - e.printStackTrace(); + log.error("线下收款错误",e); } } @@ -69,9 +73,4 @@ public class BankTransferPlugin implements Payment { log.info("支付回调通知:线上支付:{}", payParam); } - @Autowired - private void setPaymentService(PaymentService paymentService) { - this.paymentService = paymentService; - } - } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApi.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApi.java new file mode 100644 index 00000000..7f10c265 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApi.java @@ -0,0 +1,38 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付接口

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay; + +import cn.lili.modules.payment.kit.core.kit.HttpKit; +import cn.lili.modules.payment.kit.core.kit.WxPayKit; + +import java.util.Map; + +public class UnionPayApi { + public static String authUrl = "https://qr.95516.com/qrcGtwWeb-web/api/userAuth?version=1.0.0&redirectUrl=%s"; + + public static String execution(String url, Map params) { + return HttpKit.getDelegate().post(url, WxPayKit.toXml(params)); + } + + /** + * 获取用户授权 API + * + * @param url 回调地址,可以自定义参数 https://pay.javen.com/callback?sdk=ijpay + * @return 银联重定向 Url + */ + public static String buildAuthUrl(String url) { + return String.format(authUrl, url); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApiConfig.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApiConfig.java new file mode 100644 index 00000000..66ea9f1c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApiConfig.java @@ -0,0 +1,57 @@ + +package cn.lili.modules.payment.kit.plugin.unionpay; + +import lombok.*; + +import java.io.Serializable; + +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付常用配置

+ * + * @author Javen + */ +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UnionPayApiConfig implements Serializable { + private static final long serialVersionUID = -9025648880068727445L; + + /** + * 商户平台分配的账号 + */ + private String mchId; + /** + * 连锁商户号 + */ + private String groupMchId; + /** + * 授权交易机构代码 + */ + private String agentMchId; + /** + * 商户平台分配的密钥 + */ + private String apiKey; + /** + * 商户平台网关 + */ + private String serverUrl; + /** + * 应用域名,回调中会使用此参数 + */ + private String domain; + /** + * 其他附加参数 + */ + private Object exParams; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApiConfigKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApiConfigKit.java new file mode 100644 index 00000000..9f5dc3f0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayApiConfigKit.java @@ -0,0 +1,87 @@ + +package cn.lili.modules.payment.kit.plugin.unionpay; + +import cn.hutool.core.util.StrUtil; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付常用配置 Kit

+ * + * @author Javen + */ +public class UnionPayApiConfigKit { + private static final ThreadLocal TL = new ThreadLocal(); + + private static final Map CFG_MAP = new ConcurrentHashMap(); + private static final String DEFAULT_CFG_KEY = "_default_key_"; + + /** + * 添加云闪付配置,每个 mchId 只需添加一次,相同 mchId 将被覆盖 + * + * @param UnionPayApiConfig 云闪付配置 + * @return {@link UnionPayApiConfig} 云闪付配置 + */ + public static UnionPayApiConfig putApiConfig(UnionPayApiConfig UnionPayApiConfig) { + if (CFG_MAP.size() == 0) { + CFG_MAP.put(DEFAULT_CFG_KEY, UnionPayApiConfig); + } + return CFG_MAP.put(UnionPayApiConfig.getMchId(), UnionPayApiConfig); + } + + public static UnionPayApiConfig setThreadLocalApiConfig(UnionPayApiConfig UnionPayApiConfig) { + if (StrUtil.isNotEmpty(UnionPayApiConfig.getMchId())) { + setThreadLocalMchId(UnionPayApiConfig.getMchId()); + } + return putApiConfig(UnionPayApiConfig); + } + + public static UnionPayApiConfig removeApiConfig(UnionPayApiConfig UnionPayApiConfig) { + return removeApiConfig(UnionPayApiConfig.getMchId()); + } + + public static UnionPayApiConfig removeApiConfig(String mchId) { + return CFG_MAP.remove(mchId); + } + + public static void setThreadLocalMchId(String mchId) { + if (StrUtil.isEmpty(mchId)) { + mchId = CFG_MAP.get(DEFAULT_CFG_KEY).getMchId(); + } + TL.set(mchId); + } + + public static void removeThreadLocalMchId() { + TL.remove(); + } + + public static String getMchId() { + String appId = TL.get(); + if (StrUtil.isEmpty(appId)) { + appId = CFG_MAP.get(DEFAULT_CFG_KEY).getMchId(); + } + return appId; + } + + public static UnionPayApiConfig getApiConfig() { + String appId = getMchId(); + return getApiConfig(appId); + } + + public static UnionPayApiConfig getApiConfig(String appId) { + UnionPayApiConfig cfg = CFG_MAP.get(appId); + if (cfg == null) { + throw new IllegalStateException("需事先调用 UnionPayApiConfigKit.putApiConfig(UnionPayApiConfig) 将 mchId 对应的 UnionPayApiConfig 对象存入,才可以使用 UnionPayApiConfigKit.getUnionPayApiConfig() 的系列方法"); + } + return cfg; + } +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayPlugin.java new file mode 100644 index 00000000..ebcd9d59 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/UnionPayPlugin.java @@ -0,0 +1,247 @@ +package cn.lili.modules.payment.kit.plugin.unionpay; + +import cn.hutool.core.net.URLEncoder; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.SnowFlake; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.payment.kit.CashierSupport; +import cn.lili.modules.payment.kit.Payment; +import cn.lili.modules.payment.kit.core.enums.SignType; +import cn.lili.modules.payment.kit.core.kit.HttpKit; +import cn.lili.modules.payment.kit.core.kit.IpKit; +import cn.lili.modules.payment.kit.core.kit.WxPayKit; +import cn.lili.modules.payment.kit.dto.PayParam; +import cn.lili.modules.payment.kit.params.dto.CashierParam; +import cn.lili.modules.payment.kit.plugin.unionpay.enums.ServiceEnum; +import cn.lili.modules.payment.kit.plugin.unionpay.model.UnifiedOrderModel; +import cn.lili.modules.payment.service.PaymentService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.payment.UnionPaymentSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * 银联云闪付 支付 + * + * @author Bulbasaur + * @since 2023/02/14 17:44 + */ +@Slf4j +@Component +public class UnionPayPlugin implements Payment { + + + /** + * 收银台 + */ + @Autowired + private CashierSupport cashierSupport; + /** + * 支付日志 + */ + @Autowired + private PaymentService paymentService; + /** + * 配置 + */ + @Autowired + private SettingService settingService; + + @Override + public ResultMessage nativePay(HttpServletRequest request, PayParam payParam) { + try { + CashierParam cashierParam = cashierSupport.cashierParam(payParam); + UnionPaymentSetting unionPaymentSetting = this.unionPaymentSetting(); + String notifyUrl = unionPaymentSetting.getUnionPayDomain().concat("/unionPay/payNotify"); + //用户ip + String ip = IpKit.getRealIp(request); + //第三方付款订单 + String outOrderNo = SnowFlake.getIdStr(); + String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); + Map params = UnifiedOrderModel.builder() + .service(ServiceEnum.NATIVE.toString()) + .mch_id(unionPaymentSetting.getUnionPayMachId()) + .out_trade_no(outOrderNo) + .body(cashierParam.getDetail()) + .attach(attach) + .total_fee("0") + .mch_create_ip(ip) + .notify_url(notifyUrl) + .nonce_str(WxPayKit.generateStr()) + .build().createSign(unionPaymentSetting.getUnionPayKey(), SignType.MD5); + + String xmlResult = UnionPayApi.execution(unionPaymentSetting.getUnionPayServerUrl(), params); + log.info("xmlResult:" + xmlResult); + Map result = WxPayKit.xmlToMap(xmlResult); + log.info(result.toString()); + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Override + public ResultMessage appPay(HttpServletRequest request, PayParam payParam) { + try { + + CashierParam cashierParam = cashierSupport.cashierParam(payParam); + UnionPaymentSetting unionPaymentSetting = this.unionPaymentSetting(); + String notifyUrl = unionPaymentSetting.getUnionPayDomain().concat("/unionPay/payNotify"); + String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); + + //用户ip + String ip = IpKit.getRealIp(request); + Map params = UnifiedOrderModel.builder() + .service(ServiceEnum.WEI_XIN_APP_PAY.toString()) + .mch_id(unionPaymentSetting.getUnionPayMachId()) + .appid(unionPaymentSetting.getUnionPayAppId()) + .out_trade_no(WxPayKit.generateStr()) + .body(cashierParam.getDetail()) + .attach(attach) + .total_fee("0") + .mch_create_ip(ip) + .notify_url(notifyUrl) + .nonce_str(WxPayKit.generateStr()) + .build() + .createSign(unionPaymentSetting.getUnionPayKey(), SignType.MD5); + + System.out.println(params); + + String xmlResult = UnionPayApi.execution(unionPaymentSetting.getUnionPayServerUrl(), params); + log.info("xmlResult:" + xmlResult); + Map result = WxPayKit.xmlToMap(xmlResult); + if (!WxPayKit.verifyNotify(result, unionPaymentSetting.getUnionPayKey(), SignType.MD5)) { + log.error("签名异常"); + } + String status = result.get("status"); + String resultCode = result.get("result_code"); + if (!"0".equals(status) && !"0".equals(resultCode)) { + log.error(result.get("err_msg")); + return null; + } + log.error(result.get("pay_info")); + return null; + } catch (Exception e) { + log.error(e.getMessage()); + e.printStackTrace(); + + return null; + + } + } + + @Override + public ResultMessage jsApiPay(HttpServletRequest request, PayParam payParam) { + String buyerLogonId=""; + String buyerId=""; + CashierParam cashierParam = cashierSupport.cashierParam(payParam); + UnionPaymentSetting unionPaymentSetting = this.unionPaymentSetting(); + String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); + //用户ip + String ip = IpKit.getRealIp(request); + try { + if (StrUtil.isEmpty(buyerLogonId) && StrUtil.isEmpty(buyerId)) { + log.error("buyer_logon_id buyer_id 不能同时为空"); + return null; + } + + String notifyUrl = unionPaymentSetting.getUnionPayDomain().concat("/unionPay/payNotify"); + + + Map params = UnifiedOrderModel.builder() + .service(ServiceEnum.ALI_PAY_JS_PAY.toString()) + .mch_id(unionPaymentSetting.getUnionPayMachId()) + .out_trade_no(WxPayKit.generateStr()) + .body(cashierParam.getDetail()) + .attach(attach) + .total_fee("0") + .mch_create_ip(ip) + .notify_url(notifyUrl) + .nonce_str(WxPayKit.generateStr()) + .buyer_id(buyerId) + .buyer_logon_id(buyerLogonId) + .build() + .createSign(unionPaymentSetting.getUnionPayKey(), SignType.MD5); + + System.out.println(params); + + String xmlResult = UnionPayApi.execution(unionPaymentSetting.getUnionPayServerUrl(), params); + log.info("xmlResult:" + xmlResult); + Map result = WxPayKit.xmlToMap(xmlResult); + log.info(result.toString()); + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + + @Override + public void callBack(HttpServletRequest request) { + try { + verifyNotify(request); + } catch (Exception e) { + log.error("支付异常", e); + } + } + + @Override + public void notify(HttpServletRequest request) { + try { + verifyNotify(request); + } catch (Exception e) { + log.error("支付异常", e); + } + } + + private void verifyNotify(HttpServletRequest request) throws Exception { + String xmlMsg = HttpKit.readData(request); + log.info("支付通知=" + xmlMsg); + Map params = WxPayKit.xmlToMap(xmlMsg); + + String status = params.get("status"); + String returnCode = params.get("result_code"); + + log.info(status + " " + returnCode); + + if ("0".equals(status) && "0".equals(returnCode)) { + UnionPaymentSetting unionPaymentSetting = this.unionPaymentSetting(); + // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态 + // 注意此处签名方式需与统一下单的签名类型一致 + if (WxPayKit.verifyNotify(params, unionPaymentSetting.getUnionPayKey(), SignType.MD5)) { + log.info("支付成功...."); + // 更新订单信息 + // 发送通知等 + + } + } + + } + /** + * 获取微信支付配置 + * + * @return + */ + private UnionPaymentSetting unionPaymentSetting() { + try { + Setting systemSetting = settingService.get(SettingEnum.UNIONPAY_PAYMENT.name()); + UnionPaymentSetting unionPaymentSetting = JSONUtil.toBean(systemSetting.getSettingValue(), UnionPaymentSetting.class); + return unionPaymentSetting; + } catch (Exception e) { + log.error("微信支付暂不支持", e); + throw new ServiceException(ResultCode.PAY_NOT_SUPPORT); + } + } +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/enums/ServiceEnum.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/enums/ServiceEnum.java new file mode 100644 index 00000000..856dc00a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/enums/ServiceEnum.java @@ -0,0 +1,95 @@ +package cn.lili.modules.payment.kit.plugin.unionpay.enums; + +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付接口类型枚举

+ * + * @author Javen + */ +public enum ServiceEnum { + /** + * 刷卡支付 + */ + MICRO_PAY("unified.trade.micropay"), + /** + * 扫码支付 + */ + NATIVE("unified.trade.native"), + /** + * 微信公众号、小程序支付统一下单 + */ + WEI_XIN_JS_PAY("pay.weixin.jspay"), + /** + * 微信 App 支付 + */ + WEI_XIN_APP_PAY("pay.weixin.raw.app"), + /** + * 查询订单 + */ + QUERY("unified.trade.query"), + /** + * 申请退款 + */ + REFUND("unified.trade.refund"), + /** + * 退款查询 + */ + REFUND_QUERY("unified.trade.refundquery"), + /** + * 关闭订单 + */ + CLOSE("unified.trade.close"), + /** + * 撤销订单 + */ + MICRO_PAY_REVERSE("unified.micropay.reverse"), + /** + * 授权码查询 openid + */ + AUTH_CODE_TO_OPENID("unified.tools.authcodetoopenid"), + /** + * 银联 JS 支付获取 userId + */ + UNION_PAY_USER_ID("pay.unionpay.userid"), + /** + * 银联 JS 支付下单 + */ + UNION_JS_PAY("pay.unionpay.jspay"), + /** + * 支付宝服务窗口支付 + */ + ALI_PAY_JS_PAY("pay.alipay.jspay"), + /** + * 下载单个商户时的对账单 + */ + BILL_MERCHANT("pay.bill.merchant"), + /** + * 下载连锁商户下所有门店的对账单 + */ + BILL_BIG_MERCHANT("pay.bill.bigMerchant"), + /** + * 下载某内部机构/外包服务机构下所有商户的对账单 + */ + BILL_AGENT("pay.bill.agent"); + + /** + * 接口类型 + */ + private final String service; + + ServiceEnum(String domain) { + this.service = domain; + } + + @Override + public String toString() { + return service; + } +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/ApplyModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/ApplyModel.java new file mode 100644 index 00000000..c440a65c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/ApplyModel.java @@ -0,0 +1,55 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-商户进件

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class ApplyModel extends BaseModel{ + /** + * 合作伙伴 ID 即机构号 + */ + private String partner; + /** + * 服务名称 + */ + private String serviceName; + /** + * 支持 MD5 和RSA,默认为MD5 + */ + private String signType; + /** + * 字符集,默认为UTF-8 + */ + private String charset; + /** + * 请求数据 + */ + private String data; + /** + * 数据类型 + */ + private String dataType; + /** + * 数据签名 + */ + private String dataSign; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/AuthCodeToOpenIdModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/AuthCodeToOpenIdModel.java new file mode 100644 index 00000000..ef0cab1e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/AuthCodeToOpenIdModel.java @@ -0,0 +1,37 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-授权码查询 openId

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class AuthCodeToOpenIdModel extends BaseModel{ + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String sub_appid; + private String auth_code; + private String nonce_str; + private String sign; + private String sign_agentno; + private String groupno; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/BaseModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/BaseModel.java new file mode 100644 index 00000000..1935bb59 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/BaseModel.java @@ -0,0 +1,105 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

Model 公用方法

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import cn.hutool.core.util.StrUtil; +import cn.lili.modules.payment.kit.core.enums.SignType; +import cn.lili.modules.payment.kit.core.kit.WxPayKit; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class BaseModel { + + /** + * 将建构的 builder 转为 Map + * + * @return 转化后的 Map + */ + public Map toMap() { + String[] fieldNames = getFiledNames(this); + HashMap map = new HashMap(fieldNames.length); + for (String name : fieldNames) { + String value = (String) getFieldValueByName(name, this); + if (StrUtil.isNotEmpty(value)) { + map.put(name, value); + } + } + return map; + } + + /** + * 构建签名 Map + * + * @param partnerKey API KEY + * @param signType {@link SignType} 签名类型 + * @return 构建签名后的 Map + */ + public Map createSign(String partnerKey, SignType signType) { + return createSign(partnerKey, signType, true); + } + + /** + * 构建签名 Map + * + * @param partnerKey API KEY + * @param signType {@link SignType} 签名类型 + * @param haveSignType 签名是否包含 sign_type 字段 + * @return 构建签名后的 Map + */ + public Map createSign(String partnerKey, SignType signType, boolean haveSignType) { + return WxPayKit.buildSign(toMap(), partnerKey, signType, haveSignType); + } + + + + /** + * 获取属性名数组 + * + * @param obj 对象 + * @return 返回对象属性名数组 + */ + public String[] getFiledNames(Object obj) { + Field[] fields = obj.getClass().getDeclaredFields(); + String[] fieldNames = new String[fields.length]; + for (int i = 0; i < fields.length; i++) { + fieldNames[i] = fields[i].getName(); + } + return fieldNames; + } + + /** + * 根据属性名获取属性值 + * + * @param fieldName 属性名称 + * @param obj 对象 + * @return 返回对应属性的值 + */ + public Object getFieldValueByName(String fieldName, Object obj) { + try { + String firstLetter = fieldName.substring(0, 1).toUpperCase(); + String getter = new StringBuffer().append("get") + .append(firstLetter) + .append(fieldName.substring(1)) + .toString(); + Method method = obj.getClass().getMethod(getter); + return method.invoke(obj); + } catch (Exception e) { + return null; + } + } + +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/BillDownloadModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/BillDownloadModel.java new file mode 100644 index 00000000..90049165 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/BillDownloadModel.java @@ -0,0 +1,35 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-下单对账单

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class BillDownloadModel extends BaseModel{ + private String service; + private String version; + private String charset; + private String bill_date; + private String bill_type; + private String sign_type; + private String mch_id; + private String nonce_str; + private String sign; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/CloseOrderModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/CloseOrderModel.java new file mode 100644 index 00000000..c9d3ca25 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/CloseOrderModel.java @@ -0,0 +1,36 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-关闭订单

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class CloseOrderModel extends BaseModel{ + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String out_trade_no; + private String nonce_str; + private String sign; + private String sign_agentno; + private String groupno; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/MicroPayModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/MicroPayModel.java new file mode 100644 index 00000000..e48180a6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/MicroPayModel.java @@ -0,0 +1,51 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-付款码支付

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class MicroPayModel extends BaseModel { + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String out_trade_no; + private String device_info; + private String body; + private String goods_detail; + private String sub_appid; + private String attach; + private String need_receipt; + private String total_fee; + private String mch_create_ip; + private String auth_code; + private String time_start; + private String time_expire; + private String op_user_id; + private String op_shop_id; + private String op_device_id; + private String goods_tag; + private String nonce_str; + private String sign; + private String sign_agentno; + private String groupno; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/OrderQueryModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/OrderQueryModel.java new file mode 100644 index 00000000..4dd9b660 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/OrderQueryModel.java @@ -0,0 +1,37 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-订单查询

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class OrderQueryModel extends BaseModel { + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String out_trade_no; + private String transaction_id; + private String sign_agentno; + private String groupno; + private String nonce_str; + private String sign; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/RefundModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/RefundModel.java new file mode 100644 index 00000000..a1be6be2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/RefundModel.java @@ -0,0 +1,43 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-退款

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class RefundModel extends BaseModel{ + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String out_trade_no; + private String transaction_id; + private String out_refund_no; + private String total_fee; + private String refund_fee; + private String op_user_id; + private String refund_channel; + private String nonce_str; + private String sign; + private String sign_agentno; + private String groupno; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/RefundQueryModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/RefundQueryModel.java new file mode 100644 index 00000000..8808eee9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/RefundQueryModel.java @@ -0,0 +1,39 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-查询退款

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class RefundQueryModel extends BaseModel{ + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String out_trade_no; + private String transaction_id; + private String out_refund_no; + private String refund_id; + private String nonce_str; + private String sign; + private String sign_agentno; + private String groupno; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/ReverseModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/ReverseModel.java new file mode 100644 index 00000000..f0efb4b6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/ReverseModel.java @@ -0,0 +1,36 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-撤销订单

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class ReverseModel extends BaseModel{ + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String out_trade_no; + private String nonce_str; + private String sign; + private String sign_agentno; + private String groupno; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/UnifiedOrderModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/UnifiedOrderModel.java new file mode 100644 index 00000000..b760bed7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/UnifiedOrderModel.java @@ -0,0 +1,60 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-统一下单

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class UnifiedOrderModel extends BaseModel { + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String appid; + private String is_raw; + private String is_minipg; + private String out_trade_no; + private String device_info; + private String op_shop_id; + private String body; + private String sub_openid; + private String user_id; + private String attach; + private String sub_appid; + private String total_fee; + private String need_receipt; + private String customer_ip; + private String mch_create_ip; + private String notify_url; + private String time_start; + private String time_expire; + private String qr_code_timeout_express; + private String op_user_id; + private String goods_tag; + private String product_id; + private String nonce_str; + private String buyer_logon_id; + private String buyer_id; + private String limit_credit_pay; + private String sign; + private String sign_agentno; + private String groupno; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/UnionPayUserIdModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/UnionPayUserIdModel.java new file mode 100644 index 00000000..a0795dd3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/unionpay/model/UnionPayUserIdModel.java @@ -0,0 +1,37 @@ +/** + *

IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。

+ * + *

不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

+ * + *

IJPay 交流群: 723992875

+ * + *

Node.js 版: https://gitee.com/javen205/TNWX

+ * + *

云闪付-银联 JS 支付获取 userId

+ * + * @author Javen + */ +package cn.lili.modules.payment.kit.plugin.unionpay.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@AllArgsConstructor +@Getter +@Setter +public class UnionPayUserIdModel extends BaseModel{ + private String service; + private String version; + private String charset; + private String sign_type; + private String mch_id; + private String nonce_str; + private String sign; + private String user_auth_code; + private String app_up_identifier; + private String sign_agentno; + private String groupno; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java index 54bc5fdd..434085db 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java @@ -1,24 +1,26 @@ package cn.lili.modules.payment.kit.plugin.wallet; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.member.service.MemberWalletService; -import cn.lili.modules.order.trade.entity.enums.DepositServiceTypeEnum; import cn.lili.modules.payment.entity.RefundLog; +import cn.lili.modules.payment.entity.enums.CashierEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.CashierSupport; import cn.lili.modules.payment.kit.Payment; import cn.lili.modules.payment.kit.dto.PayParam; import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.params.dto.CashierParam; import cn.lili.modules.payment.service.PaymentService; import cn.lili.modules.payment.service.RefundLogService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; +import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum; +import cn.lili.modules.wallet.service.MemberWalletService; import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -34,27 +36,40 @@ import javax.servlet.http.HttpServletResponse; */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WalletPlugin implements Payment { - //支付日志 - private final PaymentService paymentService; - //退款日志 - private final RefundLogService refundLogService; - //会员余额 - private final MemberWalletService memberWalletService; - //收银台 + /** + * 支付日志 + */ + @Autowired + private PaymentService paymentService; + /** + * 退款日志 + */ + @Autowired + private RefundLogService refundLogService; + /** + * 会员余额 + */ + @Autowired + private MemberWalletService memberWalletService; + /** + * 收银台 + */ + @Autowired private CashierSupport cashierSupport; + @Autowired + private RedissonClient redisson; + @Override public ResultMessage h5pay(HttpServletRequest request, HttpServletResponse response, PayParam payParam) { - savePaymentLog(payParam); return ResultUtil.success(ResultCode.PAY_SUCCESS); } @Override - public ResultMessage JSApiPay(HttpServletRequest request, PayParam payParam) { + public ResultMessage jsApiPay(HttpServletRequest request, PayParam payParam) { savePaymentLog(payParam); return ResultUtil.success(ResultCode.PAY_SUCCESS); } @@ -67,6 +82,9 @@ public class WalletPlugin implements Payment { @Override public ResultMessage nativePay(HttpServletRequest request, PayParam payParam) { + if (payParam.getOrderType().equals(CashierEnum.RECHARGE.name())) { + throw new ServiceException(ResultCode.CAN_NOT_RECHARGE_WALLET); + } savePaymentLog(payParam); return ResultUtil.success(ResultCode.PAY_SUCCESS); } @@ -78,42 +96,35 @@ public class WalletPlugin implements Payment { return ResultUtil.success(ResultCode.PAY_SUCCESS); } - @Override - public void cancel(RefundLog refundLog) { - - try { - memberWalletService.increase(refundLog.getTotalAmount(), - refundLog.getMemberId(), - "取消[" + refundLog.getOrderSn() + "]订单,退还金额[" + refundLog.getTotalAmount() + "]", - DepositServiceTypeEnum.WALLET_REFUND.name()); - refundLog.setIsRefund(true); - refundLogService.save(refundLog); - } catch (Exception e) { - e.printStackTrace(); - } - } - /** * 保存支付日志 * * @param payParam 支付参数 */ private void savePaymentLog(PayParam payParam) { - //获取支付收银参数 - CashierParam cashierParam = cashierSupport.cashierParam(payParam); - this.callBack(payParam, cashierParam); + //同一个会员如果在不同的客户端使用预存款支付,会存在同时支付,无法保证预存款的正确性,所以对会员加锁 + RLock lock = redisson.getLock(UserContext.getCurrentUser().getId() + ""); + lock.lock(); + try { + //获取支付收银参数 + CashierParam cashierParam = cashierSupport.cashierParam(payParam); + this.callBack(payParam, cashierParam); + } finally { + lock.unlock(); + } } @Override public void refund(RefundLog refundLog) { try { - memberWalletService.increase(refundLog.getTotalAmount(), + memberWalletService.increase(new MemberWalletUpdateDTO(refundLog.getTotalAmount(), refundLog.getMemberId(), - "售后[" + refundLog.getAfterSaleNo() + "]审批,退还金额[" + refundLog.getTotalAmount() + "]", DepositServiceTypeEnum.WALLET_REFUND.name()); + "订单[" + refundLog.getOrderSn() + "],售后单[" + refundLog.getAfterSaleNo() + "],退还金额[" + refundLog.getTotalAmount() + "]", + DepositServiceTypeEnum.WALLET_REFUND.name())); refundLog.setIsRefund(true); refundLogService.save(refundLog); } catch (Exception e) { - e.printStackTrace(); + log.error("退款失败", e); } } @@ -130,11 +141,12 @@ public class WalletPlugin implements Payment { if (UserContext.getCurrentUser() == null) { throw new ServiceException(ResultCode.USER_NOT_LOGIN); } - boolean result = memberWalletService.reduce( - cashierParam.getPrice(), - UserContext.getCurrentUser().getId(), - "订单[" + cashierParam.getOrderSns() + "]支付金额[" + cashierParam.getPrice() + "]", - DepositServiceTypeEnum.WALLET_PAY.name() + boolean result = memberWalletService.reduce(new MemberWalletUpdateDTO( + cashierParam.getPrice(), + UserContext.getCurrentUser().getId(), + "订单[" + cashierParam.getOrderSns() + "]支付金额[" + cashierParam.getPrice() + "]", + DepositServiceTypeEnum.WALLET_PAY.name() + ) ); if (result) { try { @@ -149,11 +161,11 @@ public class WalletPlugin implements Payment { log.info("支付回调通知:余额支付:{}", payParam); } catch (ServiceException e) { //业务异常,则支付手动回滚 - memberWalletService.increase( + memberWalletService.increase(new MemberWalletUpdateDTO( cashierParam.getPrice(), UserContext.getCurrentUser().getId(), "订单[" + cashierParam.getOrderSns() + "]支付异常,余额返还[" + cashierParam.getPrice() + "]", - DepositServiceTypeEnum.WALLET_REFUND.name() + DepositServiceTypeEnum.WALLET_REFUND.name()) ); throw e; } @@ -169,9 +181,4 @@ public class WalletPlugin implements Payment { } - - @Autowired - public void setCashierSupport(CashierSupport cashierSupport) { - this.cashierSupport = cashierSupport; - } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatApi.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatApi.java index 81413802..7708a69a 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatApi.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatApi.java @@ -7,6 +7,7 @@ import cn.lili.modules.payment.kit.core.enums.RequestMethodEnums; import cn.lili.modules.payment.kit.core.kit.HttpKit; import cn.lili.modules.payment.kit.core.kit.PayKit; import cn.lili.modules.payment.kit.core.kit.WxPayKit; +import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApiEnum; import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatDomain; import java.io.File; @@ -19,7 +20,7 @@ import java.util.Map; * 微信支付相关接口 * * @author Chopper - * @date 2021/1/26 15:25 + * @since 2021/1/26 15:25 */ public class WechatApi { @@ -30,47 +31,47 @@ public class WechatApi { /** * 获取接口请求的 URL * - * @param wechatApi {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 支付 API 接口枚举 + * @param wechatApiEnum {@link WechatApiEnum} 支付 API 接口枚举 * @return {@link String} 返回完整的接口请求URL */ - public static String getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi wechatApi) { - return getReqUrl(wechatApi, null, false); + public static String getReqUrl(WechatApiEnum wechatApiEnum) { + return getReqUrl(wechatApiEnum, null, false); } /** * 获取接口请求的 URL * - * @param wechatApi {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 支付 API 接口枚举 + * @param wechatApiEnum {@link WechatApiEnum} 支付 API 接口枚举 * @param isSandBox 是否是沙箱环境 * @return {@link String} 返回完整的接口请求URL */ - public static String getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi wechatApi, boolean isSandBox) { - return getReqUrl(wechatApi, null, isSandBox); + public static String getReqUrl(WechatApiEnum wechatApiEnum, boolean isSandBox) { + return getReqUrl(wechatApiEnum, null, isSandBox); } /** * 获取接口请求的 URL * - * @param wechatApi {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 支付 API 接口枚举 + * @param wechatApiEnum {@link WechatApiEnum} 支付 API 接口枚举 * @param wechatDomain {@link WechatDomain} 支付 API 接口域名枚举 * @param isSandBox 是否是沙箱环境 * @return {@link String} 返回完整的接口请求URL */ - public static String getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi wechatApi, WechatDomain wechatDomain, boolean isSandBox) { + public static String getReqUrl(WechatApiEnum wechatApiEnum, WechatDomain wechatDomain, boolean isSandBox) { if (wechatDomain == null) { wechatDomain = WechatDomain.CHINA; } return wechatDomain.getType() - .concat(isSandBox ? cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.SAND_BOX_NEW.getUrl() : "") - .concat(wechatApi.getUrl()); + .concat(isSandBox ? WechatApiEnum.SAND_BOX_NEW.getUrl() : "") + .concat(wechatApiEnum.getUrl()); } /** * 发起请求 * * @param apiUrl 接口 URL - * 通过 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi)} - * 或者 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi, WechatDomain, boolean)} 来获取 + * 通过 {@link WechatApi#getReqUrl(WechatApiEnum)} + * 或者 {@link WechatApi#getReqUrl(WechatApiEnum, WechatDomain, boolean)} 来获取 * @param params 接口请求参数 * @return {@link String} 请求返回的结果 */ @@ -82,8 +83,8 @@ public class WechatApi { * 发起请求 * * @param apiUrl 接口 URL - * 通过 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi)} - * 或者 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi, WechatDomain, boolean)} 来获取 + * 通过 {@link WechatApi#getReqUrl(WechatApiEnum)} + * 或者 {@link WechatApi#getReqUrl(WechatApiEnum, WechatDomain, boolean)} 来获取 * @param params 接口请求参数 * @return {@link String} 请求返回的结果 */ @@ -95,8 +96,8 @@ public class WechatApi { * 发起请求 * * @param apiUrl 接口 URL - * 通过 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi)} - * 或者 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi, WechatDomain, boolean)} 来获取 + * 通过 {@link WechatApi#getReqUrl(WechatApiEnum)} + * 或者 {@link WechatApi#getReqUrl(WechatApiEnum, WechatDomain, boolean)} 来获取 * @param params 接口请求参数 * @param certPath 证书文件路径 * @param certPass 证书密码 @@ -110,8 +111,8 @@ public class WechatApi { * 发起请求 * * @param apiUrl 接口 URL - * 通过 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi)} - * 或者 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi, WechatDomain, boolean)} 来获取 + * 通过 {@link WechatApi#getReqUrl(WechatApiEnum)} + * 或者 {@link WechatApi#getReqUrl(WechatApiEnum, WechatDomain, boolean)} 来获取 * @param params 接口请求参数 * @param certPath 证书文件路径 * @return {@link String} 请求返回的结果 @@ -124,8 +125,8 @@ public class WechatApi { * 发起请求 * * @param apiUrl 接口 URL - * 通过 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi)} - * 或者 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi, WechatDomain, boolean)} 来获取 + * 通过 {@link WechatApi#getReqUrl(WechatApiEnum)} + * 或者 {@link WechatApi#getReqUrl(WechatApiEnum, WechatDomain, boolean)} 来获取 * @param params 接口请求参数 * @param certFile 证书文件输入流 * @param certPass 证书密码 @@ -139,8 +140,8 @@ public class WechatApi { * 发起请求 * * @param apiUrl 接口 URL - * 通过 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi)} - * 或者 {@link WechatApi#getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi, WechatDomain, boolean)} 来获取 + * 通过 {@link WechatApi#getReqUrl(WechatApiEnum)} + * 或者 {@link WechatApi#getReqUrl(WechatApiEnum, WechatDomain, boolean)} 来获取 * @param params 接口请求参数 * @param certFile 证书文件输入流 * @return {@link String} 请求返回的结果 @@ -160,7 +161,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号,接口中包含敏感信息时必传 @@ -177,7 +178,7 @@ public class WechatApi { String mchId, String serialNo, String platSerialNo, String keyPath, String body, String nonceStr, long timestamp, String authType, File file) throws Exception { - // 构建 Authorization + //构建 Authorization String authorization = WxPayKit.buildAuthorization(method, urlSuffix, mchId, serialNo, keyPath, body, nonceStr, timestamp, authType); @@ -203,7 +204,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号,接口中包含敏感信息时必传 @@ -220,7 +221,7 @@ public class WechatApi { String mchId, String serialNo, String platSerialNo, PrivateKey privateKey, String body, String nonceStr, long timestamp, String authType, File file) throws Exception { - // 构建 Authorization + //构建 Authorization String authorization = WxPayKit.buildAuthorization(method, urlSuffix, mchId, serialNo, privateKey, body, nonceStr, timestamp, authType); @@ -247,7 +248,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -269,7 +270,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -291,7 +292,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -317,7 +318,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -342,7 +343,7 @@ public class WechatApi { * V3 接口统一执行入口 * * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -363,7 +364,7 @@ public class WechatApi { * V3 接口统一执行入口 * * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -386,7 +387,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号,接口中包含敏感信息时必传 @@ -413,7 +414,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param keyPath apiclient_key.pem 证书路径 @@ -432,7 +433,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -453,7 +454,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -475,7 +476,7 @@ public class WechatApi { * * @param method {@link RequestMethodEnums} 请求方法 * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param keyPath apiclient_key.pem 证书路径 @@ -495,7 +496,7 @@ public class WechatApi { * V3 接口统一执行入口 * * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param platSerialNo 平台序列号 @@ -515,7 +516,7 @@ public class WechatApi { * V3 接口统一执行入口 * * @param urlPrefix 可通过 {@link WechatDomain}来获取 - * @param urlSuffix 可通过 {@link cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi} 来获取,URL挂载参数需要自行拼接 + * @param urlSuffix 可通过 {@link WechatApiEnum} 来获取,URL挂载参数需要自行拼接 * @param mchId 商户Id * @param serialNo 商户 API 证书序列号 * @param keyPath apiclient_key.pem 证书路径 @@ -538,7 +539,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String sendWorkWxRedPack(Map params, String certPath, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.SEND_WORK_WX_RED_PACK), params, certPath, certPass); + return execution(getReqUrl(WechatApiEnum.SEND_WORK_WX_RED_PACK), params, certPath, certPass); } /** @@ -550,7 +551,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String sendWorkWxRedPack(Map params, InputStream certFile, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.SEND_WORK_WX_RED_PACK), params, certFile, certPass); + return execution(getReqUrl(WechatApiEnum.SEND_WORK_WX_RED_PACK), params, certFile, certPass); } /** @@ -562,7 +563,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String queryWorkWxRedPack(Map params, String certPath, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.QUERY_WORK_WX_RED_PACK), params, certPath, certPass); + return execution(getReqUrl(WechatApiEnum.QUERY_WORK_WX_RED_PACK), params, certPath, certPass); } /** @@ -574,7 +575,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String queryWorkWxRedPack(Map params, InputStream certFile, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.QUERY_WORK_WX_RED_PACK), params, certFile, certPass); + return execution(getReqUrl(WechatApiEnum.QUERY_WORK_WX_RED_PACK), params, certFile, certPass); } /** @@ -586,7 +587,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String trans2pocket(Map params, String certPath, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.PAY_WWS_TRANS_2_POCKET), params, certPath, certPass); + return execution(getReqUrl(WechatApiEnum.PAY_WWS_TRANS_2_POCKET), params, certPath, certPass); } /** @@ -598,7 +599,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String trans2pocket(Map params, InputStream certFile, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.PAY_WWS_TRANS_2_POCKET), params, certFile, certPass); + return execution(getReqUrl(WechatApiEnum.PAY_WWS_TRANS_2_POCKET), params, certFile, certPass); } /** @@ -610,7 +611,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String queryTrans2pocket(Map params, String certPath, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.QUERY_WWS_TRANS_2_POCKET), params, certPath, certPass); + return execution(getReqUrl(WechatApiEnum.QUERY_WWS_TRANS_2_POCKET), params, certPath, certPass); } /** @@ -622,7 +623,7 @@ public class WechatApi { * @return {@link String} 请求返回的结果 */ public static String queryTrans2pocket(Map params, InputStream certFile, String certPass) { - return execution(getReqUrl(cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.QUERY_WWS_TRANS_2_POCKET), params, certFile, certPass); + return execution(getReqUrl(WechatApiEnum.QUERY_WWS_TRANS_2_POCKET), params, certFile, certPass); } /** diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java index 059d29e3..94ce4589 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java @@ -5,22 +5,24 @@ import cn.hutool.core.net.URLEncoder; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.ApiProperties; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.utils.SnowFlake; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.ResultMessage; -import cn.lili.config.properties.ApiProperties; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; import cn.lili.modules.connect.entity.Connect; -import cn.lili.modules.connect.entity.enums.ConnectEnum; +import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.service.ConnectService; +import cn.lili.modules.member.entity.dto.ConnectQueryDTO; +import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.payment.entity.RefundLog; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.CashierSupport; import cn.lili.modules.payment.kit.Payment; import cn.lili.modules.payment.kit.core.PaymentHttpResponse; @@ -30,20 +32,23 @@ import cn.lili.modules.payment.kit.core.kit.*; import cn.lili.modules.payment.kit.core.utils.DateTimeZoneUtil; import cn.lili.modules.payment.kit.dto.PayParam; import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; import cn.lili.modules.payment.kit.params.dto.CashierParam; +import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApiEnum; import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatDomain; import cn.lili.modules.payment.kit.plugin.wechat.model.*; import cn.lili.modules.payment.service.PaymentService; import cn.lili.modules.payment.service.RefundLogService; import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.WithdrawalSetting; import cn.lili.modules.system.entity.dto.connect.WechatConnectSetting; import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.dto.payment.WechatPaymentSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.dto.TransferResultDTO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -53,7 +58,8 @@ import javax.servlet.http.HttpServletResponse; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; import java.security.cert.X509Certificate; -import java.util.Date; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -61,26 +67,52 @@ import java.util.Objects; * 微信支付 * * @author Chopper - * @date 2020/12/21 17:44 + * @since 2020/12/21 17:44 */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WechatPlugin implements Payment { - //收银台 - private final CashierSupport cashierSupport; - //支付日志 - private final PaymentService paymentService; - //缓存 - private final Cache cache; - //退款日志 - private final RefundLogService refundLogService; - //API域名 - private final ApiProperties apiProperties; - //配置 - private final SettingService settingService; - //联合登陆 - private final ConnectService connectService; + + /** + * 收银台 + */ + @Autowired + private CashierSupport cashierSupport; + /** + * 支付日志 + */ + @Autowired + private PaymentService paymentService; + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 退款日志 + */ + @Autowired + private RefundLogService refundLogService; + /** + * API域名 + */ + @Autowired + private ApiProperties apiProperties; + /** + * 配置 + */ + @Autowired + private SettingService settingService; + /** + * 联合登陆 + */ + @Autowired + private ConnectService connectService; + /** + * 联合登陆 + */ + @Autowired + private OrderService orderService; @Override @@ -106,9 +138,14 @@ public class WechatPlugin implements Payment { //回传数据 String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); + WechatPaymentSetting setting = wechatPaymentSetting(); + String appid = setting.getServiceAppId(); + if (appid == null) { + throw new ServiceException(ResultCode.WECHAT_PAYMENT_NOT_SETTING); + } UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel() - .setAppid(setting.getAppId()) + .setAppid(appid) .setMchid(setting.getMchId()) .setDescription(cashierParam.getDetail()) .setOut_trade_no(outOrderNo) @@ -121,7 +158,7 @@ public class WechatPlugin implements Payment { PaymentHttpResponse response = WechatApi.v3( RequestMethodEnums.POST, WechatDomain.CHINA.toString(), - cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.H5_PAY.toString(), + WechatApiEnum.H5_PAY.toString(), setting.getMchId(), setting.getSerialNumber(), null, @@ -131,19 +168,18 @@ public class WechatPlugin implements Payment { return ResultUtil.data(JSONUtil.toJsonStr(response.getBody())); } catch (Exception e) { - e.printStackTrace(); - return ResultUtil.error(ResultCode.PAY_ERROR); + log.error("微信H5支付错误", e); + throw new ServiceException(ResultCode.PAY_ERROR); } } @Override - public ResultMessage JSApiPay(HttpServletRequest request, PayParam payParam) { + public ResultMessage jsApiPay(HttpServletRequest request, PayParam payParam) { try { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Connect::getUserId, UserContext.getCurrentUser().getId()) - .eq(Connect::getUnionType, ConnectEnum.WECHAT_OPEN_ID.name()); - Connect connect = connectService.getOne(queryWrapper); + Connect connect = connectService.queryConnect( + ConnectQueryDTO.builder().userId(UserContext.getCurrentUser().getId()).unionType(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name()).build() + ); if (connect == null) { return null; } @@ -163,8 +199,12 @@ public class WechatPlugin implements Payment { String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); WechatPaymentSetting setting = wechatPaymentSetting(); + String appid = setting.getServiceAppId(); + if (appid == null) { + throw new ServiceException(ResultCode.WECHAT_PAYMENT_NOT_SETTING); + } UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel() - .setAppid(setting.getAppId()) + .setAppid(appid) .setMchid(setting.getMchId()) .setDescription(cashierParam.getDetail()) .setOut_trade_no(outOrderNo) @@ -178,14 +218,14 @@ public class WechatPlugin implements Payment { PaymentHttpResponse response = WechatApi.v3( RequestMethodEnums.POST, WechatDomain.CHINA.toString(), - cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.JS_API_PAY.toString(), + WechatApiEnum.JS_API_PAY.toString(), setting.getMchId(), setting.getSerialNumber(), null, setting.getApiclient_key(), JSONUtil.toJsonStr(unifiedOrderModel) ); - // 根据证书序列号查询对应的证书来验证签名结果 + //根据证书序列号查询对应的证书来验证签名结果 boolean verifySignature = WxPayKit.verifySignature(response, getPlatformCert()); log.info("verifySignature: {}", verifySignature); log.info("统一下单响应 {}", response); @@ -194,16 +234,16 @@ public class WechatPlugin implements Payment { String body = response.getBody(); JSONObject jsonObject = JSONUtil.parseObj(body); String prepayId = jsonObject.getStr("prepay_id"); - Map map = WxPayKit.jsApiCreateSign(setting.getAppId(), prepayId, setting.getApiclient_key()); + Map map = WxPayKit.jsApiCreateSign(appid, prepayId, setting.getApiclient_key()); log.info("唤起支付参数:{}", map); return ResultUtil.data(map); } log.error("微信支付参数验证错误,请及时处理"); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } catch (Exception e) { log.error("支付异常", e); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } } @@ -221,11 +261,15 @@ public class WechatPlugin implements Payment { //过期时间 String timeExpire = DateTimeZoneUtil.dateToTimeZone(System.currentTimeMillis() + 1000 * 60 * 3); - String attach =URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); + String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); WechatPaymentSetting setting = wechatPaymentSetting(); + String appid = setting.getAppId(); + if (appid == null) { + throw new ServiceException(ResultCode.WECHAT_PAYMENT_NOT_SETTING); + } UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel() - .setAppid(setting.getAppId()) + .setAppid(appid) .setMchid(setting.getMchId()) .setDescription(cashierParam.getDetail()) .setOut_trade_no(outOrderNo) @@ -239,14 +283,14 @@ public class WechatPlugin implements Payment { PaymentHttpResponse response = WechatApi.v3( RequestMethodEnums.POST, WechatDomain.CHINA.toString(), - cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.APP_PAY.toString(), + WechatApiEnum.APP_PAY.toString(), setting.getMchId(), setting.getSerialNumber(), null, setting.getApiclient_key(), JSONUtil.toJsonStr(unifiedOrderModel) ); - // 根据证书序列号查询对应的证书来验证签名结果 + //根据证书序列号查询对应的证书来验证签名结果 boolean verifySignature = WxPayKit.verifySignature(response, getPlatformCert()); log.info("verifySignature: {}", verifySignature); log.info("统一下单响应 {}", response); @@ -254,19 +298,19 @@ public class WechatPlugin implements Payment { if (verifySignature) { JSONObject jsonObject = JSONUtil.parseObj(response.getBody()); String prepayId = jsonObject.getStr("prepay_id"); - Map map = WxPayKit.appPrepayIdCreateSign(setting.getAppId(), + Map map = WxPayKit.appPrepayIdCreateSign(appid, setting.getMchId(), prepayId, - setting.getApiclient_key(), SignType.HMACSHA256); + setting.getApiclient_key(), SignType.MD5); log.info("唤起支付参数:{}", map); return ResultUtil.data(map); } log.error("微信支付参数验证错误,请及时处理"); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } catch (Exception e) { log.error("支付异常", e); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } } @@ -287,8 +331,13 @@ public class WechatPlugin implements Payment { String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); WechatPaymentSetting setting = wechatPaymentSetting(); + + String appid = setting.getServiceAppId(); + if (appid == null) { + throw new ServiceException(ResultCode.WECHAT_PAYMENT_NOT_SETTING); + } UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel() - .setAppid(setting.getAppId()) + .setAppid(appid) .setMchid(setting.getMchId()) .setDescription(cashierParam.getDetail()) .setOut_trade_no(outOrderNo) @@ -302,7 +351,7 @@ public class WechatPlugin implements Payment { PaymentHttpResponse response = WechatApi.v3( RequestMethodEnums.POST, WechatDomain.CHINA.toString(), - cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.NATIVE_PAY.toString(), + WechatApiEnum.NATIVE_PAY.toString(), setting.getMchId(), setting.getSerialNumber(), null, @@ -310,7 +359,7 @@ public class WechatPlugin implements Payment { JSONUtil.toJsonStr(unifiedOrderModel) ); log.info("统一下单响应 {}", response); - // 根据证书序列号查询对应的证书来验证签名结果 + //根据证书序列号查询对应的证书来验证签名结果 boolean verifySignature = WxPayKit.verifySignature(response, getPlatformCert()); log.info("verifySignature: {}", verifySignature); @@ -318,14 +367,14 @@ public class WechatPlugin implements Payment { return ResultUtil.data(new JSONObject(response.getBody()).getStr("code_url")); } else { log.error("微信支付参数验证错误,请及时处理"); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } } catch (ServiceException e) { log.error("支付异常", e); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } catch (Exception e) { log.error("支付异常", e); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } } @@ -333,10 +382,9 @@ public class WechatPlugin implements Payment { public ResultMessage mpPay(HttpServletRequest request, PayParam payParam) { try { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Connect::getUserId, UserContext.getCurrentUser().getId()) - .eq(Connect::getUnionType, ConnectEnum.WECHAT_MP_OPEN_ID.name()); - Connect connect = connectService.getOne(queryWrapper); + Connect connect = connectService.queryConnect( + ConnectQueryDTO.builder().userId(UserContext.getCurrentUser().getId()).unionType(SourceEnum.WECHAT_MP_OPEN_ID.name()).build() + ); if (connect == null) { return null; } @@ -355,8 +403,10 @@ public class WechatPlugin implements Payment { //微信小程序,appid 需要单独获取,这里读取了联合登陆配置的appid ,实际场景小程序自动登录,所以这个appid是最为保险的做法 //如果有2开需求,这里需要调整,修改这个appid的获取途径即可 - String appid = getWechatMPSetting().getAppId(); - + String appid = wechatPaymentSetting().getMpAppId(); + if (StringUtils.isEmpty(appid)) { + throw new ServiceException(ResultCode.WECHAT_PAYMENT_NOT_SETTING); + } String attach = URLEncoder.createDefault().encode(JSONUtil.toJsonStr(payParam), StandardCharsets.UTF_8); WechatPaymentSetting setting = wechatPaymentSetting(); @@ -375,14 +425,14 @@ public class WechatPlugin implements Payment { PaymentHttpResponse response = WechatApi.v3( RequestMethodEnums.POST, WechatDomain.CHINA.toString(), - cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.JS_API_PAY.toString(), + WechatApiEnum.JS_API_PAY.toString(), setting.getMchId(), setting.getSerialNumber(), null, setting.getApiclient_key(), JSONUtil.toJsonStr(unifiedOrderModel) ); - // 根据证书序列号查询对应的证书来验证签名结果 + //根据证书序列号查询对应的证书来验证签名结果 boolean verifySignature = WxPayKit.verifySignature(response, getPlatformCert()); log.info("verifySignature: {}", verifySignature); log.info("统一下单响应 {}", response); @@ -397,10 +447,10 @@ public class WechatPlugin implements Payment { return ResultUtil.data(map); } log.error("微信支付参数验证错误,请及时处理"); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } catch (Exception e) { log.error("支付异常", e); - return ResultUtil.error(ResultCode.PAY_ERROR); + throw new ServiceException(ResultCode.PAY_ERROR); } } @@ -423,6 +473,92 @@ public class WechatPlugin implements Payment { } } + /** + * 微信提现 + * 文档地址:https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/initiate-batch-transfer.html + * + * @param memberWithdrawApply 会员提现申请 + */ + @Override + public TransferResultDTO transfer(MemberWithdrawApply memberWithdrawApply) { + try { + //获取提现设置 + WithdrawalSetting withdrawalSetting = new Gson().fromJson(settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()).getSettingValue(), + WithdrawalSetting.class); + + //获取用户OPENID + WechatConnectSetting wechatConnectSetting = new Gson().fromJson(settingService.get(SettingEnum.WECHAT_CONNECT.name()).getSettingValue() + , WechatConnectSetting.class); + String source = ""; + for (WechatConnectSettingItem wechatConnectSettingItem : wechatConnectSetting.getWechatConnectSettingItems()) { + if (wechatConnectSettingItem.getAppId().equals(withdrawalSetting.getWechatAppId())) { + switch (wechatConnectSettingItem.getClientType()) { + case "PC": + source = SourceEnum.WECHAT_PC_OPEN_ID.name(); + break; + case "H5": + source = SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name(); + break; + case "MP": + source = SourceEnum.WECHAT_MP_OPEN_ID.name(); + break; + case "APP": + source = SourceEnum.WECHAT_APP_OPEN_ID.name(); + break; + } + } + } + + //获取微信设置 + WechatPaymentSetting wechatPaymentSetting = wechatPaymentSetting(); + //获取用户openId + Connect connect = connectService.queryConnect( + ConnectQueryDTO.builder().userId(memberWithdrawApply.getMemberId()) + .unionType(source).build() + ); + //构建提现,发起申请 + TransferModel transferModel = new TransferModel() + .setAppid(withdrawalSetting.getWechatAppId()) + .setOut_batch_no(SnowFlake.createStr("T")) + .setBatch_name("用户提现") + .setBatch_remark("用户提现") + .setTotal_amount(CurrencyUtil.fen(memberWithdrawApply.getApplyMoney())) + .setTotal_num(1) + .setTransfer_scene_id("1000"); + List transferDetailListList = new ArrayList<>(); + { + TransferDetailInput transferDetailInput = new TransferDetailInput(); + transferDetailInput.setOut_detail_no(SnowFlake.createStr("TD")); + transferDetailInput.setTransfer_amount(CurrencyUtil.fen(memberWithdrawApply.getApplyMoney())); + transferDetailInput.setTransfer_remark("用户提现"); + transferDetailInput.setOpenid(connect.getUnionId()); + transferDetailListList.add(transferDetailInput); + } + transferModel.setTransfer_detail_list(transferDetailListList); + + PaymentHttpResponse response = WechatApi.v3( + RequestMethodEnums.POST, + WechatDomain.CHINA.toString(), + WechatApiEnum.TRANSFER_BATCHES.toString(), + wechatPaymentSetting.getMchId(), + wechatPaymentSetting.getSerialNumber(), + null, + wechatPaymentSetting.getApiclient_key(), + JSONUtil.toJsonStr(transferModel) + ); + log.info("微信提现响应 {}", response); + String body = response.getBody(); + JSONObject jsonObject = JSONUtil.parseObj(body); + + return TransferResultDTO.builder().result(jsonObject.getStr("batch_id") != null).response(body).build(); + //根据自身业务进行接下来的任务处理 + } catch (Exception e) { + e.printStackTrace(); + return TransferResultDTO.builder().result(false).response(e.getMessage()).build(); + } + + } + /** * 验证结果,执行支付回调 * @@ -441,7 +577,7 @@ public class WechatPlugin implements Payment { log.info("微信支付通知密文 {}", result); WechatPaymentSetting setting = wechatPaymentSetting(); - // 校验服务器端响应¬ + //校验服务器端响应¬ String plainText = WxPayKit.verifyNotify(serialNo, result, signature, nonce, timestamp, setting.getApiKey3(), Objects.requireNonNull(getPlatformCert())); @@ -450,8 +586,8 @@ public class WechatPlugin implements Payment { JSONObject jsonObject = JSONUtil.parseObj(plainText); String payParamStr = jsonObject.getStr("attach"); - String payParamJson = URLDecoder.decode(payParamStr,StandardCharsets.UTF_8); - PayParam payParam = JSONUtil.toBean(payParamJson,PayParam.class); + String payParamJson = URLDecoder.decode(payParamStr, StandardCharsets.UTF_8); + PayParam payParam = JSONUtil.toBean(payParamJson, PayParam.class); String tradeNo = jsonObject.getStr("transaction_id"); @@ -474,9 +610,9 @@ public class WechatPlugin implements Payment { try { Amount amount = new Amount().setRefund(CurrencyUtil.fen(refundLog.getTotalAmount())) - .setTotal(CurrencyUtil.fen(refundLog.getPayPrice())); + .setTotal(CurrencyUtil.fen(orderService.getPaymentTotal(refundLog.getOrderSn()))); - // 退款参数准备 + //退款参数准备 RefundModel refundModel = new RefundModel() .setTransaction_id(refundLog.getPaymentReceivableNo()) .setOut_refund_no(refundLog.getOutOrderNo()) @@ -490,7 +626,7 @@ public class WechatPlugin implements Payment { PaymentHttpResponse response = WechatApi.v3( RequestMethodEnums.POST, WechatDomain.CHINA.toString(), - cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.DOMESTIC_REFUNDS.toString(), + WechatApiEnum.DOMESTIC_REFUNDS.toString(), setting.getMchId(), setting.getSerialNumber(), null, @@ -498,11 +634,11 @@ public class WechatPlugin implements Payment { JSONUtil.toJsonStr(refundModel) ); log.info("微信退款响应 {}", response); - // 退款申请成功 + //退款申请成功 if (response.getStatus() == 200) { refundLogService.save(refundLog); } else { - // 退款申请失败 + //退款申请失败 refundLog.setErrorMessage(response.getBody()); refundLogService.save(refundLog); } @@ -512,12 +648,6 @@ public class WechatPlugin implements Payment { } - @Override - public void cancel(RefundLog refundLog) { - this.refund(refundLog); - } - - @Override public void refundNotify(HttpServletRequest request) { String timestamp = request.getHeader("Wechatpay-Timestamp"); @@ -529,26 +659,43 @@ public class WechatPlugin implements Payment { String result = HttpKit.readData(request); log.info("微信退款通知密文 {}", result); JSONObject ciphertext = JSONUtil.parseObj(result); - if (!ciphertext.getStr("event_type").equals("REFUND.SUCCESS")) { - return; - } - try { - // 校验服务器端响应¬ + + try { //校验服务器端响应¬ String plainText = WxPayKit.verifyNotify(serialNo, result, signature, nonce, timestamp, wechatPaymentSetting().getApiKey3(), Objects.requireNonNull(getPlatformCert())); log.info("微信退款通知明文 {}", plainText); - JSONObject jsonObject = JSONUtil.parseObj(plainText); - String transactionId = jsonObject.getStr("transaction_id"); - String refundId = jsonObject.getStr("refund_id"); - RefundLog refundLog = refundLogService.getOne(new LambdaQueryWrapper().eq(RefundLog::getPaymentReceivableNo, transactionId)); - if (refundLog != null) { - refundLog.setIsRefund(true); - refundLog.setReceivableNo(refundId); - refundLogService.save(refundLog); + if (("REFUND.SUCCESS").equals(ciphertext.getStr("event_type"))) { + log.info("退款成功 {}", plainText); + //校验服务器端响应 + JSONObject jsonObject = JSONUtil.parseObj(plainText); + String transactionId = jsonObject.getStr("transaction_id"); + String refundId = jsonObject.getStr("refund_id"); + + RefundLog refundLog = refundLogService.getOne(new LambdaQueryWrapper().eq(RefundLog::getPaymentReceivableNo, + transactionId)); + if (refundLog != null) { + refundLog.setIsRefund(true); + refundLog.setReceivableNo(refundId); + refundLogService.saveOrUpdate(refundLog); + } + + } else { + log.info("退款失败 {}", plainText); + JSONObject jsonObject = JSONUtil.parseObj(plainText); + String transactionId = jsonObject.getStr("transaction_id"); + String refundId = jsonObject.getStr("refund_id"); + + RefundLog refundLog = refundLogService.getOne(new LambdaQueryWrapper().eq(RefundLog::getPaymentReceivableNo, + transactionId)); + if (refundLog != null) { + refundLog.setReceivableNo(refundId); + refundLog.setErrorMessage(ciphertext.getStr("summary")); + refundLogService.saveOrUpdate(refundLog); + } } } catch (Exception e) { - e.printStackTrace(); + log.error("微信退款失败", e); } } @@ -563,7 +710,7 @@ public class WechatPlugin implements Payment { WechatPaymentSetting wechatPaymentSetting = JSONUtil.toBean(systemSetting.getSettingValue(), WechatPaymentSetting.class); return wechatPaymentSetting; } catch (Exception e) { - e.printStackTrace(); + log.error("微信支付暂不支持", e); throw new ServiceException(ResultCode.PAY_NOT_SUPPORT); } } @@ -579,7 +726,7 @@ public class WechatPlugin implements Payment { if (!StringUtils.isEmpty(publicCert)) { return PayKit.getCertificate(publicCert); } - // 获取平台证书列表 + //获取平台证书列表 try { WechatPaymentSetting setting = wechatPaymentSetting(); @@ -587,7 +734,7 @@ public class WechatPlugin implements Payment { PaymentHttpResponse response = WechatApi.v3( RequestMethodEnums.GET, WechatDomain.CHINA.toString(), - cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApi.GET_CERTIFICATES.toString(), + WechatApiEnum.GET_CERTIFICATES.toString(), setting.getMchId(), setting.getSerialNumber(), null, @@ -599,22 +746,22 @@ public class WechatPlugin implements Payment { if (response.getStatus() == 200) { JSONObject jsonObject = JSONUtil.parseObj(body); JSONArray dataArray = jsonObject.getJSONArray("data"); - // 默认认为只有一个平台证书 + //默认认为只有一个平台证书 JSONObject encryptObject = dataArray.getJSONObject(0); JSONObject encryptCertificate = encryptObject.getJSONObject("encrypt_certificate"); String associatedData = encryptCertificate.getStr("associated_data"); String cipherText = encryptCertificate.getStr("ciphertext"); String nonce = encryptCertificate.getStr("nonce"); publicCert = getPlatformCertStr(associatedData, nonce, cipherText); - long second = (PayKit.getCertificate(publicCert).getNotAfter().getTime() - new Date().getTime()) / 1000; + long second = (PayKit.getCertificate(publicCert).getNotAfter().getTime() - System.currentTimeMillis()) / 1000; cache.put(CachePrefix.WECHAT_PLAT_FORM_CERT.getPrefix(), publicCert, second); } else { log.error("证书获取失败:{}" + body); - throw new ServiceException("证书获取失败:" + body); + throw new ServiceException(ResultCode.WECHAT_CERT_ERROR); } return PayKit.getCertificate(publicCert); } catch (Exception e) { - e.printStackTrace(); + log.error("证书获取失败", e); } return null; } @@ -633,36 +780,12 @@ public class WechatPlugin implements Payment { AesUtil aesUtil = new AesUtil(wechatPaymentSetting().getApiKey3().getBytes(StandardCharsets.UTF_8)); - // 平台证书密文解密 - // encrypt_certificate 中的 associated_data nonce ciphertext + //平台证书密文解密 + //encrypt_certificate 中的 associated_data nonce ciphertext return aesUtil.decryptToString( associatedData.getBytes(StandardCharsets.UTF_8), nonce.getBytes(StandardCharsets.UTF_8), cipherText ); } - - - /** - * 获取微信小程序配置 - * - * @return - */ - private WechatConnectSettingItem getWechatMPSetting() { - Setting setting = settingService.get(SettingEnum.WECHAT_CONNECT.name()); - - WechatConnectSetting wechatConnectSetting = JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class); - - if (wechatConnectSetting == null) { - return null; - } - //寻找对应对微信小程序登录配置 - for (WechatConnectSettingItem wechatConnectSettingItem : wechatConnectSetting.getWechatConnectSettingItems()) { - if (wechatConnectSettingItem.getClientType().equals(ClientTypeEnum.WECHAT_MP.name())) { - return wechatConnectSettingItem; - } - } - - return null; - } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatApi.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatApiEnum.java similarity index 98% rename from framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatApi.java rename to framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatApiEnum.java index 864d1476..a7303a6e 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatApi.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatApiEnum.java @@ -4,9 +4,9 @@ package cn.lili.modules.payment.kit.plugin.wechat.enums; * 微信api列表 * * @author Chopper - * @date 2020/12/17 17:43 + * @since 2020/12/17 17:43 */ -public enum WechatApi { +public enum WechatApiEnum { /** * 沙箱环境 @@ -555,6 +555,11 @@ public enum WechatApi { * 连锁品牌-删除分账接收方 */ BRAND_PROFIT_SHARING_RECEIVERS_delete("/v3/brand/profitsharing/receivers/delete"), + + /** + * 发起商家转账 + */ + TRANSFER_BATCHES("/v3/transfer/batches"), ; /** @@ -562,7 +567,7 @@ public enum WechatApi { */ private final String url; - WechatApi(String url) { + WechatApiEnum(String url) { this.url = url; } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatDomain.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatDomain.java index b9fc7866..fca89e9d 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatDomain.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/enums/WechatDomain.java @@ -4,7 +4,7 @@ package cn.lili.modules.payment.kit.plugin.wechat.enums; * 微信支付域名 * * @author Chopper - * @date 2020/12/17 17:44 + * @since 2020/12/17 17:44 */ public enum WechatDomain { /** diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Amount.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Amount.java index cc8e6d31..fe06d268 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Amount.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Amount.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; * 统一下单-订单金额 * * @author Chopper - * @date 2020/12/17 17:44 + * @since 2020/12/17 17:44 */ @Data @Accessors(chain = true) diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Detail.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Detail.java index b8a550a5..18b05b0f 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Detail.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Detail.java @@ -10,7 +10,7 @@ import java.util.List; * 统一下单-优惠功能 * * @author Chopper - * @date 2020/12/17 17:46 + * @since 2020/12/17 17:46 */ @Data @Accessors(chain = true) diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/GoodsDetail.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/GoodsDetail.java index 3225d939..b12e335d 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/GoodsDetail.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/GoodsDetail.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; * 统一下单-单品列表 * * @author Chopper - * @date 2020/12/17 17:47 + * @since 2020/12/17 17:47 */ @Data diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/H5Info.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/H5Info.java index d63430d9..c6c8db37 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/H5Info.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/H5Info.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; * 统一下单-H5 场景信息 * * @author Chopper - * @date 2020/12/17 17:56 + * @since 2020/12/17 17:56 */ @Data diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Payer.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Payer.java index f6e0cf7d..c6540b5f 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Payer.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/Payer.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; * 统一下单-支付者 * * @author Chopper - * @date 2020/12/17 17:56 + * @since 2020/12/17 17:56 */ @Data diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/RefundModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/RefundModel.java index f855e6bb..0e4cdf29 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/RefundModel.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/RefundModel.java @@ -8,7 +8,7 @@ import lombok.experimental.Accessors; * 国内退款-退款申请 * * @author Chopper - * @date 2020/12/17 17:58 + * @since 2020/12/17 17:58 */ @Data @Accessors(chain = true) diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SceneInfo.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SceneInfo.java index 879511ba..4aaca6a6 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SceneInfo.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SceneInfo.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; * 统一下单-场景信息 * * @author Chopper - * @date 2020/12/17 17:57 + * @since 2020/12/17 17:57 */ @Data diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SettleInfo.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SettleInfo.java index 9e11f8fc..5c83dcba 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SettleInfo.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/SettleInfo.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; * 统一下单-结算信息 * * @author Chopper - * @date 2020/12/17 17:58 + * @since 2020/12/17 17:58 */ @Data @Accessors(chain = true) diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/StoreInfo.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/StoreInfo.java index a4aef092..f5a3789d 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/StoreInfo.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/StoreInfo.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; * 统一下单-商户门店信息 * * @author Chopper - * @date 2020/12/17 17:58 + * @since 2020/12/17 17:58 */ @Data diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/TransferDetailInput.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/TransferDetailInput.java new file mode 100644 index 00000000..bbb603fe --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/TransferDetailInput.java @@ -0,0 +1,29 @@ +package cn.lili.modules.payment.kit.plugin.wechat.model; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 转账的明细 + * + * @author Bulbasaur + */ +@Data +@Accessors(chain = true) +public class TransferDetailInput { + //商户系统内部区分转账批次单下不同转账明细单的唯一标识,要求此参数只能由数字、大小写字母组成 + private String out_detail_no; + //转账金额单位为“分” + private Integer transfer_amount; + //单条转账备注(微信用户会收到该备注),UTF8编码,最多允许32个字符 + private String transfer_remark; + //商户appid下,某用户的openid + private String openid; + + //收款方真实姓名。支持标准RSA算法和国密算法,公钥由微信侧提供 + //明细转账金额<0.3元时,不允许填写收款用户姓名 + //明细转账金额 >= 2,000元时,该笔明细必须填写收款用户姓名 + //同一批次转账明细中的姓名字段传入规则需保持一致,也即全部填写、或全部不填写 + //若商户传入收款用户姓名,微信支付会校验用户openID与姓名是否一致,并提供电子回单 + //private String user_name; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/TransferModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/TransferModel.java new file mode 100644 index 00000000..a81abeca --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/TransferModel.java @@ -0,0 +1,31 @@ +package cn.lili.modules.payment.kit.plugin.wechat.model; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 提现 + * @author Bulbasaur + */ +@Data +@Accessors(chain = true) +public class TransferModel { + //申请商户号的appid或商户号绑定的appid(企业号corpid即为此appid) + private String appid; + //商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 + private String out_batch_no; + //该笔批量转账的名称 + private String batch_name; + //转账说明,UTF8编码,最多允许32个字符 + private String batch_remark; + //转账金额单位为“分”。转账总金额必须与批次内所有明细转账金额之和保持一致,否则无法发起转账操作 + private Integer total_amount; + //一个转账批次单最多发起一千笔转账。转账总笔数必须与批次内所有明细之和保持一致,否则无法发起转账操作 + private Integer total_num; + //发起批量转账的明细列表,最多一千笔 + private List transfer_detail_list; + //必填,指定该笔转账使用的转账场景ID + private String transfer_scene_id; +} diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/UnifiedOrderModel.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/UnifiedOrderModel.java index 91adc5be..52aeff50 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/UnifiedOrderModel.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/UnifiedOrderModel.java @@ -1,5 +1,7 @@ package cn.lili.modules.payment.kit.plugin.wechat.model; +import cn.hutool.json.JSONUtil; +import cn.lili.common.utils.StringUtils; import lombok.Data; import lombok.experimental.Accessors; @@ -8,7 +10,7 @@ import lombok.experimental.Accessors; * 统一下单-商户门店信息 * * @author Chopper - * @date 2020/12/17 17:58 + * @since 2020/12/17 17:58 */ @Data @@ -42,6 +44,7 @@ public class UnifiedOrderModel { * 商品描述 */ private String description; + /** * 商户订单号 */ @@ -82,6 +85,7 @@ public class UnifiedOrderModel { * 场景信息 */ private SceneInfo scene_info; + } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/package-info.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/package-info.java deleted file mode 100644 index f32da037..00000000 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/model/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -package cn.lili.modules.payment.kit.plugin.wechat.model; -//这个目录的很多类的属性都是下划线分割,不符合本产品的驼峰类型约定,后续会进行处理 \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/payment/mapper/RefundLogMapper.java b/framework/src/main/java/cn/lili/modules/payment/mapper/RefundLogMapper.java index 73a4ade7..da84b7fd 100644 --- a/framework/src/main/java/cn/lili/modules/payment/mapper/RefundLogMapper.java +++ b/framework/src/main/java/cn/lili/modules/payment/mapper/RefundLogMapper.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 退款日志数据层 * @author Chopper - * @date 2020-12-19 09:25 + * @since 2020-12-19 09:25 */ public interface RefundLogMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/payment/package-info.java b/framework/src/main/java/cn/lili/modules/payment/package-info.java new file mode 100644 index 00000000..81001980 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/payment/package-info.java @@ -0,0 +1,5 @@ +/** + * 项目部分参考 IJPay + * git地址 https://gitee.com/javen205/IJPay + */ +package cn.lili.modules.payment; \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/payment/service/PaymentService.java b/framework/src/main/java/cn/lili/modules/payment/service/PaymentService.java index f78efc8d..700dd1a1 100644 --- a/framework/src/main/java/cn/lili/modules/payment/service/PaymentService.java +++ b/framework/src/main/java/cn/lili/modules/payment/service/PaymentService.java @@ -1,16 +1,12 @@ package cn.lili.modules.payment.service; -import cn.lili.modules.order.order.entity.vo.PaymentLog; import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; /** * 支付日志 业务层 * * @author Chopper - * @date 2020-12-19 09:25 + * @since 2020-12-19 09:25 */ public interface PaymentService { @@ -29,13 +25,4 @@ public interface PaymentService { */ void adminPaySuccess(PaymentSuccessParams paymentSuccessParams); - - /** - * 获取支付日志 - * - * @param initPage - * @param initWrapper - * @return - */ - IPage page(Page initPage, QueryWrapper initWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/payment/service/RefundLogService.java b/framework/src/main/java/cn/lili/modules/payment/service/RefundLogService.java index 6b01ea1c..dc505a10 100644 --- a/framework/src/main/java/cn/lili/modules/payment/service/RefundLogService.java +++ b/framework/src/main/java/cn/lili/modules/payment/service/RefundLogService.java @@ -7,7 +7,13 @@ import com.baomidou.mybatisplus.extension.service.IService; * 退款日志 业务层 * * @author Chopper - * @date 2020-12-19 09:25 + * @since 2020-12-19 09:25 */ public interface RefundLogService extends IService { + /** + * 根据售后sn查询退款日志 + * @param sn + * @return + */ + RefundLog queryByAfterSaleSn(String sn); } diff --git a/framework/src/main/java/cn/lili/modules/payment/serviceimpl/PaymentServiceImpl.java b/framework/src/main/java/cn/lili/modules/payment/serviceimpl/PaymentServiceImpl.java index ec52e5a9..97b69d8b 100644 --- a/framework/src/main/java/cn/lili/modules/payment/serviceimpl/PaymentServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/payment/serviceimpl/PaymentServiceImpl.java @@ -1,19 +1,12 @@ package cn.lili.modules.payment.serviceimpl; -import cn.lili.modules.order.order.entity.vo.PaymentLog; -import cn.lili.modules.order.order.mapper.OrderMapper; -import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; import cn.lili.modules.payment.kit.CashierSupport; +import cn.lili.modules.payment.kit.dto.PaymentSuccessParams; import cn.lili.modules.payment.kit.params.CashierExecute; import cn.lili.modules.payment.service.PaymentService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -21,12 +14,10 @@ import java.util.List; * 支付日志 业务实现 * * @author Chopper - * @date 2020-12-19 09:25 + * @since 2020-12-19 09:25 */ @Slf4j @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PaymentServiceImpl implements PaymentService { @Autowired @@ -34,14 +25,15 @@ public class PaymentServiceImpl implements PaymentService { @Autowired private CashierSupport cashierSupport; - private final OrderMapper orderMapper; - @Override public void success(PaymentSuccessParams paymentSuccessParams) { + //支付状态 boolean paymentResult = cashierSupport.paymentResult(paymentSuccessParams.getPayParam()); + + //已支付则返回 if (paymentResult) { - log.warn("订单支付状态后,调用支付成功接口,流水号:{}", paymentSuccessParams.getReceivableNo()); + log.warn("收银台重复收款,流水号:{}", paymentSuccessParams.getReceivableNo()); return; } @@ -61,9 +53,4 @@ public class PaymentServiceImpl implements PaymentService { cashierExecute.paymentSuccess(paymentSuccessParams); } } - - @Override - public IPage page(Page initPage, QueryWrapper initWrapper) { - return orderMapper.queryPaymentLogs(initPage, initWrapper); - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/payment/serviceimpl/RefundLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/payment/serviceimpl/RefundLogServiceImpl.java index 601374ac..42e763eb 100644 --- a/framework/src/main/java/cn/lili/modules/payment/serviceimpl/RefundLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/payment/serviceimpl/RefundLogServiceImpl.java @@ -3,21 +3,21 @@ package cn.lili.modules.payment.serviceimpl; import cn.lili.modules.payment.entity.RefundLog; import cn.lili.modules.payment.mapper.RefundLogMapper; import cn.lili.modules.payment.service.RefundLogService; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 退款日志 业务实现 * * @author Chopper - * @date 2020-12-19 09:25 + * @since 2020-12-19 09:25 */ @Service -@Transactional(rollbackFor = Exception.class) public class RefundLogServiceImpl extends ServiceImpl implements RefundLogService { - + @Override + public RefundLog queryByAfterSaleSn(String sn) { + return this.getOne(new LambdaUpdateWrapper().eq(RefundLog::getAfterSaleNo, sn)); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/SettingKeys.java b/framework/src/main/java/cn/lili/modules/permission/SettingKeys.java index 5065f4c0..8aa026bb 100644 --- a/framework/src/main/java/cn/lili/modules/permission/SettingKeys.java +++ b/framework/src/main/java/cn/lili/modules/permission/SettingKeys.java @@ -4,7 +4,7 @@ package cn.lili.modules.permission; * 系统秘钥 * * @author paulG - * @date 2020/11/17 4:23 下午 + * @since 2020/11/17 4:23 下午 */ public enum SettingKeys { diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dos/AdminUser.java b/framework/src/main/java/cn/lili/modules/permission/entity/dos/AdminUser.java index 52993199..92977e0f 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dos/AdminUser.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dos/AdminUser.java @@ -1,25 +1,20 @@ package cn.lili.modules.permission.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 管理员类 * * @author Chopper - * @date 2020/11/19 11:42 + * @since 2020/11/19 11:42 */ @Data -@Entity -@Table(name = "li_admin_user") @TableName("li_admin_user") @ApiModel(value = "管理员") public class AdminUser extends BaseEntity { @@ -27,23 +22,25 @@ public class AdminUser extends BaseEntity { private static final long serialVersionUID = 2918352800205024873L; @ApiModelProperty(value = "用户名") - @Column(unique = true, nullable = false, columnDefinition = "varchar(200)") + @Length(max = 20,message = "用户名长度不能超过20个字符") private String username; @ApiModelProperty(value = "密码") private String password; @ApiModelProperty(value = "昵称") + @Length(max = 10,message = "昵称长度不能超过10个字符") private String nickName; @ApiModelProperty(value = "手机") + @Length(max = 11,message = "手机号长度不能超过11") private String mobile; @ApiModelProperty(value = "邮件") + @Length(max = 100,message = "邮箱长度不能超过100") private String email; @ApiModelProperty(value = "用户头像") - @Column(length = 1000) private String avatar = "https://i.loli.net/2020/11/19/LyN6JF7zZRskdIe.png"; @ApiModelProperty(value = "是否是超级管理员 超级管理员/普通管理员") diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dos/Department.java b/framework/src/main/java/cn/lili/modules/permission/entity/dos/Department.java index 090c633f..854db81f 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dos/Department.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dos/Department.java @@ -1,39 +1,36 @@ package cn.lili.modules.permission.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; -import java.math.BigDecimal; +import javax.validation.constraints.NotNull; /** * 部门 * * @author Chopper - * @date 2020/11/19 11:57 + * @since 2020/11/19 11:57 */ @Data -@Entity -@Table(name = "li_department") @TableName("li_department") @ApiModel(value = "部门") +@EqualsAndHashCode(callSuper = true) public class Department extends BaseEntity { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "部门名称") + @NotNull(message = "部门名称不能为空") private String title; @ApiModelProperty(value = "父id") private String parentId; @ApiModelProperty(value = "排序值") - @Column(precision = 10, scale = 2) - private BigDecimal sortOrder; + private Double sortOrder; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dos/DepartmentRole.java b/framework/src/main/java/cn/lili/modules/permission/entity/dos/DepartmentRole.java index 892747ab..ba182b03 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dos/DepartmentRole.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dos/DepartmentRole.java @@ -1,6 +1,6 @@ package cn.lili.modules.permission.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,18 +8,14 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 角色部门绑定关系 * * @author Chopper - * @date 2020/11/19 12:18 + * @since 2020/11/19 12:18 */ @Data -@Entity -@Table(name = "li_department_role") @TableName("li_department_role") @ApiModel(value = "角色部门") @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dos/Menu.java b/framework/src/main/java/cn/lili/modules/permission/entity/dos/Menu.java index 8d34b045..dde3889f 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dos/Menu.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dos/Menu.java @@ -1,61 +1,50 @@ package cn.lili.modules.permission.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import java.math.BigDecimal; /** * 菜单权限 * * @author Chopper - * @date 2020/11/19 12:12 + * @since 2020/11/19 12:12 */ @Data -@Entity -@Table(name = "li_menu") @TableName("li_menu") @ApiModel(value = "菜单权限") public class Menu extends BaseEntity { private static final long serialVersionUID = 7050744476203495207L; - @ApiModelProperty(value = "菜单/权限名称") - private String name; - - @ApiModelProperty(value = "层级") - private Integer level; @ApiModelProperty(value = "菜单标题") private String title; - @ApiModelProperty(value = "赋权API地址,正则表达式") + @ApiModelProperty(value = "路由名称") + private String name; + + @ApiModelProperty(value = "路径") private String path; - @ApiModelProperty(value = "前端路由") - private String frontRoute; + @ApiModelProperty(value = "菜单层级") + private Integer level; - @ApiModelProperty(value = "图标") - private String icon; + @ApiModelProperty(value = "前端目录文件") + private String frontRoute; @ApiModelProperty(value = "父id") private String parentId = "0"; - @ApiModelProperty(value = "说明备注") - private String description; - @ApiModelProperty(value = "排序值") - @Column(precision = 10, scale = 2) - private BigDecimal sortOrder; + private Double sortOrder; - @ApiModelProperty(value = "文件地址") - private String frontComponent; + @ApiModelProperty(value = "权限URL,*号模糊匹配,逗号分割") + private String permission; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dos/Role.java b/framework/src/main/java/cn/lili/modules/permission/entity/dos/Role.java index 72e33f86..4057bcde 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dos/Role.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dos/Role.java @@ -1,25 +1,21 @@ package cn.lili.modules.permission.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 角色 * * @author Chopper - * @date 2020/11/19 11:57 + * @since 2020/11/19 11:57 */ @EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_role") @TableName("li_role") @ApiModel(value = "角色") public class Role extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dos/RoleMenu.java b/framework/src/main/java/cn/lili/modules/permission/entity/dos/RoleMenu.java index 46177b63..571e62f5 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dos/RoleMenu.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dos/RoleMenu.java @@ -1,23 +1,19 @@ package cn.lili.modules.permission.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 角色权限绑定关系 * * @author Chopper - * @date 2020/11/19 12:18 + * @since 2020/11/19 12:18 */ @Data -@Entity -@Table(name = "li_role_menu") @TableName("li_role_menu") @ApiModel(value = "角色权限") public class RoleMenu extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dos/UserRole.java b/framework/src/main/java/cn/lili/modules/permission/entity/dos/UserRole.java index 7ce23182..f6605d22 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dos/UserRole.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dos/UserRole.java @@ -1,26 +1,21 @@ package cn.lili.modules.permission.entity.dos; -import cn.lili.base.IdEntity; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; - /** * 用户角色 * * @author Chopper - * @date 2020/11/19 12:18 + * @since 2020/11/19 12:18 */ @Data -@Entity -@Table(name = "li_user_role") @TableName("li_user_role") @ApiModel(value = "用户角色") -public class UserRole extends IdEntity { +public class UserRole extends BaseIdEntity { @ApiModelProperty(value = "用户唯一id") private String userId; diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java b/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java index 7986dc9b..bc1f6813 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java @@ -1,18 +1,18 @@ package cn.lili.modules.permission.entity.dto; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; -import javax.persistence.Column; import javax.validation.constraints.NotEmpty; /** * 管理员入库dto * * @author Chopper - * @date 2020/11/16 19:55 + * @since 2020/11/16 19:55 */ @Data @ApiModel(value = "管理员入库dto") @@ -20,29 +20,35 @@ public class AdminUserDTO extends BaseEntity { private static final long serialVersionUID = 1L; + @ApiModelProperty(value = "用户名") - @NotEmpty(message = "用户名不能为空") - @Column(unique = true, nullable = false) + @Length(max = 20,message = "用户名长度不能超过20个字符") private String username; - @NotEmpty(message = "密码不能为空") @ApiModelProperty(value = "密码") private String password; @ApiModelProperty(value = "昵称") + @Length(max = 10,message = "昵称长度不能超过10个字符") private String nickName; @ApiModelProperty(value = "手机") + @Length(max = 11,message = "手机号长度不能超过11") private String mobile; @ApiModelProperty(value = "邮件") + @Length(max = 100,message = "邮箱长度不能超过100") private String email; + @ApiModelProperty(value = "头像") + private String avatar; + @ApiModelProperty(value = "描述/详情/备注") private String description; @ApiModelProperty(value = "所属部门id") private String departmentId; - private boolean isSuper; + @ApiModelProperty(value = "是否为超级管理员") + private Boolean isSuper; } diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dto/MenuSearchParams.java b/framework/src/main/java/cn/lili/modules/permission/entity/dto/MenuSearchParams.java index a822758a..e4fb54ae 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/dto/MenuSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/dto/MenuSearchParams.java @@ -7,7 +7,7 @@ import lombok.Data; * 权限搜索参数 * * @author Chopper - * @date 2020-11-19 16:46 + * @since 2020-11-19 16:46 */ @Data public class MenuSearchParams { diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/vo/AdminUserVO.java b/framework/src/main/java/cn/lili/modules/permission/entity/vo/AdminUserVO.java index 72750041..d7bd826b 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/vo/AdminUserVO.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/vo/AdminUserVO.java @@ -13,7 +13,7 @@ import java.util.List; * 管理员VO * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ @Data public class AdminUserVO extends AdminUser { diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/vo/DepartmentVO.java b/framework/src/main/java/cn/lili/modules/permission/entity/vo/DepartmentVO.java index b5c291c9..5e273cb2 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/vo/DepartmentVO.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/vo/DepartmentVO.java @@ -11,7 +11,7 @@ import java.util.List; * 部门VO * * @author Chopper - * @date 2020-11-23 18:48 + * @since 2020-11-23 18:48 */ @Data public class DepartmentVO extends Department { diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/vo/MenuVO.java b/framework/src/main/java/cn/lili/modules/permission/entity/vo/MenuVO.java index 3aba6f18..5543c09b 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/vo/MenuVO.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/vo/MenuVO.java @@ -13,7 +13,7 @@ import java.util.List; * 菜单VO 展示模型 * * @author Chopper - * @date 2020/11/20 15:38 + * @since 2020/11/20 15:38 */ @Data diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/vo/RoleVO.java b/framework/src/main/java/cn/lili/modules/permission/entity/vo/RoleVO.java index a9eb9ded..d86352b5 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/vo/RoleVO.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/vo/RoleVO.java @@ -11,7 +11,7 @@ import java.util.List; * RoleVO * * @author Chopper - * @date 2020-11-22 17:42 + * @since 2020-11-22 17:42 */ @Data public class RoleVO extends Role { diff --git a/framework/src/main/java/cn/lili/modules/base/entity/systemlog/SystemLogVO.java b/framework/src/main/java/cn/lili/modules/permission/entity/vo/SystemLogVO.java similarity index 58% rename from framework/src/main/java/cn/lili/modules/base/entity/systemlog/SystemLogVO.java rename to framework/src/main/java/cn/lili/modules/permission/entity/vo/SystemLogVO.java index aa73148f..5087b0fc 100644 --- a/framework/src/main/java/cn/lili/modules/base/entity/systemlog/SystemLogVO.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/vo/SystemLogVO.java @@ -1,9 +1,16 @@ -package cn.lili.modules.base.entity.systemlog; +package cn.lili.modules.permission.entity.vo; import cn.lili.common.utils.ObjectUtil; -import com.fasterxml.jackson.annotation.JsonFormat; +import cn.lili.elasticsearch.EsSuffix; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.Accessors; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; import java.io.Serializable; import java.util.Date; @@ -14,56 +21,72 @@ import java.util.Map; * 日志 * * @author Chopper - * @date 2020/12/2 17:50 + * @since 2020/12/2 17:50 */ @Data +@Document(indexName = "#{@elasticsearchProperties.indexPrefix}_" + EsSuffix.LOGS_INDEX_NAME) +@ToString +@NoArgsConstructor +@Accessors(chain = true) public class SystemLogVO implements Serializable { private static final long serialVersionUID = -8995552592401630086L; - + @Id @ApiModelProperty(value = "id") private String id; - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "日志记录时间") - private Date createTime = new Date(); + @Field(type = FieldType.Long) + private Long createTime = new Date().getTime(); @ApiModelProperty(value = "请求用户") + @Field(type = FieldType.Text) private String username; @ApiModelProperty(value = "请求路径") + @Field(type = FieldType.Text) private String requestUrl; @ApiModelProperty(value = "请求参数") + @Field(type = FieldType.Text) private String requestParam; + @ApiModelProperty(value = "响应参数") + @Field(type = FieldType.Text) private String responseBody; @ApiModelProperty(value = "ip") + @Field(type = FieldType.Keyword) private String ip; @ApiModelProperty(value = "方法操作名称") + @Field(type = FieldType.Keyword) private String name; @ApiModelProperty(value = "请求类型") + @Field(type = FieldType.Keyword) private String requestType; @ApiModelProperty(value = "自定义日志内容") + @Field(type = FieldType.Text) private String customerLog; @ApiModelProperty(value = "ip信息") + @Field(type = FieldType.Text) private String ipInfo; @ApiModelProperty(value = "花费时间") + @Field(type = FieldType.Integer) private Integer costTime; @ApiModelProperty(value = "商家") + @Field(type = FieldType.Long) private Long storeId = -1L; /** diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/vo/UserMenuVO.java b/framework/src/main/java/cn/lili/modules/permission/entity/vo/UserMenuVO.java index 671495a0..228dd19d 100644 --- a/framework/src/main/java/cn/lili/modules/permission/entity/vo/UserMenuVO.java +++ b/framework/src/main/java/cn/lili/modules/permission/entity/vo/UserMenuVO.java @@ -7,7 +7,7 @@ import lombok.Data; * RoleMenuVO * * @author Chopper - * @date 2020-11-24 11:45 + * @since 2020-11-24 11:45 */ @Data public class UserMenuVO extends Menu { @@ -17,6 +17,12 @@ public class UserMenuVO extends Menu { /** * 是否是超级管理员 */ - private Boolean isSupper; + private Boolean isSuper; + public Boolean getSuper() { + if (this.isSuper == null) { + return false; + } + return isSuper; + } } diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/AdminUserMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/AdminUserMapper.java index 75ff89ae..d3ff44eb 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/AdminUserMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/AdminUserMapper.java @@ -9,7 +9,7 @@ import java.util.List; * 用户数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface AdminUserMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentMapper.java index e6e7c6d3..3881824d 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 部门数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface DepartmentMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentRoleMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentRoleMapper.java index ca1220fb..5d0c97fc 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentRoleMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/DepartmentRoleMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 部门角色数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface DepartmentRoleMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java index 047b203b..049fb70e 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/MenuMapper.java @@ -11,18 +11,30 @@ import java.util.List; * 菜单数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface MenuMapper extends BaseMapper { + /** + * 根据用户获取菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ @Select("SELECT menu.* FROM li_menu AS menu WHERE menu.id IN (" + "SELECT rm.menu_id FROM li_role_menu AS rm WHERE rm.role_id IN (" + "SELECT ur.role_id FROM li_user_role AS ur WHERE ur.user_id=#{userId}) OR rm.role_id IN (" + - "SELECT dr.role_id FROM li_department_role AS dr WHERE dr.id=(" + + "SELECT dr.role_id FROM li_department_role AS dr WHERE dr.department_id =(" + "SELECT department_id FROM li_admin_user AS au WHERE au.id = #{userId})))") List findByUserId(String userId); - @Select("SELECT rm.is_super,m.*FROM li_menu AS m INNER JOIN li_role_menu AS rm ON rm.menu_id=m.id WHERE rm.role_id IN (" + + /** + * 根据用户获取菜单权限 + * + * @param userId 用户ID + * @return 用户菜单VO列表 + */ + @Select("SELECT rm.is_super as is_super,m.*FROM li_menu AS m INNER JOIN li_role_menu AS rm ON rm.menu_id=m.id WHERE rm.role_id IN (" + "SELECT ur.role_id FROM li_user_role AS ur WHERE ur.user_id=#{userId}) OR rm.role_id IN (" + "SELECT dr.role_id FROM li_department_role AS dr INNER JOIN li_admin_user AS au ON au.department_id=dr.department_id " + "WHERE au.id=#{userId}) GROUP BY m.id,rm.is_super ORDER BY rm.is_super desc") diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/RoleDepartmentMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/RoleDepartmentMapper.java index 12c82357..3cfd4eb4 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/RoleDepartmentMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/RoleDepartmentMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 角色部门数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface RoleDepartmentMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMapper.java index 6fc2af6b..5d16cffc 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 角色数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface RoleMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMenuMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMenuMapper.java index 3e64bec2..d08e6579 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMenuMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/RoleMenuMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 角色菜单数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface RoleMenuMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/RolePermissionMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/RolePermissionMapper.java index 978d2681..af075a9c 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/RolePermissionMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/RolePermissionMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 角色权限数据处理层 * * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface RolePermissionMapper extends BaseMapper { } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/mapper/UserRoleMapper.java b/framework/src/main/java/cn/lili/modules/permission/mapper/UserRoleMapper.java index 57fe3be8..f513905a 100644 --- a/framework/src/main/java/cn/lili/modules/permission/mapper/UserRoleMapper.java +++ b/framework/src/main/java/cn/lili/modules/permission/mapper/UserRoleMapper.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 角色权限数据处理层 * @author Chopper - * @date 2020-11-22 09:17 + * @since 2020-11-22 09:17 */ public interface UserRoleMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/permission/repository/SystemLogRepository.java b/framework/src/main/java/cn/lili/modules/permission/repository/SystemLogRepository.java new file mode 100644 index 00000000..49e221ec --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/permission/repository/SystemLogRepository.java @@ -0,0 +1,14 @@ +package cn.lili.modules.permission.repository; + +import cn.lili.modules.permission.entity.vo.SystemLogVO; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +/** + * 日志 + * + * @author paulG + * @since 2021/12/13 + **/ +public interface SystemLogRepository extends ElasticsearchRepository { + +} diff --git a/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java b/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java index 7eb150f7..4fc2cdb7 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java @@ -1,7 +1,8 @@ package cn.lili.modules.permission.service; -import cn.lili.common.token.Token; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; import cn.lili.modules.permission.entity.dos.AdminUser; import cn.lili.modules.permission.entity.dto.AdminUserDTO; import cn.lili.modules.permission.entity.vo.AdminUserVO; @@ -17,7 +18,7 @@ import java.util.List; * 用户业务层 * * @author Chopper - * @date 2020/11/17 3:42 下午 + * @since 2020/11/17 3:42 下午 */ @CacheConfig(cacheNames = "{adminuser}") public interface AdminUserService extends IService { @@ -83,10 +84,11 @@ public interface AdminUserService extends IService { /** - * 登录 + * 用户登录 * - * @param username - * @param password + * @param username 用户名 + * @param password 密码 + * @return token */ Token login(String username, String password); @@ -94,8 +96,22 @@ public interface AdminUserService extends IService { * 刷新token * * @param refreshToken - * @return + * @return token */ - Object refreshToken(String refreshToken); + Token refreshToken(String refreshToken); + + /** + * 登出 + * + * @param userEnums token角色类型 + */ + void logout(UserEnums userEnums); + + /** + * 登出 + * + * @param adminUserIds 用户id + */ + void logout(List adminUserIds); } diff --git a/framework/src/main/java/cn/lili/modules/permission/service/DepartmentRoleService.java b/framework/src/main/java/cn/lili/modules/permission/service/DepartmentRoleService.java index ee9e1b03..bd95b17c 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/DepartmentRoleService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/DepartmentRoleService.java @@ -9,7 +9,7 @@ import java.util.List; * 部门角色业务层 * * @author Chopper - * @date 2020/11/22 12:08 + * @since 2020/11/22 12:08 */ public interface DepartmentRoleService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/permission/service/DepartmentService.java b/framework/src/main/java/cn/lili/modules/permission/service/DepartmentService.java index b13c7126..38ff2e3a 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/DepartmentService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/DepartmentService.java @@ -11,7 +11,7 @@ import java.util.List; * 部门业务层 * * @author Chopper - * @date 2020/11/17 3:43 下午 + * @since 2020/11/17 3:43 下午 */ public interface DepartmentService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/permission/service/MenuService.java b/framework/src/main/java/cn/lili/modules/permission/service/MenuService.java index da5280f1..1d91e510 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/MenuService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/MenuService.java @@ -1,7 +1,7 @@ package cn.lili.modules.permission.service; -import cn.lili.modules.permission.entity.dto.MenuSearchParams; import cn.lili.modules.permission.entity.dos.Menu; +import cn.lili.modules.permission.entity.dto.MenuSearchParams; import cn.lili.modules.permission.entity.vo.MenuVO; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.cache.annotation.CacheConfig; @@ -12,7 +12,7 @@ import java.util.List; * 权限业务层 * * @author Chopper - * @date 2020/11/17 3:45 下午 + * @since 2020/11/17 3:45 下午 */ @CacheConfig(cacheNames = "{menu}") public interface MenuService extends IService { @@ -63,4 +63,12 @@ public interface MenuService extends IService { */ void deleteIds(List ids); + /** + * 添加更新菜单 + * + * @param menu 菜单数据 + * @return 是否成功 + */ + boolean saveOrUpdateMenu(Menu menu); + } diff --git a/framework/src/main/java/cn/lili/modules/permission/service/RoleMenuService.java b/framework/src/main/java/cn/lili/modules/permission/service/RoleMenuService.java index 681124b7..f2261c03 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/RoleMenuService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/RoleMenuService.java @@ -10,7 +10,7 @@ import java.util.List; * 角色菜单接口 * * @author Chopper - * @date 2020/11/22 11:43 + * @since 2020/11/22 11:43 */ public interface RoleMenuService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/permission/service/RoleService.java b/framework/src/main/java/cn/lili/modules/permission/service/RoleService.java index ba8f0e69..e1334208 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/RoleService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/RoleService.java @@ -10,7 +10,7 @@ import java.util.List; * 角色业务层 * * @author Chopper - * @date 2020/11/17 3:45 下午 + * @since 2020/11/17 3:45 下午 */ public interface RoleService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/permission/service/SystemLogService.java b/framework/src/main/java/cn/lili/modules/permission/service/SystemLogService.java index e0dbd816..923991b2 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/SystemLogService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/SystemLogService.java @@ -2,7 +2,7 @@ package cn.lili.modules.permission.service; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.SearchVO; -import cn.lili.modules.base.entity.systemlog.SystemLogVO; +import cn.lili.modules.permission.entity.vo.SystemLogVO; import com.baomidou.mybatisplus.core.metadata.IPage; import java.util.List; @@ -11,7 +11,7 @@ import java.util.List; * 系统日志业务层 * * @author Chopper - * @date 2020/11/17 3:45 下午 + * @since 2020/11/17 3:45 下午 */ public interface SystemLogService { @@ -38,9 +38,12 @@ public interface SystemLogService { /** * 分页搜索获取日志 * - * @param key - * @param searchVo - * @return + * @param key 关键字 + * @param searchVo 查询VO + * @param pageVO 分页 + * @param operatorName 操作人 + * @param storeId 店铺ID + * @return 日志分页 */ IPage queryLog(String storeId, String operatorName, String key, SearchVO searchVo, PageVO pageVO); } diff --git a/framework/src/main/java/cn/lili/modules/permission/service/UserRoleService.java b/framework/src/main/java/cn/lili/modules/permission/service/UserRoleService.java index 1a6014f9..0cb37699 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/UserRoleService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/UserRoleService.java @@ -9,7 +9,7 @@ import java.util.List; * 管理员业务层 * * @author Chopper - * @date 2020/11/17 3:46 下午 + * @since 2020/11/17 3:46 下午 */ public interface UserRoleService extends IService { @@ -32,8 +32,8 @@ public interface UserRoleService extends IService { /** * 更新用户拥有的角色 * - * @param userId - * @return + * @param userId 角色 + * @param userRoles 角色权限 */ void updateUserRole(String userId, List userRoles); diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java index 1be2912c..a0da41fa 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java @@ -1,12 +1,14 @@ package cn.lili.modules.permission.serviceimpl; -import cn.lili.common.aop.syslog.annotation.SystemLogPoint; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.token.Token; -import cn.lili.common.token.base.generate.ManagerTokenGenerate; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.StringUtils; import cn.lili.modules.permission.entity.dos.AdminUser; @@ -17,12 +19,14 @@ import cn.lili.modules.permission.entity.dto.AdminUserDTO; import cn.lili.modules.permission.entity.vo.AdminUserVO; import cn.lili.modules.permission.mapper.AdminUserMapper; import cn.lili.modules.permission.service.*; +import cn.lili.modules.system.aspect.annotation.SystemLogPoint; +import cn.lili.modules.system.token.ManagerTokenGenerate; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -37,23 +41,30 @@ import java.util.stream.Collectors; * 用户业务层实现 * * @author Chopper - * @date 2020/11/17 3:46 下午 + * @since 2020/11/17 3:46 下午 */ +@Slf4j @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class AdminUserServiceImpl extends ServiceImpl implements AdminUserService { - + @Autowired private UserRoleService userRoleService; - + @Autowired private RoleService roleService; - + @Autowired private DepartmentService departmentService; - + @Autowired private MenuService menuService; - + @Autowired private ManagerTokenGenerate managerTokenGenerate; + @Autowired + private Cache cache; + + /** + * 角色长度 + */ + private final int rolesMaxSize = 10; + @Override public IPage adminUserPage(Page initPage, QueryWrapper initWrapper) { Page adminUserPage = page(initPage, initWrapper); @@ -64,29 +75,29 @@ public class AdminUserServiceImpl extends ServiceImpl { AdminUserVO adminUserVO = new AdminUserVO(adminUser); - if (!StringUtils.isEmpty(adminUser.getDepartmentId())) { + if (!CharSequenceUtil.isEmpty(adminUser.getDepartmentId())) { try { adminUserVO.setDepartmentTitle( departments.stream().filter - (department -> department.getId().equals(adminUser.getDepartmentId())) + (department -> department.getId().equals(adminUser.getDepartmentId())) .collect(Collectors.toList()) .get(0) .getTitle() ); } catch (Exception e) { - log.error("填充部门信息异常", e); + log.debug("权限部门信息异常", e); } } - if (!StringUtils.isEmpty(adminUser.getRoleIds())) { + if (!CharSequenceUtil.isEmpty(adminUser.getRoleIds())) { try { List memberRoles = Arrays.asList(adminUser.getRoleIds().split(",")); adminUserVO.setRoles( roles.stream().filter - (role -> memberRoles.contains(role.getId())) + (role -> memberRoles.contains(role.getId())) .collect(Collectors.toList()) ); } catch (Exception e) { - log.error("填充部门信息异常", e); + log.debug("权限色信息异常", e); } } result.add(adminUserVO); @@ -114,9 +125,9 @@ public class AdminUserServiceImpl extends ServiceImpl adminUserIds) { + if (adminUserIds == null || adminUserIds.isEmpty()) { + return; + } + adminUserIds.forEach(adminUserId -> { + cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MANAGER, adminUserId)); + cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MANAGER, adminUserId)); + }); + } @Override public AdminUser findByUsername(String username) { @@ -137,31 +169,28 @@ public class AdminUserServiceImpl extends ServiceImpl roles) { - if (roles.size() > 10) { - throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); - } - if (roles != null && roles.size() > 0) { - adminUser.setRoleIds(StringUtils.join(",", roles)); + + if (roles != null && !roles.isEmpty()) { + + if (roles.size() > rolesMaxSize) { + throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); + } + adminUser.setRoleIds(CharSequenceUtil.join(",", roles)); + + } else { + adminUser.setRoleIds(""); } - this.updateById(adminUser); updateRole(adminUser.getId(), roles); + this.updateById(adminUser); return true; } @@ -185,27 +214,27 @@ public class AdminUserServiceImpl extends ServiceImpl adminUsers = this.list(lambdaQueryWrapper); String password = StringUtils.md5("123456"); String newEncryptPass = new BCryptPasswordEncoder().encode(password); - if (null != adminUsers && adminUsers.size() > 0) { + if (null != adminUsers && !adminUsers.isEmpty()) { adminUsers.forEach(item -> item.setPassword(newEncryptPass)); this.updateBatchById(adminUsers); } } @Override + @Transactional(rollbackFor = Exception.class) public void saveAdminUser(AdminUserDTO adminUser, List roles) { AdminUser dbUser = new AdminUser(); BeanUtil.copyProperties(adminUser, dbUser); dbUser.setPassword(new BCryptPasswordEncoder().encode(dbUser.getPassword())); - if (roles.size() > 10) { + if (roles.size() > rolesMaxSize) { throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); } - if (roles != null && roles.size() > 0) { - dbUser.setRoleIds(StringUtils.join(",", roles)); + if (!roles.isEmpty()) { + dbUser.setRoleIds(CharSequenceUtil.join(",", roles)); } - - this.save(dbUser); - updateRole(adminUser.getId(), roles); + dbUser = this.findByUsername(dbUser.getUsername()); + updateRole(dbUser.getId(), roles); } @@ -219,6 +248,7 @@ public class AdminUserServiceImpl extends ServiceImpl roles) { - if (!StringUtils.isNotEmpty(roles)) { + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("user_id", userId); + userRoleService.remove(queryWrapper); + + if (roles.isEmpty()) { return; } List userRoles = new ArrayList<>(roles.size()); roles.forEach(id -> userRoles.add(new UserRole(userId, id))); userRoleService.updateUserRole(userId, userRoles); } - - - @Autowired - public void setUserRoleService(UserRoleService userRoleService) { - this.userRoleService = userRoleService; - } - - @Autowired - public void setRoleService(RoleService roleService) { - this.roleService = roleService; - } - - @Autowired - public void setDepartmentService(DepartmentService departmentService) { - this.departmentService = departmentService; - } - - @Autowired - public void setMenuService(MenuService menuService) { - this.menuService = menuService; - } - } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentRoleServiceImpl.java index 2eb7397e..10e484de 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentRoleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentRoleServiceImpl.java @@ -5,8 +5,6 @@ import cn.lili.modules.permission.mapper.DepartmentRoleMapper; import cn.lili.modules.permission.service.DepartmentRoleService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,27 +14,25 @@ import java.util.List; * 部门角色业务层实现 * * @author Chopper - * @date 2020/11/22 12:08 + * @since 2020/11/22 12:08 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DepartmentRoleServiceImpl extends ServiceImpl implements DepartmentRoleService { - private final DepartmentRoleMapper departmentRoleMapper; @Override public List listByDepartmentId(String departmentId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("department_id", departmentId); - return departmentRoleMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override + @Transactional(rollbackFor = Exception.class) public void updateByDepartmentId(String departmentId, List departmentRoles) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("department_id", departmentId); - departmentRoleMapper.delete(queryWrapper); + this.remove(queryWrapper); this.saveBatch(departmentRoles); } @@ -45,6 +41,6 @@ public class DepartmentRoleServiceImpl extends ServiceImpl ids) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("department_id", ids); - departmentRoleMapper.delete(queryWrapper); + this.remove(queryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java index 59f89c96..076eaaf5 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java @@ -11,7 +11,7 @@ import cn.lili.modules.permission.service.DepartmentRoleService; import cn.lili.modules.permission.service.DepartmentService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,29 +23,25 @@ import java.util.List; * 部门业务层实现 * * @author Chopper - * @date 2020/11/17 3:47 下午 + * @since 2020/11/17 3:47 下午 */ +@Slf4j @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DepartmentServiceImpl extends ServiceImpl implements DepartmentService { - //管理员 + /** + * 管理员 + */ + @Autowired private AdminUserService adminUserService; - //部门角色 + /** + * 部门角色 + */ + @Autowired private DepartmentRoleService departmentRoleService; - @Autowired - public void setDepartmentRoleService(DepartmentRoleService departmentRoleService) { - this.departmentRoleService = departmentRoleService; - } - - @Autowired - public void setAdminUserService(AdminUserService adminUserService) { - this.adminUserService = adminUserService; - } - @Override + @Transactional(rollbackFor = Exception.class) public void deleteByIds(List ids) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("department_id", ids); @@ -66,7 +62,7 @@ public class DepartmentServiceImpl extends ServiceImpl tree = new ArrayList<>(); all.forEach(item -> { - if (item.getParentId().equals("0")) { + if ("0".equals(item.getParentId())) { initChild(item, all); tree.add(item); } @@ -74,7 +70,7 @@ public class DepartmentServiceImpl extends ServiceImpl implements MenuService { - //菜单 - private final MenuMapper menuMapper; - //菜单角色 + /** + * 菜单角色 + */ + @Autowired private RoleMenuService roleMenuService; @Autowired - public void setRoleMenuService(RoleMenuService roleMenuService) { - this.roleMenuService = roleMenuService; - } + private Cache> cache; @Override public void deleteIds(List ids) { @@ -55,24 +52,44 @@ public class MenuServiceImpl extends ServiceImpl implements Me throw new ServiceException(ResultCode.PERMISSION_MENU_ROLE_ERROR); } this.removeByIds(ids); - //删除关联关系 - roleMenuService.deleteRoleMenu(ids); } @Override public List findUserTree() { - AuthUser authUser = UserContext.getCurrentUser(); - if (authUser.getIsSuper()) { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + if (Boolean.TRUE.equals(authUser.getIsSuper())) { return this.tree(); } - List userMenus = menuMapper.findByUserId(authUser.getId()); + List userMenus = this.findUserList(authUser.getId()); return this.tree(userMenus); } @Override public List findUserList(String userId) { - return menuMapper.findByUserId(userId); + String cacheKey = CachePrefix.USER_MENU.getPrefix(UserEnums.MANAGER) + userId; + List menuList = cache.get(cacheKey); + if (menuList == null) { + menuList = this.baseMapper.findByUserId(userId); + //每5分钟重新确认用户权限 + cache.put(cacheKey, menuList, 300L); + } + return menuList; + } + + /** + * 添加更新菜单 + * + * @param menu 菜单数据 + * @return 是否成功 + */ + @Override + public boolean saveOrUpdateMenu(Menu menu) { + if (CharSequenceUtil.isNotEmpty(menu.getId())) { + + } + cache.vagueDel(CachePrefix.USER_MENU.getPrefix(UserEnums.MANAGER)); + return this.saveOrUpdate(menu); } @Override @@ -86,16 +103,16 @@ public class MenuServiceImpl extends ServiceImpl implements Me public List searchList(MenuSearchParams menuSearchParams) { //title 需要特殊处理 String title = null; - if (StringUtils.isNotEmpty(menuSearchParams.getTitle())) { + if (CharSequenceUtil.isNotEmpty(menuSearchParams.getTitle())) { title = menuSearchParams.getTitle(); menuSearchParams.setTitle(null); } - QueryWrapper queryWrapper = PageUtil.initWrapper(menuSearchParams, new SearchVO()); - if (StringUtils.isNotEmpty(title)) { + QueryWrapper queryWrapper = PageUtil.initWrapper(menuSearchParams, new SearchVO()); + if (CharSequenceUtil.isNotEmpty(title)) { queryWrapper.like("title", title); } queryWrapper.orderByDesc("sort_order"); - return menuMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @@ -105,16 +122,16 @@ public class MenuServiceImpl extends ServiceImpl implements Me List menus = this.list(); return tree(menus); } catch (Exception e) { - e.printStackTrace(); + log.error("菜单树错误", e); } - return null; + return Collections.emptyList(); } /** * 传入自定义菜单集合 * - * @param menus - * @return + * @param menus 自定义菜单集合 + * @return 修改后的自定义菜单集合 */ private List tree(List menus) { List tree = new ArrayList<>(); @@ -126,12 +143,7 @@ public class MenuServiceImpl extends ServiceImpl implements Me } }); //对一级菜单排序 - tree.sort(new Comparator() { - @Override - public int compare(MenuVO o1, MenuVO o2) { - return o1.getSortOrder().compareTo(o2.getSortOrder()); - } - }); + tree.sort(Comparator.comparing(Menu::getSortOrder)); return tree; } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java index 7cfb9e9f..0d2a22dc 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java @@ -1,40 +1,48 @@ package cn.lili.modules.permission.serviceimpl; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.modules.permission.entity.dos.RoleMenu; import cn.lili.modules.permission.entity.vo.UserMenuVO; import cn.lili.modules.permission.mapper.MenuMapper; import cn.lili.modules.permission.mapper.RoleMenuMapper; import cn.lili.modules.permission.service.RoleMenuService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import groovy.util.logging.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; /** * 角色菜单业务层实现 * * @author Chopper - * @date 2020/11/22 11:43 + * @since 2020/11/22 11:43 */ +@Slf4j @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { - //菜单 - private final MenuMapper menuMapper; - //角色菜单 - private final RoleMenuMapper roleMenuMapper; + /** + * 菜单 + */ + @Resource + private MenuMapper menuMapper; + + + @Autowired + private Cache cache; @Override public List findByRoleId(String roleId) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("role_id", roleId); - return roleMenuMapper.selectList(queryWrapper); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(RoleMenu::getRoleId, roleId); + return this.baseMapper.selectList(queryWrapper); } @Override @@ -44,14 +52,16 @@ public class RoleMenuServiceImpl extends ServiceImpl i @Override + @Transactional(rollbackFor = Exception.class) public void updateRoleMenu(String roleId, List roleMenus) { try { //删除角色已经绑定的菜单 this.deleteRoleMenu(roleId); //重新保存角色菜单关系 this.saveBatch(roleMenus); + } catch (Exception e) { - e.printStackTrace(); + log.error("修改用户权限错误", e); } } @@ -60,13 +70,16 @@ public class RoleMenuServiceImpl extends ServiceImpl i //删除 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("role_id", roleId); - roleMenuMapper.delete(queryWrapper); + this.remove(queryWrapper); + } + @Override public void deleteRoleMenu(List roleId) { //删除 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("role_id", roleId); - roleMenuMapper.delete(queryWrapper); + this.remove(queryWrapper); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleServiceImpl.java index a7e2dd4e..510e7041 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleServiceImpl.java @@ -5,11 +5,11 @@ import cn.lili.common.exception.ServiceException; import cn.lili.modules.permission.entity.dos.Role; import cn.lili.modules.permission.mapper.RoleMapper; import cn.lili.modules.permission.service.DepartmentRoleService; +import cn.lili.modules.permission.service.RoleMenuService; import cn.lili.modules.permission.service.RoleService; import cn.lili.modules.permission.service.UserRoleService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,27 +20,24 @@ import java.util.List; * 角色业务层实现 * * @author Chopper - * @date 2020/11/17 3:50 下午 + * @since 2020/11/17 3:50 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class RoleServiceImpl extends ServiceImpl implements RoleService { - //部门角色 + /** + * 部门角色 + */ + @Autowired private DepartmentRoleService departmentRoleService; - //用户权限 + /** + * 用户权限 + */ + @Autowired private UserRoleService userRoleService; @Autowired - public void setDepartmentRoleService(DepartmentRoleService departmentRoleService) { - this.departmentRoleService = departmentRoleService; - } - - @Autowired - public void setUserRoleService(UserRoleService userRoleService) { - this.userRoleService = userRoleService; - } + private RoleMenuService roleMenuService; @Override public List findByDefaultRole(Boolean defaultRole) { @@ -50,6 +47,7 @@ public class RoleServiceImpl extends ServiceImpl implements Ro } @Override + @Transactional(rollbackFor = Exception.class) public void deleteRoles(List roleIds) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("role_id", roleIds); @@ -62,6 +60,6 @@ public class RoleServiceImpl extends ServiceImpl implements Ro //删除角色 this.removeByIds(roleIds); //删除角色与菜单关联 - userRoleService.remove(queryWrapper); + roleMenuService.remove(queryWrapper); } } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java index 1b8667b0..bd8f6386 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java @@ -1,99 +1,119 @@ package cn.lili.modules.permission.serviceimpl; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.StringUtils; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.SearchVO; -import cn.lili.modules.base.entity.systemlog.SystemLogVO; +import cn.lili.modules.permission.entity.vo.SystemLogVO; +import cn.lili.modules.permission.repository.SystemLogRepository; import cn.lili.modules.permission.service.SystemLogService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; +import org.elasticsearch.common.unit.Fuzziness; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MultiMatchQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.SearchHit; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * 系统日志 * * @author Chopper - * @date 2020/11/17 3:45 下午 + * @since 2020/11/17 3:45 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SystemLogServiceImpl implements SystemLogService { + @Autowired + private SystemLogRepository systemLogRepository; - private final MongoTemplate mongoTemplate; + /** + * ES + */ + @Autowired + private ElasticsearchOperations restTemplate; @Override public void saveLog(SystemLogVO systemLogVO) { - mongoTemplate.save(systemLogVO); + systemLogRepository.save(systemLogVO); } @Override public void deleteLog(List id) { - mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), SystemLogVO.class); + for (String s : id) { + systemLogRepository.deleteById(s); + } } @Override public void flushAll() { - mongoTemplate.dropCollection(SystemLogVO.class); + systemLogRepository.deleteAll(); } @Override public IPage queryLog(String storeId, String operatorName, String key, SearchVO searchVo, PageVO pageVO) { - Query query = new Query(); - - if (StringUtils.isNotEmpty(storeId)) { - query.addCriteria(Criteria.where("storeId").is(storeId)); + pageVO.setNotConvert(true); + IPage iPage = new Page<>(); + NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); + if (pageVO.getPageNumber() != null && pageVO.getPageSize() != null) { + int pageNumber = pageVO.getPageNumber() - 1; + if (pageNumber < 0) { + pageNumber = 0; + } + Pageable pageable = PageRequest.of(pageNumber, pageVO.getPageSize()); + //分页 + nativeSearchQueryBuilder.withPageable(pageable); + iPage.setCurrent(pageVO.getPageNumber()); + iPage.setSize(pageVO.getPageSize()); } - if (StringUtils.isNotEmpty(operatorName)) { - query.addCriteria(Criteria.where("username").regex(Pattern.compile("^.*" + operatorName + ".*$", Pattern.CASE_INSENSITIVE))); + if (CharSequenceUtil.isNotEmpty(storeId)) { + nativeSearchQueryBuilder.withFilter(QueryBuilders.matchQuery("storeId", storeId)); } - if (StringUtils.isNotEmpty(key)) { - query.addCriteria(new Criteria().orOperator( - Criteria.where("requestUrl").regex(Pattern.compile("^.*" + key + ".*$", Pattern.CASE_INSENSITIVE)), - Criteria.where("requestParam").regex(Pattern.compile("^.*" + key + ".*$", Pattern.CASE_INSENSITIVE)), - Criteria.where("responseBody").regex(Pattern.compile("^.*" + key + ".*$", Pattern.CASE_INSENSITIVE)), - Criteria.where("name").regex(Pattern.compile("^.*" + key + ".*$", Pattern.CASE_INSENSITIVE)) - )); + if (CharSequenceUtil.isNotEmpty(operatorName)) { + nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("username", operatorName)); + } + + if (CharSequenceUtil.isNotEmpty(key)) { + MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(key, "requestUrl", "requestParam", "responseBody", "name"); + multiMatchQueryBuilder.fuzziness(Fuzziness.AUTO); + nativeSearchQueryBuilder.withFilter(multiMatchQueryBuilder); } //时间有效性判定 if (searchVo.getConvertStartDate() != null && searchVo.getConvertEndDate() != null) { - System.out.println(DateUtil.toString(searchVo.getConvertStartDate(), DateUtil.STANDARD_FORMAT)); - System.out.println(DateUtil.toString(searchVo.getConvertEndDate(), DateUtil.STANDARD_FORMAT)); - + BoolQueryBuilder filterBuilder = new BoolQueryBuilder(); //大于方法 - Criteria gt = Criteria.where("createTime").gt(searchVo.getConvertStartDate()); - //小于方法 - Criteria lt = Criteria.where("createTime").lte(searchVo.getConvertEndDate()); - query.addCriteria(new Criteria().andOperator(gt, lt)); + filterBuilder.filter( + QueryBuilders.rangeQuery("createTime") + .gte(searchVo.getConvertStartDate().getTime()) + .lte(searchVo.getConvertEndDate().getTime())); + nativeSearchQueryBuilder.withFilter(filterBuilder); } - IPage iPage = new Page<>(); + if (CharSequenceUtil.isNotEmpty(pageVO.getOrder()) && CharSequenceUtil.isNotEmpty(pageVO.getSort())) { + nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(pageVO.getSort()).order(SortOrder.valueOf(pageVO.getOrder().toUpperCase()))); + } else { + nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)); + } - iPage.setTotal(mongoTemplate.count(query, SystemLogVO.class)); - query.with(PageRequest.of(pageVO.getMongoPageNumber(), pageVO.getPageSize())); + SearchHits searchResult = restTemplate.search(nativeSearchQueryBuilder.build(), SystemLogVO.class); - query.with(Sort.by(Sort.Direction.DESC, "createTime")); + iPage.setTotal(searchResult.getTotalHits()); - List systemLogVOS = mongoTemplate.find(query, SystemLogVO.class); - iPage.setCurrent(pageVO.getPageNumber()); - iPage.setSize(pageVO.getPageSize()); - iPage.setRecords(systemLogVOS); + iPage.setRecords(searchResult.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList())); return iPage; } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java index 9b819904..e3e84d4e 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java @@ -5,8 +5,6 @@ import cn.lili.modules.permission.mapper.UserRoleMapper; import cn.lili.modules.permission.service.UserRoleService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,20 +15,16 @@ import java.util.List; * 用户权限业务层实现 * * @author Chopper - * @date 2020/11/17 3:52 下午 + * @since 2020/11/17 3:52 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { - private final UserRoleMapper userRoleMapper; - @Override public List listByUserId(String userId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); - return userRoleMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override @@ -42,12 +36,13 @@ public class UserRoleServiceImpl extends ServiceImpl i } @Override + @Transactional(rollbackFor = Exception.class) public void updateUserRole(String userId, List userRoles) { //删除 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); - userRoleMapper.delete(queryWrapper); + this.remove(queryWrapper); //保存 this.saveBatch(userRoles); diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/BasePromotions.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/BasePromotions.java new file mode 100644 index 00000000..5867af4a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/BasePromotions.java @@ -0,0 +1,78 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.mybatis.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import javax.validation.constraints.NotEmpty; +import java.util.Date; + +/** + * 促销活动基础类 + * + * @author Chopper + * @since 2020-03-19 10:44 上午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class BasePromotions extends BaseEntity { + + private static final long serialVersionUID = 7814832369110695758L; + + @ApiModelProperty(value = "商家名称,如果是平台,这个值为 platform") + private String storeName; + + @ApiModelProperty(value = "商家id,如果是平台,这个值为 0") + private String storeId; + + @NotEmpty(message = "活动名称不能为空") + @ApiModelProperty(value = "活动名称", required = true) + private String promotionName; + + @ApiModelProperty(value = "活动开始时间", required = true) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") + private Date startTime; + + @ApiModelProperty(value = "活动结束时间", required = true) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") + private Date endTime; + + /** + * @see PromotionsScopeTypeEnum + */ + @ApiModelProperty(value = "关联范围类型") + private String scopeType = PromotionsScopeTypeEnum.PORTION_GOODS.name(); + + + @ApiModelProperty(value = "范围关联的id") + private String scopeId; + + + /** + * @return 促销状态 + * @see PromotionsStatusEnum + */ + public String getPromotionStatus() { + if (endTime == null) { + return startTime != null ? PromotionsStatusEnum.START.name() : PromotionsStatusEnum.CLOSE.name(); + } + Date now = new Date(); + if (now.before(startTime)) { + return PromotionsStatusEnum.NEW.name(); + } else if (endTime.before(now)) { + return PromotionsStatusEnum.END.name(); + } else if (now.before(endTime)) { + return PromotionsStatusEnum.START.name(); + } + return PromotionsStatusEnum.CLOSE.name(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java index ae410350..0a8f172d 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java @@ -1,32 +1,34 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.modules.promotion.entity.dto.BasePromotion; +import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.entity.vos.CouponVO; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.springframework.beans.BeanUtils; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 优惠券活动实体类 * * @author Chopper - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_coupon") @TableName("li_coupon") -@ApiModel(value = "优惠券活动实体类") -public class Coupon extends BasePromotion { - +@ApiModel(value = "优惠券实体类") +@ToString(callSuper = true) +@NoArgsConstructor +public class Coupon extends BasePromotions { private static final long serialVersionUID = 8372820376262437018L; - @ApiModelProperty(value = "优惠券名称") private String couponName; @@ -35,25 +37,15 @@ public class Coupon extends BasePromotion { * * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum */ - @ApiModelProperty(value = "活动类型") + @ApiModelProperty(value = "优惠券类型") private String couponType; - /** - * @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum - */ - @ApiModelProperty(value = "关联范围类型") - private String scopeType; - @ApiModelProperty(value = "面额") private Double price; @ApiModelProperty(value = "折扣") private Double couponDiscount; - @ApiModelProperty(value = "范围关联的id") - @Column(columnDefinition = "TEXT") - private String scopeId; - /** * @see cn.lili.modules.promotion.entity.enums.CouponGetEnum */ @@ -66,7 +58,7 @@ public class Coupon extends BasePromotion { @ApiModelProperty(value = "活动描述") private String description; - @ApiModelProperty(value = "发行数量") + @ApiModelProperty(value = "发行数量,如果是0则是不限制") private Integer publishNum; @ApiModelProperty(value = "领取限制") @@ -81,4 +73,30 @@ public class Coupon extends BasePromotion { @ApiModelProperty(value = "消费门槛") private Double consumeThreshold; + /** + * @see cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum + */ + @ApiModelProperty(value = "时间范围类型") + private String rangeDayType; + + @ApiModelProperty(value = "有效期") + private Integer effectiveDays; + + public Coupon(CouponVO couponVO) { + BeanUtils.copyProperties(couponVO, this); + } + + + /** + * @return 促销状态 + * @see cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum + */ + @Override + public String getPromotionStatus() { + if (this.rangeDayType != null && this.rangeDayType.equals(CouponRangeDayEnum.DYNAMICTIME.name()) + && (this.effectiveDays != null && this.effectiveDays > 0 && this.effectiveDays <= 365)) { + return PromotionsStatusEnum.START.name(); + } + return super.getPromotionStatus(); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java new file mode 100644 index 00000000..2f5be2d7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java @@ -0,0 +1,51 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.modules.promotion.entity.enums.CouponActivitySendTypeEnum; +import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; +import cn.lili.modules.promotion.entity.enums.CouponFrequencyEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +/** + * 优惠券活动实体类 + * + * @author Bulbasaur + * @since 2020-03-19 10:44 上午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("li_coupon_activity") +@ApiModel(value = "优惠券活动实体类") +public class CouponActivity extends BasePromotions { + + private static final long serialVersionUID = 4230258450334305951L; + /** + * @see CouponActivityTypeEnum + */ + @NotNull(message = "优惠券活动类型不能为空") + @ApiModelProperty(value = "优惠券活动类型", allowableValues = "REGISTERED:新人赠券,INVITE_NEW:邀新赠券,AUTO_COUPON:自动赠券,SPECIFY:精确发券") + private String couponActivityType; + + /** + * @see CouponActivitySendTypeEnum + */ + //目前仅在自动赠券模式下该参数会生效,日后如果完善发送测略则调整这里即可 + @NotNull(message = "请选择活动范围") + @ApiModelProperty(value = "活动范围", allowableValues = "ALL:全部会员,DESIGNATED:指定会员") + private String activityScope; + /** + * @see CouponFrequencyEnum + */ + @NotNull(message = "领取周期") + @ApiModelProperty(value = "活动范围", allowableValues = " DAY:每天, WEEK:每周, MONTH:每月") + private String couponFrequencyEnum; + + @ApiModelProperty(value = "活动范围详情,只有精准发券使用") + private String activityScopeInfo; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java new file mode 100644 index 00000000..68db91e8 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java @@ -0,0 +1,32 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 优惠券活动实体类 + * + * @author Bulbasaur + * @since 2020-03-19 10:44 上午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("li_coupon_activity_item") +@ApiModel(value = "优惠券活动-优惠券关联实体类") +public class CouponActivityItem extends BaseEntity { + + @ApiModelProperty(value = "优惠券活动ID") + private String activityId; + + @ApiModelProperty(value = "优惠券ID") + private String couponId; + + @ApiModelProperty(value = "优惠券数量") + private Integer num; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/FullDiscount.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/FullDiscount.java index d78c7a7c..e6e18ed7 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/FullDiscount.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/FullDiscount.java @@ -1,13 +1,11 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.modules.promotion.entity.dto.BasePromotion; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.DecimalMax; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -16,14 +14,13 @@ import javax.validation.constraints.NotNull; * 满优惠活动实体类 * * @author Chopper - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_full_discount") @TableName("li_full_discount") @ApiModel(value = "满优惠活动") -public class FullDiscount extends BasePromotion { +public class FullDiscount extends BasePromotions { private static final long serialVersionUID = 430433787214894166L; @@ -33,34 +30,34 @@ public class FullDiscount extends BasePromotion { private Double fullMoney; @ApiModelProperty(value = "活动是否减现金") - private Boolean isFullMinus; + private Boolean fullMinusFlag; @ApiModelProperty(value = "减现金") private Double fullMinus; @ApiModelProperty(value = "是否打折") - private Boolean isFullRate; + private Boolean fullRateFlag; @ApiModelProperty(value = "打折") private Double fullRate; @ApiModelProperty(value = "是否赠送积分") - private Boolean isPoint; + private Boolean pointFlag; @ApiModelProperty(value = "赠送多少积分") private Integer point; @ApiModelProperty(value = "是否包邮") - private Boolean isFreeFreight; + private Boolean freeFreightFlag; @ApiModelProperty(value = "是否有赠品") - private Boolean isGift; + private Boolean giftFlag; @ApiModelProperty(value = "赠品id") private String giftId; @ApiModelProperty(value = "是否赠优惠券") - private Boolean isCoupon; + private Boolean couponFlag; @ApiModelProperty(value = "优惠券id") private String couponId; @@ -72,4 +69,46 @@ public class FullDiscount extends BasePromotion { @ApiModelProperty(value = "活动说明") private String description; + + public Boolean getFullMinusFlag() { + if (fullMinusFlag == null) { + return false; + } + return fullMinusFlag; + } + + public Boolean getFullRateFlag() { + if (fullRateFlag == null) { + return false; + } + return fullRateFlag; + } + + public Boolean getPointFlag() { + if (pointFlag == null) { + return false; + } + return pointFlag; + } + + public Boolean getFreeFreightFlag() { + if (freeFreightFlag == null) { + return false; + } + return freeFreightFlag; + } + + public Boolean getGiftFlag() { + if (giftFlag == null) { + return false; + } + return giftFlag; + } + + public Boolean getCouponFlag() { + if (couponFlag == null) { + return false; + } + return couponFlag; + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivity.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivity.java new file mode 100644 index 00000000..4d5db44d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivity.java @@ -0,0 +1,58 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @since 2020-7-1 10:44 上午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("li_kanjia_activity") +@ApiModel(value = "砍价活动参与对象") +public class KanjiaActivity extends BaseEntity { + + + private static final long serialVersionUID = -1583030890805926292L; + + @ApiModelProperty(value = "砍价商品id") + private String kanjiaActivityGoodsId; + + @ApiModelProperty(value = "发起砍价活动会员id") + private String memberId; + + @ApiModelProperty(value = "发起砍价活动会员名称") + private String memberName; + + @ApiModelProperty(value = "剩余购买金额") + private Double surplusPrice; + + @ApiModelProperty(value = "砍价最低购买金额") + private Double purchasePrice; + + @ApiModelProperty(value = "砍价商品skuId") + private String skuId; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "缩略图") + private String thumbnail; + + /** + * @see KanJiaStatusEnum + */ + @ApiModelProperty(value = "砍价活动状态") + private String status; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityGoods.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityGoods.java new file mode 100644 index 00000000..8f6626ed --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityGoods.java @@ -0,0 +1,61 @@ +package cn.lili.modules.promotion.entity.dos; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; + +/** + * 砍价活动商品实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("li_kanjia_activity_goods") +@ApiModel(value = "砍价活动商品对象") +public class KanjiaActivityGoods extends BasePromotions { + + private static final long serialVersionUID = 6694714877345423488L; + + @ApiModelProperty(value = "结算价格") + @NotEmpty(message = "结算价格不能为空") + private Double settlementPrice; + + @ApiModelProperty(value = "商品原价") + private Double originalPrice; + + @ApiModelProperty(value = "最低购买金额") + @NotEmpty(message = "最低购买金额不能为空") + private Double purchasePrice; + + @ApiModelProperty(value = "货品id") + @NotEmpty(message = "货品id不能为空") + private String goodsId; + + @ApiModelProperty(value = "货品SkuId") + @NotEmpty(message = "货品SkuId不能为空") + private String skuId; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "缩略图") + private String thumbnail; + + @ApiModelProperty(value = "活动库存") + @NotEmpty(message = "活动库存不能为空") + private Integer stock; + + @ApiModelProperty(value = "每人最低砍价金额") + @NotEmpty(message = "每人最低砍价金额不能为空") + private Double lowestPrice; + + @ApiModelProperty(value = "每人最高砍价金额") + @NotEmpty(message = "每人最高砍价金额不能为空") + private Double highestPrice; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityLog.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityLog.java new file mode 100644 index 00000000..0f2ac5db --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/KanjiaActivityLog.java @@ -0,0 +1,43 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 砍价活动商品实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@TableName("li_kanjia_activity_log") +@ApiModel(value = "砍价活动日志对象") +public class KanjiaActivityLog extends BaseEntity { + + + private static final long serialVersionUID = 3977352717995562783L; + + @ApiModelProperty(value = "砍价活动参与记录id") + private String kanjiaActivityId; + + @ApiModelProperty(value = "砍价会员id") + private String kanjiaMemberId; + + @ApiModelProperty(value = "砍价会员名称") + private String kanjiaMemberName; + + @ApiModelProperty(value = "砍价会员头像") + private String kanjiaMemberFace; + + @ApiModelProperty(value = "砍价金额") + private Double kanjiaPrice; + + @ApiModelProperty(value = "剩余购买金额") + private Double surplusPrice; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java index 62028958..11c30b9a 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java @@ -1,27 +1,32 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.base.BaseEntity; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** * 会员优惠券实体类 * * @author Chopper - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_member_coupon") @TableName("li_member_coupon") @ApiModel(value = "会员优惠券") public class MemberCoupon extends BaseEntity { @@ -31,7 +36,7 @@ public class MemberCoupon extends BaseEntity { @ApiModelProperty(value = "从哪个模版领取的优惠券") private String couponId; - @ApiModelProperty(value = "商家id,如果是平台发送,这个值为 platform") + @ApiModelProperty(value = "商家id,如果是平台发送,这个值为 0") private String storeId; @ApiModelProperty(value = "商家名称,如果是平台,这个值为 platform") @@ -53,7 +58,7 @@ public class MemberCoupon extends BaseEntity { private String memberId; /** - * @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum + * @see PromotionsScopeTypeEnum */ @ApiModelProperty(value = "关联范围类型") private String scopeType; @@ -68,15 +73,16 @@ public class MemberCoupon extends BaseEntity { @ApiModelProperty(value = "范围关联的id") - @Column(columnDefinition = "TEXT") private String scopeId; @ApiModelProperty(value = "使用起始时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date startTime; @ApiModelProperty(value = "使用截止时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date endTime; /** * @see cn.lili.modules.promotion.entity.enums.CouponGetEnum @@ -85,13 +91,14 @@ public class MemberCoupon extends BaseEntity { private String getType; @ApiModelProperty(value = "是否是平台优惠券") - private Boolean isPlatform; + private Boolean platformFlag; @ApiModelProperty(value = "店铺承担比例") private Double storeCommission; @ApiModelProperty(value = "核销时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date consumptionTime; /** @@ -113,15 +120,14 @@ public class MemberCoupon extends BaseEntity { setScopeType(coupon.getScopeType()); setScopeId(coupon.getScopeId()); setCouponType(coupon.getCouponType()); - setStartTime(coupon.getStartTime()); - setEndTime(coupon.getEndTime()); + setStartTime(coupon.getStartTime() == null ? new Date() : coupon.getStartTime()); + setGetType(coupon.getGetType()); setStoreCommission(coupon.getStoreCommission()); + if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { + setEndTime(coupon.getEndTime()); + } else { + setEndTime(DateUtil.endOfDay(DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, (coupon.getEffectiveDays() - 1)))); + } } - - public boolean canUse() { - return this.getMemberCouponStatus().equals(MemberCouponStatusEnum.NEW.name()); - } - - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCouponSign.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCouponSign.java new file mode 100644 index 00000000..0c7979f4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCouponSign.java @@ -0,0 +1,50 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 会员优惠券实体类 + * + * @author Chopper + * @since 2020-03-19 10:44 上午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("li_member_coupon_sign") +@ApiModel(value = "会员优惠券领取标记") +public class MemberCouponSign extends BaseIdEntity { + + @ApiModelProperty(value = "优惠券活动ID") + private String couponActivityId; + + @ApiModelProperty(value = "会员ID") + private String memberId; + + @ApiModelProperty(value = "失效时间,到达失效时间后自动删除,用户可以再次领取") + private Date invalidTime; + + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间", hidden = true) + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") + private Date createTime; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Pintuan.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Pintuan.java index 03661bf5..a7b75ff5 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Pintuan.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Pintuan.java @@ -1,41 +1,42 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.modules.promotion.entity.dto.BasePromotion; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; /** * 拼团活动实体类 * * @author Chopper - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 */ @Data -@Entity -@Table(name = "li_pintuan") @TableName("li_pintuan") @ApiModel(value = "拼团") -public class Pintuan extends BasePromotion { +public class Pintuan extends BasePromotions { private static final long serialVersionUID = -8465716592648602604L; - @Min(message = "成团人数必须为数字", value = 0) + @Min(message = "成团人数需大于等于2", value = 2) + @Max(message = "成团人数最多10人", value = 10) + @NotNull(message = "成团人数必填") @ApiModelProperty(value = "成团人数") private Integer requiredNum; @Min(message = "限购数量必须为数字", value = 0) + @NotNull(message = "限购数量必填") @ApiModelProperty(value = "限购数量") private Integer limitNum; @ApiModelProperty(value = "虚拟成团", required = true) + @NotNull(message = "虚拟成团必填") private Boolean fictitious; @ApiModelProperty(value = "拼团规则") diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoods.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoods.java index 4fec53f1..8239ac39 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoods.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoods.java @@ -1,36 +1,42 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.modules.promotion.entity.dto.BasePromotion; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 积分商品实体类 * * @author paulG - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 **/ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_points_goods") @TableName("li_points_goods") @ApiModel(value = "积分商品") @AllArgsConstructor @NoArgsConstructor -public class PointsGoods extends BasePromotion { +public class PointsGoods extends BasePromotions { private static final long serialVersionUID = 1313207311581661571L; @ApiModelProperty(value = "商品编号") + private String goodsId; + + @ApiModelProperty(value = "商品sku编号") private String skuId; + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品原价") + private Double originalPrice; + @ApiModelProperty(value = "结算价格") private Double settlementPrice; @@ -40,8 +46,11 @@ public class PointsGoods extends BasePromotion { @ApiModelProperty(value = "分类名称") private String pointsGoodsCategoryName; + @ApiModelProperty(value = "缩略图") + private String thumbnail; + @ApiModelProperty(value = "活动库存数量") - private Long activeStock; + private Integer activeStock; @ApiModelProperty(value = "兑换积分") private Long points; diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoodsCategory.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoodsCategory.java index d3693cb5..1457b3f2 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoodsCategory.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PointsGoodsCategory.java @@ -1,16 +1,13 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import java.math.BigDecimal; @@ -18,11 +15,9 @@ import java.math.BigDecimal; * 积分商品分类 * * @author paulG - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 **/ @Data -@Entity -@Table(name = "li_points_goods_category") @TableName("li_points_goods_category") @ApiModel(value = "积分商品分类") @AllArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PromotionGoods.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PromotionGoods.java index efb517d9..8482ee60 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PromotionGoods.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/PromotionGoods.java @@ -1,29 +1,32 @@ package cn.lili.modules.promotion.entity.dos; import cn.hutool.core.bean.BeanUtil; -import cn.lili.base.BaseEntity; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.modules.goods.entity.dos.GoodsSku; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** * 促销活动商品实体类 * * @author Chopper - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_promotion_goods") @TableName("li_promotion_goods") @ApiModel(value = "促销商品") @NoArgsConstructor @@ -37,10 +40,13 @@ public class PromotionGoods extends BaseEntity { @ApiModelProperty(value = "商家名称") private String storeName; - @ApiModelProperty(value = "货品id") + @ApiModelProperty(value = "商品id") + private String goodsId; + + @ApiModelProperty(value = "商品SkuId") private String skuId; - @ApiModelProperty(value = "货品名称") + @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "缩略图") @@ -48,52 +54,94 @@ public class PromotionGoods extends BaseEntity { @ApiModelProperty(value = "活动开始时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date startTime; @ApiModelProperty(value = "活动结束时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date endTime; @ApiModelProperty(value = "活动id") private String promotionId; /** - * @see cn.lili.modules.promotion.entity.enums.PromotionTypeEnum + * @see PromotionTypeEnum */ @ApiModelProperty(value = "促销工具类型") private String promotionType; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型") + private String goodsType; + @ApiModelProperty(value = "活动标题") private String title; @ApiModelProperty(value = "卖出的商品数量") private Integer num; + @ApiModelProperty(value = "原价") + private Double originalPrice; + @ApiModelProperty(value = "促销价格") private Double price; + @ApiModelProperty(value = "兑换积分") + private Long points; + @ApiModelProperty(value = "限购数量") private Integer limitNum; @ApiModelProperty(value = "促销库存") private Integer quantity; - /** - * @see PromotionStatusEnum - */ - @ApiModelProperty(value = "状态") - private String promotionStatus; - @ApiModelProperty(value = "分类path") private String categoryPath; + /** + * @see PromotionsScopeTypeEnum + */ + @ApiModelProperty(value = "关联范围类型") + private String scopeType = PromotionsScopeTypeEnum.PORTION_GOODS.name(); + + + @ApiModelProperty(value = "范围关联的id") + private String scopeId; + public PromotionGoods(GoodsSku sku) { if (sku != null) { - String oldId = this.getId(); - BeanUtil.copyProperties(sku, this); - this.setSkuId(sku.getId()); - this.setId(oldId); + BeanUtil.copyProperties(sku, this, "id", "price"); + this.skuId = sku.getId(); + this.originalPrice = sku.getPrice(); } } + public PromotionGoods(PointsGoods pointsGoods, GoodsSku sku) { + if (pointsGoods != null) { + BeanUtil.copyProperties(sku, this, "id"); + BeanUtil.copyProperties(pointsGoods, this, "id"); + this.promotionId = pointsGoods.getId(); + this.quantity = pointsGoods.getActiveStock(); + this.originalPrice = sku.getPrice(); + this.promotionType = PromotionTypeEnum.POINTS_GOODS.name(); + this.scopeId = sku.getId(); + } + } + + + public PromotionGoods(KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO) { + if (kanjiaActivityGoodsDTO != null) { + BeanUtil.copyProperties(kanjiaActivityGoodsDTO, this, "id"); + BeanUtil.copyProperties(kanjiaActivityGoodsDTO.getGoodsSku(), this, "id"); + this.setQuantity(kanjiaActivityGoodsDTO.getStock()); + this.setPromotionId(kanjiaActivityGoodsDTO.getId()); + this.setPromotionType(PromotionTypeEnum.KANJIA.name()); + this.setTitle(PromotionTypeEnum.KANJIA.name() + "-" + kanjiaActivityGoodsDTO.getGoodsName()); + this.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name()); + this.setPromotionType(PromotionTypeEnum.KANJIA.name()); + } + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java index 55b154eb..e5d22caf 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java @@ -1,35 +1,45 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.modules.promotion.entity.dto.BasePromotion; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.lili.modules.promotion.entity.vos.SeckillVO; +import cn.lili.modules.promotion.tools.PromotionTools; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.springframework.beans.BeanUtils; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotNull; import java.util.Date; /** - * 限时抢购实体类 + * 秒杀活动实体类 * * @author Chopper - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 */ +@EqualsAndHashCode(callSuper = true) @Data -@Entity -@Table(name = "li_seckill") @TableName("li_seckill") -@ApiModel(value = "限时抢购活动") -public class Seckill extends BasePromotion { +@ApiModel(value = "秒杀活动活动") +@NoArgsConstructor +@ToString(callSuper = true) +public class Seckill extends BasePromotions { private static final long serialVersionUID = -9116425737163730836L; @NotNull(message = "请填写报名截止时间") @ApiModelProperty(value = "报名截至时间", required = true) @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date applyEndTime; @ApiModelProperty(value = "申请规则") @@ -44,4 +54,26 @@ public class Seckill extends BasePromotion { */ @ApiModelProperty(value = "商家id集合以逗号分隔") private String storeIds; + + @ApiModelProperty(value = "商品数量") + private Integer goodsNum; + + public Seckill(int day, String hours, String seckillRule) { + //默认创建*天后的秒杀活动 + DateTime dateTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), day)); + this.applyEndTime = dateTime; + this.hours = hours; + this.seckillRule = seckillRule; + this.goodsNum = 0; + //BasePromotion + this.setStoreName(PromotionTools.PLATFORM_NAME); + this.setStoreId(PromotionTools.PLATFORM_ID); + this.setPromotionName(DateUtil.formatDate(dateTime) + " 秒杀活动"); + this.setStartTime(dateTime); + this.setEndTime(DateUtil.endOfDay(dateTime)); + } + + public Seckill(SeckillVO seckillVO) { + BeanUtils.copyProperties(seckillVO, this); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java index e21b3505..7d011d32 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java @@ -1,28 +1,25 @@ package cn.lili.modules.promotion.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; /** - * 限时抢购申请实体类 + * 秒杀活动申请实体类 * * @author Chopper - * @date 2020-03-19 10:44 上午 + * @since 2020-03-19 10:44 上午 */ @Data -@Entity -@Table(name = "li_seckill_apply") @TableName("li_seckill_apply") -@ApiModel(value = "限时抢购申请") +@ApiModel(value = "秒杀活动申请") public class SeckillApply extends BaseEntity { private static final long serialVersionUID = 5440164641970820989L; @@ -62,7 +59,7 @@ public class SeckillApply extends BaseEntity { private Integer quantity; /** - * @see cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum + * @see PromotionsApplyStatusEnum */ @ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")") private String promotionApplyStatus; diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/BasePromotion.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/BasePromotion.java deleted file mode 100644 index 42351d0e..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/BasePromotion.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.lili.modules.promotion.entity.dto; - -import cn.lili.base.BaseEntity; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.persistence.MappedSuperclass; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Date; - -/** - * 促销活动基础类 - * - * @author Chopper - * @date 2020-03-19 10:44 上午 - */ -@Data -@MappedSuperclass -public class BasePromotion extends BaseEntity { - - private static final long serialVersionUID = 7814832369110695758L; - - @ApiModelProperty(value = "商家名称,如果是平台,这个值为 platform") - private String storeName; - - @ApiModelProperty(value = "商家id,如果是平台,这个值为 platform") - private String storeId; - - @NotEmpty(message = "活动名称不能为空") - @ApiModelProperty(value = "活动名称", required = true) - private String promotionName; - - @Min(message = "活动开始时间不能为空", value = 0) - @ApiModelProperty(value = "活动开始时间", required = true) - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - private Date startTime; - - @Min(message = "活动结束时间不能为空", value = 0) - @ApiModelProperty(value = "活动结束时间", required = true) - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - private Date endTime; - - /** - * @see PromotionStatusEnum - */ - @ApiModelProperty(value = "活动状态") - @NotNull(message = "活动状态不能为空") - private String promotionStatus; -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java new file mode 100644 index 00000000..4175c469 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java @@ -0,0 +1,26 @@ +package cn.lili.modules.promotion.entity.dto; + +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 优惠券活动DTO + * + * @author Bulbasaur + * @since 2021/5/21 7:16 下午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class CouponActivityDTO extends CouponActivity { + + @ApiModelProperty(value = "优惠券列表") + private List couponActivityItems; + + @ApiModelProperty(value = "会员列表") + private List memberDTOS; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityTrigger.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityTrigger.java new file mode 100644 index 00000000..b5453457 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityTrigger.java @@ -0,0 +1,32 @@ +package cn.lili.modules.promotion.entity.dto; + +import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * 优惠券活动触发 + * + * @author paulG + * @since 2020/10/9 + **/ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CouponActivityTrigger { + + + @ApiModelProperty(value = "用户ID") + private String userId; + + @ApiModelProperty(value = "用户昵称") + private String nickName; + + @ApiModelProperty(value = "优惠券活动类型") + private CouponActivityTypeEnum couponActivityTypeEnum; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/GoodsSkuPromotionPriceDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/GoodsSkuPromotionPriceDTO.java deleted file mode 100644 index a299ec8c..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/GoodsSkuPromotionPriceDTO.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.lili.modules.promotion.entity.dto; - -import cn.lili.common.utils.CurrencyUtil; -import cn.lili.modules.goods.entity.dos.GoodsSku; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 促销活动商品价格数据传输对象 - * - * @author paulG - * @date 2020/8/20 - **/ -@Data -@NoArgsConstructor -public class GoodsSkuPromotionPriceDTO implements Serializable { - - private static final long serialVersionUID = 3510264801983456306L; - - @ApiModelProperty(value = "商品SkuId") - private String skuId; - - @ApiModelProperty(value = "店铺Id") - private String storeId; - - @ApiModelProperty(value = "分类path") - private String categoryPath; - - @ApiModelProperty(value = "店铺分类id") - private String storeCategoryPath; - - @ApiModelProperty(value = "数量") - private Integer number; - - @ApiModelProperty(value = "重量") - private Double weight; - - @ApiModelProperty(value = "总重量") - private Double totalWeight; - - @ApiModelProperty(value = "单个商品原价") - private Double originalPrice; - - @ApiModelProperty(value = "商品原价总价 = 商品原价 * 数量") - private Double totalOriginalPrice; - - @ApiModelProperty(value = "单个商品积分购买数量") - private Double points; - - @ApiModelProperty(value = "商品购买总数量 = 单个商品积分购买数量 * 数量") - private Double totalPoints; - - @ApiModelProperty(value = "单个优惠的所占总优惠金额比例") - private Double discountPriceRate; - - @ApiModelProperty(value = "单个优惠的金额") - private Double discountPrice; - - @ApiModelProperty(value = "优惠的总金额 = 单个优惠的金额 * 数量") - private Double totalDiscountPrice; - - @ApiModelProperty(value = "单个商品最终成交金额") - private Double finalePrice; - - @ApiModelProperty(value = "商品最终成交的总金额 = 单个商品最终成交金额 * 数量") - private Double totalFinalePrice; - - @ApiModelProperty(value = "分配到每个商品的优惠券金额") - private Double couponPrice; - - @ApiModelProperty(value = "促销活动ID") - private String promotionId; - - /** - * @see cn.lili.modules.promotion.entity.enums.PromotionTypeEnum - */ - @ApiModelProperty(value = "促销活动类型") - private String promotionType; - - /** - * 店铺商品促销信息集合 - */ - @ApiModelProperty(value = "参与的促销活动") - private List joinPromotion; - - public GoodsSkuPromotionPriceDTO(GoodsSku sku, Integer buyNum) { - this.setOriginalPrice(sku.getPrice()); - this.setSkuId(sku.getId()); - this.setNumber(buyNum); - this.setWeight(sku.getWeight()); - this.setTotalWeight(sku.getWeight() != null ? CurrencyUtil.mul(sku.getWeight(), buyNum) : 0); - this.setCategoryPath(sku.getCategoryPath()); - this.setStoreCategoryPath(sku.getStoreCategoryPath()); - this.setStoreId(sku.getStoreId()); - this.setDiscountPrice(0d); - this.setOriginalPrice(sku.getPrice()); - this.setCouponPrice(0D); - this.setPoints(0d); - this.setTotalPoints(0d); - this.setFinalePrice(sku.getPrice()); - this.setJoinPromotion(new ArrayList<>()); - } -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityDTO.java new file mode 100644 index 00000000..59e43b84 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityDTO.java @@ -0,0 +1,23 @@ +package cn.lili.modules.promotion.entity.dto; + + +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动参与记录对象") +public class KanjiaActivityDTO extends KanjiaActivityLog { + + @ApiModelProperty(value = "砍价商品Id") + private String kanjiaActivityGoodsId; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsDTO.java new file mode 100644 index 00000000..b8e5cc99 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsDTO.java @@ -0,0 +1,28 @@ +package cn.lili.modules.promotion.entity.dto; + + +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 砍价活动商品DTO + * + * @author qiuqiu + * @since 2020/8/21 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class KanjiaActivityGoodsDTO extends KanjiaActivityGoods implements Serializable { + + + private static final long serialVersionUID = 1969340823809319805L; + + @ApiModelProperty(value = "商品规格详细信息") + private GoodsSku goodsSku; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsOperationDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsOperationDTO.java new file mode 100644 index 00000000..cfb987f3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/KanjiaActivityGoodsOperationDTO.java @@ -0,0 +1,38 @@ +package cn.lili.modules.promotion.entity.dto; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Min; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 砍价活动商品操作DTO + * + * @author qiuqiu + * @date 2020/8/21 + **/ +@Data +public class KanjiaActivityGoodsOperationDTO implements Serializable { + + + private static final long serialVersionUID = -1378599087650538592L; + + @Min(message = "活动开始时间不能为空", value = 0) + @ApiModelProperty(value = "活动开始时间", required = true) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Min(message = "活动结束时间不能为空", value = 0) + @ApiModelProperty(value = "活动结束时间", required = true) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @ApiModelProperty(value = "砍价活动商品列表") + List promotionGoodsList; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/MemberDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/MemberDTO.java new file mode 100644 index 00000000..c7d40695 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/MemberDTO.java @@ -0,0 +1,22 @@ +package cn.lili.modules.promotion.entity.dto; + +import lombok.Data; + +/** + * 会员dto + * + * @author Chopper + * @version v1.0 + * 2021-06-18 11:30 + */ +@Data +public class MemberDTO { + /** + * 会员昵称 + */ + private String nickName; + /** + * id + */ + private String id; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionGoodsDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionGoodsDTO.java index de5ce85b..b962e62e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionGoodsDTO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionGoodsDTO.java @@ -4,6 +4,7 @@ import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -11,17 +12,15 @@ import lombok.NoArgsConstructor; * 促销商品数据传输对象 * * @author paulG - * @date 2020/10/9 + * @since 2020/10/9 **/ +@EqualsAndHashCode(callSuper = true) @Data @NoArgsConstructor public class PromotionGoodsDTO extends PromotionGoods { private static final long serialVersionUID = 9206970681612883421L; - @ApiModelProperty(value = "原价") - private Double originPrice; - @ApiModelProperty(value = "商品id") private String goodsId; diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceDTO.java deleted file mode 100644 index afb64321..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceDTO.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.lili.modules.promotion.entity.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * 促销价格数据传输对象 - * - * @author paulG - * @date 2020/11/17 - **/ -@Data -public class PromotionPriceDTO { - - /** - * 实际成交价格合计 - */ - @ApiModelProperty(value = "商品原价格合计") - private Double totalOriginPrice; - - /** - * 总需支付积分合计 - */ - @ApiModelProperty(value = "总需支付积分合计") - private Double totalPoints; - - /** - * 总优惠价格合计 - */ - @ApiModelProperty(value = "总优惠价格合计") - private Double totalDiscountPrice; - - /** - * 优惠券合计 - */ - @ApiModelProperty(value = "优惠券合计") - private Double totalCouponPrice; - - /** - * 最终结算金额 = totalOriginPrice - totalDiscountPrice - totalCouponPrice - */ - @ApiModelProperty(value = "最终结算金额") - private Double totalFinalePrice; - - /** - * 店铺促销计算集合 - */ - @ApiModelProperty(value = "店铺促销计算集合") - private List storePromotionPriceList; - - /** - * 参与的促销活动 - */ - @ApiModelProperty(value = "参与的促销活动") - private List joinPromotion; - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceParamDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceParamDTO.java deleted file mode 100644 index 42019a79..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/PromotionPriceParamDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.lili.modules.promotion.entity.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 促销价格参数数据传输对象 - * - * @author paulG - * @date 2020/11/17 - **/ -@Data -public class PromotionPriceParamDTO { - - @ApiModelProperty(value = "商品SkuId") - private String skuId; - - @ApiModelProperty(value = "购买数量") - private Integer num; - - @ApiModelProperty(value = "拼团id 如果是拼团购买 此值为拼团活动id,当pintuanId为空,则表示普通购买(或者拼团商品,单独购买)") - private String pintuanId; -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/StorePromotionPriceDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/StorePromotionPriceDTO.java deleted file mode 100644 index fc002ca8..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/StorePromotionPriceDTO.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.lili.modules.promotion.entity.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * 店铺促销计算数据传输对象 - * - * @author paulG - * @date 2020/11/17 - **/ -@Data -public class StorePromotionPriceDTO { - - /** - * 店铺ID - */ - @ApiModelProperty(value = "店铺ID") - private String storeId; - - /** - * 是否免运费 - */ - @ApiModelProperty(value = "是否免运费") - private Boolean isFreeFreight; - - /** - * 店铺商品数量合计 - */ - @ApiModelProperty(value = "店铺商品数量合计") - private Integer totalNum; - - /** - * 店铺商品重量合计 - */ - @ApiModelProperty(value = "店铺商品重量合计") - private Double totalWeight; - - /** - * 店铺商品原价格合计 - */ - @ApiModelProperty(value = "店铺商品原价格合计") - private Double totalOriginPrice; - - /** - * 店铺商品需支付积分合计 - */ - @ApiModelProperty(value = "店铺商品需支付积分合计") - private Double totalPoints; - - /** - * 店铺商品最终成交的总金额 - */ - @ApiModelProperty(value = "店铺商品最终成交的总金额") - private Double totalFinalePrice; - - /** - * 店铺参与促销商品价格合计 - */ - @ApiModelProperty(value = "店铺参与满优惠商品价格合计") - private Double totalJoinDiscountPrice; - - /** - * 店铺未参与促销商品价格合计 - */ - @ApiModelProperty(value = "店铺未参与满优惠商品价格合计") - private Double totalNotJoinDiscountPrice; - - /** - * 店铺商品优惠价格合计 - */ - @ApiModelProperty(value = "店铺商品优惠价格合计") - private Double totalDiscountPrice; - - /** - * 优惠券合计 - */ - @ApiModelProperty(value = "优惠券合计") - private Double totalCouponPrice; - - /** - * 店铺商品促销信息集合 - */ - @ApiModelProperty(value = "店铺商品促销信息集合") - private List goodsSkuPromotionPriceList; - - /** - * 参与的促销活动 - */ - @ApiModelProperty(value = "参与的促销活动") - private List joinPromotion; - - //=========distribution========== - - @ApiModelProperty(value = "1级单品分销返现支出") - private Double distributionCommission1; - - @ApiModelProperty(value = "2级单品分销返现支出") - private Double distributionCommission2; - - @ApiModelProperty(value = "平台收取交易佣金") - private Double platFormCommission; - - //=========end distribution========== - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/BasePromotionsSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/BasePromotionsSearchParams.java new file mode 100644 index 00000000..0131aa3e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/BasePromotionsSearchParams.java @@ -0,0 +1,81 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.tools.PromotionTools; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Arrays; +import java.util.Date; + +/** + * @author paulG + * @since 2021/11/18 + **/ +@Data +public class BasePromotionsSearchParams { + + @ApiModelProperty(value = "活动id") + private String id; + + @ApiModelProperty(value = "活动开始时间") + private Long startTime; + + @ApiModelProperty(value = "活动结束时间") + private Long endTime; + + /** + * @see PromotionsStatusEnum + */ + @ApiModelProperty(value = "活动状态 如需同时判断多个活动状态','分割") + private String promotionStatus; + + /** + * @see PromotionsScopeTypeEnum + */ + @ApiModelProperty(value = "关联范围类型") + private String scopeType; + + @ApiModelProperty(value = "店铺编号 如有多个','分割") + private String storeId; + + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = this.baseQueryWrapper(); + + if (CharSequenceUtil.isNotEmpty(promotionStatus)) { + queryWrapper.and(i -> { + for (String status : promotionStatus.split(",")) { + i.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.valueOf(status))); + } + }); + } + return queryWrapper; + } + + public QueryWrapper baseQueryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (CharSequenceUtil.isNotEmpty(id)) { + queryWrapper.eq("id", id); + } + if (startTime != null) { + queryWrapper.ge("start_time", new Date(startTime)); + } + if (endTime != null) { + queryWrapper.le("end_time", new Date(endTime)); + } + if (CharSequenceUtil.isNotEmpty(scopeType)) { + queryWrapper.eq("scope_type", scopeType); + } + if (CharSequenceUtil.isNotEmpty(storeId)) { + queryWrapper.in("store_id", Arrays.asList(storeId.split(","))); + } + queryWrapper.eq("delete_flag", false); + return queryWrapper; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/CouponSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/CouponSearchParams.java new file mode 100644 index 00000000..80227ee1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/CouponSearchParams.java @@ -0,0 +1,143 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.promotion.entity.enums.*; +import cn.lili.modules.promotion.tools.PromotionTools; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 优惠券查询通用类 + * + * @author paulG + * @since 2020/8/14 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class CouponSearchParams extends BasePromotionsSearchParams implements Serializable { + + private static final long serialVersionUID = 4566880169478260409L; + + private static final String PRICE_COLUMN = "price"; + private static final String RANGE_DAY_TYPE_COLUMN = "range_day_type"; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + /** + * POINT("打折"), PRICE("减免现金"); + * + * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum + */ + @ApiModelProperty(value = "活动类型") + private String couponType; + /** + * @see PromotionsScopeTypeEnum + */ + @ApiModelProperty(value = "关联范围类型") + private String scopeType; + @ApiModelProperty(value = "范围关联的id") + private String scopeId; + @ApiModelProperty(value = "面额,可以为范围,如10_1000") + private String price; + @ApiModelProperty(value = "发行数量,可以为范围,如10_1000") + private String publishNum; + @ApiModelProperty(value = "已被领取的数量,可以为范围,如10_1000") + private String receivedNum; + /** + * @see cn.lili.modules.promotion.entity.enums.CouponGetEnum + */ + @ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送") + private String getType; + + + @Override + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = super.baseQueryWrapper(); + if (CharSequenceUtil.isNotEmpty(couponName)) { + queryWrapper.like("coupon_name", couponName); + } + if (memberId != null) { + queryWrapper.eq("member_id", memberId); + } + if (CharSequenceUtil.isNotEmpty(couponType)) { + queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name()); + } + if (CharSequenceUtil.isNotEmpty(scopeType)) { + queryWrapper.eq("scope_type", PromotionsScopeTypeEnum.valueOf(scopeType).name()); + } + if (CharSequenceUtil.isNotEmpty(scopeId)) { + queryWrapper.eq("scope_id", scopeId); + } + if (CharSequenceUtil.isNotEmpty(getType)) { + queryWrapper.eq("get_type", CouponGetEnum.valueOf(getType).name()); + } + if (CharSequenceUtil.isNotEmpty(this.getPromotionStatus())) { + queryWrapper.and(p -> { + switch (PromotionsStatusEnum.valueOf(this.getPromotionStatus())) { + case NEW: + p.nested(i -> i.gt(PromotionTools.START_TIME_COLUMN, new Date()).gt(PromotionTools.END_TIME_COLUMN, new Date())); + break; + case START: + p.nested(i -> i.le(PromotionTools.START_TIME_COLUMN, new Date()).ge(PromotionTools.END_TIME_COLUMN, new Date())) + .or(i -> i.gt("effective_days", 0).eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.DYNAMICTIME.name())); + break; + case END: + p.nested(i -> i.lt(PromotionTools.START_TIME_COLUMN, new Date()).lt(PromotionTools.END_TIME_COLUMN, new Date())); + break; + case CLOSE: + p.nested(n -> n.nested(i -> i.isNull(PromotionTools.START_TIME_COLUMN).isNull(PromotionTools.END_TIME_COLUMN) + .eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.FIXEDTIME.name())). + or(i -> i.le("effective_days", 0).eq(RANGE_DAY_TYPE_COLUMN, CouponRangeDayEnum.DYNAMICTIME.name()))); + break; + default: + } + }); + + } + if (this.getStartTime() != null) { + queryWrapper.ge("start_time", new Date(this.getStartTime())); + } + if (this.getEndTime() != null) { + queryWrapper.le("end_time", new Date(this.getEndTime())); + } + this.betweenWrapper(queryWrapper); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } + + private void betweenWrapper(QueryWrapper queryWrapper) { + if (CharSequenceUtil.isNotEmpty(publishNum)) { + String[] s = publishNum.split("_"); + if (s.length > 1) { + queryWrapper.between("publish_num", s[0], s[1]); + } else { + queryWrapper.ge("publish_num", s[0]); + } + } + if (CharSequenceUtil.isNotEmpty(price)) { + String[] s = price.split("_"); + if (s.length > 1) { + queryWrapper.between(PRICE_COLUMN, s[0], s[1]); + } else { + queryWrapper.ge(PRICE_COLUMN, s[0]); + } + } + if (CharSequenceUtil.isNotEmpty(receivedNum)) { + String[] s = receivedNum.split("_"); + if (s.length > 1) { + queryWrapper.between("received_num", s[0], s[1]); + } else { + queryWrapper.ge("received_num", s[0]); + } + } + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/FullDiscountSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/FullDiscountSearchParams.java new file mode 100644 index 00000000..3c8d2d5d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/FullDiscountSearchParams.java @@ -0,0 +1,48 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 满优惠查询通用类 + * + * @author paulG + * @since 2020/8/21 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class FullDiscountSearchParams extends BasePromotionsSearchParams implements Serializable { + + private static final long serialVersionUID = -4052716630253333681L; + + + @ApiModelProperty(value = "活动名称") + private String promotionName; + + @ApiModelProperty(value = "是否赠优惠券") + private Boolean couponFlag; + + @ApiModelProperty(value = "优惠券id") + private String couponId; + + @Override + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = super.queryWrapper(); + if (CharSequenceUtil.isNotEmpty(promotionName)) { + queryWrapper.like("promotion_name", promotionName); + } + if (couponFlag != null) { + queryWrapper.eq("coupon_flag", couponFlag); + } + if (CharSequenceUtil.isNotEmpty(couponId)) { + queryWrapper.eq("coupon_id", couponId); + } + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanJiaActivityLogQuery.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanJiaActivityLogQuery.java new file mode 100644 index 00000000..dbdd86ea --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanJiaActivityLogQuery.java @@ -0,0 +1,37 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动参与记录查询对象") +public class KanJiaActivityLogQuery { + + + private static final long serialVersionUID = -1583030890805926292L; + + @ApiModelProperty(value = "砍价发起活动id") + private String kanJiaActivityId; + + + public QueryWrapper wrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (CharSequenceUtil.isNotEmpty(kanJiaActivityId)) { + queryWrapper.like("kanjia_activity_id", kanJiaActivityId); + } + queryWrapper.eq("delete_flag", false); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivityGoodsParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivityGoodsParams.java new file mode 100644 index 00000000..e8fbc84f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivityGoodsParams.java @@ -0,0 +1,46 @@ +package cn.lili.modules.promotion.entity.dto.search; + + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 砍价活动商品查询通用类 + * + * @author qiuqiu + * @date 2020/8/21 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class KanjiaActivityGoodsParams extends BasePromotionsSearchParams implements Serializable { + + private static final long serialVersionUID = 1344104067705714289L; + + @ApiModelProperty(value = "活动商品") + private String goodsName; + + @ApiModelProperty(value = "skuId") + private String skuId; + + @Override + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = super.queryWrapper(); + + if (CharSequenceUtil.isNotEmpty(goodsName)) { + queryWrapper.like("goods_name", goodsName); + } + if (UserContext.getCurrentUser() != null && UserContext.getCurrentUser().getRole().equals(UserEnums.MEMBER)) { + queryWrapper.gt("stock", 0); + } + queryWrapper.eq("delete_flag", false); + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivityQuery.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivityQuery.java new file mode 100644 index 00000000..c31d2ab4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivityQuery.java @@ -0,0 +1,42 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动参与记录查询对象") +public class KanjiaActivityQuery { + + + private static final long serialVersionUID = -1583030890805926292L; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "会员id", hidden = true) + private String memberId; + + public QueryWrapper wrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (CharSequenceUtil.isNotEmpty(goodsName)) { + queryWrapper.like("goods_name", goodsName); + } + if (memberId != null) { + queryWrapper.eq("member_id", memberId); + } + queryWrapper.eq("delete_flag", false); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivitySearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivitySearchParams.java new file mode 100644 index 00000000..6b7560ae --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/KanjiaActivitySearchParams.java @@ -0,0 +1,49 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 砍价活动搜索参数 + * + * @author Bulbasaur + * @date: 2021/7/13 2:41 下午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class KanjiaActivitySearchParams extends BasePromotionsSearchParams { + + @ApiModelProperty(value = "砍价活动ID") + private String id; + + @ApiModelProperty(value = "砍价商品SkuID") + private String kanjiaActivityGoodsId; + + @ApiModelProperty(value = "会员ID" ,hidden = true) + private String memberId; + + @ApiModelProperty(value = "状态") + private String status; + + @ApiModelProperty(value = "邀请活动ID,有值说明是被邀请人") + private String kanjiaActivityId; + + @ApiModelProperty(value = "规格商品ID" ,hidden = true) + private String goodsSkuId; + + + public QueryWrapper wrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper.eq(StrUtil.isNotEmpty(kanjiaActivityId), "id", kanjiaActivityId); + queryWrapper.eq(StrUtil.isNotEmpty(kanjiaActivityGoodsId), "kanjia_activity_goods_id", kanjiaActivityGoodsId); + queryWrapper.eq(StrUtil.isNotEmpty(goodsSkuId), "sku_id", goodsSkuId); + queryWrapper.eq(StrUtil.isNotEmpty(memberId), "member_id", memberId); + queryWrapper.eq(StrUtil.isNotEmpty(status), "status", status); + return queryWrapper; + } +} + diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/MemberCouponSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/MemberCouponSearchParams.java new file mode 100644 index 00000000..fc20ccee --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/MemberCouponSearchParams.java @@ -0,0 +1,116 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.promotion.entity.enums.CouponGetEnum; +import cn.lili.modules.promotion.entity.enums.CouponTypeEnum; +import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 会员优惠券查询通用类 + * + * @author paulG + * @since 2020/8/14 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class MemberCouponSearchParams extends BasePromotionsSearchParams implements Serializable { + + private static final long serialVersionUID = 4566880169478260409L; + + private static final String PRICE_COLUMN = "price"; + + @ApiModelProperty(value = "优惠券id") + private String couponId; + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "会员名称") + private String memberName; + + /** + * POINT("打折"), PRICE("减免现金"); + * + * @see CouponTypeEnum + */ + @ApiModelProperty(value = "活动类型") + private String couponType; + /** + * @see PromotionsScopeTypeEnum + */ + @ApiModelProperty(value = "关联范围类型") + private String scopeType; + @ApiModelProperty(value = "范围关联的id") + private String scopeId; + @ApiModelProperty(value = "面额,可以为范围,如10_1000") + private String price; + /** + * @see CouponGetEnum + */ + @ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送") + private String getType; + /** + * @see MemberCouponStatusEnum + */ + @ApiModelProperty(value = "会员优惠券状态") + private String memberCouponStatus; + @ApiModelProperty(value = "消费门槛") + private Double consumeThreshold; + + + @Override + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = super.queryWrapper(); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(couponId), "coupon_id", couponId); + queryWrapper.like(CharSequenceUtil.isNotEmpty(couponName), "coupon_name", couponName); + queryWrapper.like(CharSequenceUtil.isNotEmpty(memberName), "member_name", memberName); + if (CharSequenceUtil.isNotEmpty(couponType)) { + queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name()); + } + if (memberId != null) { + queryWrapper.eq("member_id", memberId); + } + if (CharSequenceUtil.isNotEmpty(scopeId)) { + queryWrapper.eq("scope_id", scopeId); + } + if (CharSequenceUtil.isNotEmpty(scopeType)) { + queryWrapper.eq("scope_type", PromotionsScopeTypeEnum.valueOf(scopeType).name()); + } + if (CharSequenceUtil.isNotEmpty(getType)) { + queryWrapper.eq("get_type", CouponGetEnum.valueOf(getType).name()); + } + if (CharSequenceUtil.isNotEmpty(memberCouponStatus)) { + queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.valueOf(memberCouponStatus).name()); + } + if (CharSequenceUtil.isNotEmpty(price)) { + String[] s = price.split("_"); + if (s.length > 1) { + queryWrapper.between(PRICE_COLUMN, s[0], s[1]); + } else { + queryWrapper.ge(PRICE_COLUMN, s[0]); + } + } + if (this.getStartTime() != null) { + queryWrapper.ge("start_time", new Date(this.getEndTime())); + } + if (this.getEndTime() != null) { + queryWrapper.le("end_time", new Date(this.getEndTime())); + } + queryWrapper.eq("delete_flag", false); + queryWrapper.orderByDesc("create_time"); + return queryWrapper; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PintuanSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PintuanSearchParams.java new file mode 100644 index 00000000..7524655d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PintuanSearchParams.java @@ -0,0 +1,41 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; + +/** + * 拼团查询通用类 + * + * @author paulG + * @since 2020/10/9 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class PintuanSearchParams extends BasePromotionsSearchParams { + + @ApiModelProperty(value = "商家名称,如果是平台,这个值为 platform") + private String storeName; + + @NotEmpty(message = "活动名称不能为空") + @ApiModelProperty(value = "活动名称", required = true) + private String promotionName; + + + @Override + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = super.queryWrapper(); + if (CharSequenceUtil.isNotEmpty(promotionName)) { + queryWrapper.like("promotion_name", promotionName); + } + if (CharSequenceUtil.isNotEmpty(storeName)) { + queryWrapper.like("store_name", storeName); + } + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PointsGoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PointsGoodsSearchParams.java new file mode 100644 index 00000000..8b6e118b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PointsGoodsSearchParams.java @@ -0,0 +1,55 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 积分商品查询通用类 + * + * @author paulG + * @since 2021/1/13 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class PointsGoodsSearchParams extends BasePromotionsSearchParams { + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品skuId") + private String skuId; + + @ApiModelProperty(value = "积分商品分类编号") + private String pointsGoodsCategoryId; + + @ApiModelProperty(value = "积分,可以为范围,如10_1000") + private String points; + + + @Override + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = super.queryWrapper(); + if (CharSequenceUtil.isNotEmpty(goodsName)) { + queryWrapper.like("goods_name", goodsName); + } + if (CharSequenceUtil.isNotEmpty(skuId)) { + queryWrapper.eq("sku_id", skuId); + } + if (CharSequenceUtil.isNotEmpty(pointsGoodsCategoryId)) { + queryWrapper.eq("points_goods_category_id", pointsGoodsCategoryId); + } + if (CharSequenceUtil.isNotEmpty(points)) { + String[] s = points.split("_"); + if (s.length > 1) { + queryWrapper.between("points", s[0], s[1]); + } else { + queryWrapper.eq("points", s[0]); + } + } + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PromotionGoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PromotionGoodsSearchParams.java new file mode 100644 index 00000000..576a488d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/PromotionGoodsSearchParams.java @@ -0,0 +1,77 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.util.Arrays; +import java.util.List; + +/** + * 促销商品查询通用类 + * + * @author paulG + * @since 2021/2/21 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PromotionGoodsSearchParams extends BasePromotionsSearchParams { + + @ApiModelProperty(value = "促销活动id") + private String promotionId; + + @ApiModelProperty(value = "促销类型") + private String promotionType; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品分类路径") + private String categoryPath; + + @ApiModelProperty(value = "商品SkuId") + private String skuId; + + @ApiModelProperty(value = "商品SkuIds") + private List skuIds; + + @ApiModelProperty(value = "促销活动id") + private List promotionIds; + + + @Override + public QueryWrapper queryWrapper() { + if (CharSequenceUtil.isEmpty(this.getScopeType())){ + this.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name()); + } + QueryWrapper queryWrapper = super.queryWrapper(); + if (CharSequenceUtil.isNotEmpty(promotionId)) { + queryWrapper.eq("promotion_id", promotionId); + } + if (CharSequenceUtil.isNotEmpty(goodsName)) { + queryWrapper.like("goods_name", goodsName); + } + if (CharSequenceUtil.isNotEmpty(promotionType)) { + queryWrapper.eq("promotion_type", promotionType); + } + if (CharSequenceUtil.isNotEmpty(categoryPath)) { + queryWrapper.like("category_path", categoryPath); + } + if (CharSequenceUtil.isNotEmpty(skuId)) { + queryWrapper.in("sku_id", Arrays.asList(skuId.split(","))); + } + if (skuIds != null && !skuIds.isEmpty()) { + queryWrapper.in("sku_id", skuIds); + } + if (promotionIds != null && promotionIds.isEmpty()) { + queryWrapper.in("promotion_id", promotionIds); + } + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/SeckillSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/SeckillSearchParams.java new file mode 100644 index 00000000..74f59153 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/search/SeckillSearchParams.java @@ -0,0 +1,76 @@ +package cn.lili.modules.promotion.entity.dto.search; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Arrays; + +/** + * 秒杀活动查询通用类 + * + * @author paulG + * @since 2020/8/21 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +public class SeckillSearchParams extends BasePromotionsSearchParams implements Serializable { + + private static final long serialVersionUID = -4052716630253333681L; + + @ApiModelProperty(value = "秒杀活动活动编号") + private String seckillId; + + @ApiModelProperty(value = "活动名称") + private String promotionName; + + @ApiModelProperty(value = "时刻") + private Integer timeLine; + + @ApiModelProperty(value = "商家id") + private String[] storeIds; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商家编号") + private String skuId; + + /** + * @see PromotionsApplyStatusEnum + */ + @ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")") + private String promotionApplyStatus; + + @Override + public QueryWrapper queryWrapper() { + QueryWrapper queryWrapper = super.queryWrapper(); + if (CharSequenceUtil.isNotEmpty(goodsName)) { + queryWrapper.like("goods_name", goodsName); + } + if (CharSequenceUtil.isNotEmpty(promotionName)) { + queryWrapper.like("promotion_name", promotionName); + } + if (CharSequenceUtil.isNotEmpty(seckillId)) { + queryWrapper.eq("seckill_id", seckillId); + } + if (storeIds != null) { + queryWrapper.in("store_id", Arrays.asList(storeIds)); + } + if (timeLine != null) { + queryWrapper.eq("time_line", timeLine); + } + if (CharSequenceUtil.isNotEmpty(promotionApplyStatus)) { + queryWrapper.eq("promotion_apply_status", PromotionsApplyStatusEnum.valueOf(promotionApplyStatus).name()); + } + if (CharSequenceUtil.isNotEmpty(skuId)) { + queryWrapper.eq("sku_id", skuId); + } + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivitySendTypeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivitySendTypeEnum.java new file mode 100644 index 00000000..76b049fc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivitySendTypeEnum.java @@ -0,0 +1,29 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 优惠券活动发送类型枚举 + * + * @author Bulbasaur + * @since 2021/5/20 5:47 下午 + */ +public enum CouponActivitySendTypeEnum { + + /** + * "全部会员" + */ + ALL("全部会员"), + /** + * "指定会员" + */ + DESIGNATED("指定会员"); + + private final String description; + + CouponActivitySendTypeEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivityTypeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivityTypeEnum.java new file mode 100644 index 00000000..1f215b05 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivityTypeEnum.java @@ -0,0 +1,37 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 优惠券活动类型枚举 + * + * @author Bulbasaur + * @since 2021/5/20 5:47 下午 + */ +public enum CouponActivityTypeEnum { + + /** + * "新人赠券" + */ + REGISTERED("新人赠券"), + /** + * "邀新赠券" + */ + INVITE_NEW("邀新赠券"), + /** + * "自动赠券" + */ + AUTO_COUPON("自动赠券"), + /** + * "定向发券" + */ + SPECIFY("精确发券"); + + private final String description; + + CouponActivityTypeEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponFrequencyEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponFrequencyEnum.java new file mode 100644 index 00000000..f5db6007 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponFrequencyEnum.java @@ -0,0 +1,35 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 优惠券活动发送类型枚举 + * + * @author Bulbasaur + * @since 2021/5/20 5:47 下午 + */ +public enum CouponFrequencyEnum { + + /** + * 领取周期 + */ + DAY("每天"), WEEK("每周"), MONTH("每月"); + + private final String description; + + CouponFrequencyEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } + + public static boolean exist(String name) { + try { + CouponFrequencyEnum.valueOf(name); + } catch (IllegalArgumentException e) { + return false; + } + return true; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponGetEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponGetEnum.java index 9b71ee7c..7396307c 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponGetEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponGetEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.promotion.entity.enums; * 优惠券获取方式枚举 * * @author Chopper - * @date 2020-03-19 9:36 上午 + * @since 2020-03-19 9:36 上午 */ public enum CouponGetEnum { diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponRangeDayEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponRangeDayEnum.java new file mode 100644 index 00000000..7de99f7c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponRangeDayEnum.java @@ -0,0 +1,36 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 优惠券时间范围枚举 + * + * @author Bulbasaur + * @since 2021/5/24 8:31 上午 + */ +public enum CouponRangeDayEnum { + + /** + * 枚举 + */ + FIXEDTIME("固定时间"), DYNAMICTIME("动态时间"); + + private final String description; + + CouponRangeDayEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } + + public static boolean exist(String name) { + try { + CouponRangeDayEnum.valueOf(name); + } catch (IllegalArgumentException e) { + return false; + } + return true; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponTypeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponTypeEnum.java index b7005f3a..2ff19206 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponTypeEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.promotion.entity.enums; * 优惠券折扣类型 * * @author Chopper - * @date 2020-03-19 9:36 上午 + * @since 2020-03-19 9:36 上午 */ public enum CouponTypeEnum { diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/KanJiaStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/KanJiaStatusEnum.java new file mode 100644 index 00000000..54f7743e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/KanJiaStatusEnum.java @@ -0,0 +1,38 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 砍价活动状态状态枚举 + * + * @author Chopper + * @date 2020-03-19 3:53 下午 + */ +public enum KanJiaStatusEnum { + + /** + * 已开始 + */ + START("开始"), + /** + * 砍价失败 + */ + FAIL("失败"), + /** + * 砍价成功 + */ + SUCCESS("成功"), + /** + * 砍价活动结束 + * 已购买、超时未购买都是这个状态 + */ + END("已结束"); + + private final String description; + + KanJiaStatusEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/MemberCouponStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/MemberCouponStatusEnum.java index 8b98856c..e2513c93 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/MemberCouponStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/MemberCouponStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.promotion.entity.enums; * 会员优惠券状态枚举 * * @author Chopper - * @date 2020-03-19 9:36 上午 + * @since 2020-03-19 9:36 上午 */ public enum MemberCouponStatusEnum { /** diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionStatusEnum.java deleted file mode 100644 index 15affff3..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionStatusEnum.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.lili.modules.promotion.entity.enums; - -/** - * 促销状态枚举 - * - * @author Chopper - * @date 2020-03-19 3:53 下午 - */ -public enum PromotionStatusEnum { - - NEW("新建"), START("开始/上架"), END("结束/下架"), CLOSE("紧急关闭/作废"); - - private final String description; - - PromotionStatusEnum(String str) { - this.description = str; - } - - public String description() { - return description; - } -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionApplyStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsApplyStatusEnum.java similarity index 74% rename from framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionApplyStatusEnum.java rename to framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsApplyStatusEnum.java index cab25f91..f746b95e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionApplyStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsApplyStatusEnum.java @@ -4,9 +4,9 @@ package cn.lili.modules.promotion.entity.enums; * 促销活动申请状态枚举 * * @author Chopper - * @date 2020-03-19 9:36 上午 + * @since 2020-03-19 9:36 上午 */ -public enum PromotionApplyStatusEnum { +public enum PromotionsApplyStatusEnum { /** * 枚举 @@ -15,7 +15,7 @@ public enum PromotionApplyStatusEnum { private final String description; - PromotionApplyStatusEnum(String str) { + PromotionsApplyStatusEnum(String str) { this.description = str; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponScopeTypeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsScopeTypeEnum.java similarity index 73% rename from framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponScopeTypeEnum.java rename to framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsScopeTypeEnum.java index d099ef29..d9300acf 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponScopeTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsScopeTypeEnum.java @@ -1,12 +1,12 @@ package cn.lili.modules.promotion.entity.enums; /** - * 优惠券适用范围类型枚举 + * 促销适用范围类型枚举 * * @author Chopper - * @date 2020-03-19 9:36 上午 + * @since 2020-03-19 9:36 上午 */ -public enum CouponScopeTypeEnum { +public enum PromotionsScopeTypeEnum { /** * 枚举 @@ -18,7 +18,7 @@ public enum CouponScopeTypeEnum { private final String description; - CouponScopeTypeEnum(String str) { + PromotionsScopeTypeEnum(String str) { this.description = str; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsStatusEnum.java new file mode 100644 index 00000000..753f39a5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionsStatusEnum.java @@ -0,0 +1,37 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 促销状态枚举 + * + * @author Chopper + * @since 2020-03-19 3:53 下午 + */ +public enum PromotionsStatusEnum { + + /** + * 新建 + */ + NEW("新建"), + /** + * 开始/上架 + */ + START("开始/上架"), + /** + * 结束/下架 + */ + END("结束/下架"), + /** + * 紧急关闭/作废 + */ + CLOSE("紧急关闭/作废"); + + private final String description; + + PromotionsStatusEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java index d243df5a..7621fdb2 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java @@ -1,15 +1,15 @@ package cn.lili.modules.promotion.entity.enums; /** - * 限时抢购状态枚举 + * 秒杀活动状态枚举 * * @author paulG - * @date 2020/8/26 + * @since 2020/8/26 **/ public enum SeckillApplyStatusEnum { /** - * 当前店铺对当前限时抢购的申请状态 + * 当前店铺对当前秒杀活动的申请状态 */ APPLIED("已经申请过"), NOT_APPLY("未报名"), EXPIRE("过期的"); diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityItemVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityItemVO.java new file mode 100644 index 00000000..2bce8016 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityItemVO.java @@ -0,0 +1,34 @@ +package cn.lili.modules.promotion.entity.vos; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 优惠券活动的优惠券VO + * + * @author Bulbasaur + * @since 2021/6/18 11:00 上午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class CouponActivityItemVO extends CouponActivityItem { + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + + @ApiModelProperty(value = "面额") + private Double price; + + /** + * POINT("打折"), PRICE("减免现金"); + * + * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum + */ + @ApiModelProperty(value = "优惠券类型") + private String couponType; + + @ApiModelProperty(value = "折扣") + private Double couponDiscount; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java new file mode 100644 index 00000000..737a8364 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java @@ -0,0 +1,30 @@ +package cn.lili.modules.promotion.entity.vos; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 优惠券活动VO + * + * @author Bulbasaur + * @since 2021/5/21 7:01 下午 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class CouponActivityVO extends CouponActivity { + + @ApiModelProperty(value = "优惠券活动下的优惠券列表") + private List couponActivityItems; + + public CouponActivityVO(CouponActivity couponActivity, List couponActivityItemVOS) { + BeanUtil.copyProperties(couponActivity, this); + this.couponActivityItems = couponActivityItemVOS; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponSearchParams.java deleted file mode 100644 index 56d44921..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponSearchParams.java +++ /dev/null @@ -1,214 +0,0 @@ -package cn.lili.modules.promotion.entity.vos; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.modules.promotion.entity.enums.*; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Date; -import java.util.regex.Pattern; - -/** - * 优惠券查询通用类 - * - * @author paulG - * @date 2020/8/14 - **/ -@Data -public class CouponSearchParams implements Serializable { - - private static final long serialVersionUID = 4566880169478260409L; - private static final String PRICE_COLUMN = "price"; - - @ApiModelProperty(value = "店铺编号") - private String storeId; - - @ApiModelProperty(value = "会员id") - private String memberId; - - @ApiModelProperty(value = "优惠券名称") - private String couponName; - /** - * POINT("打折"), PRICE("减免现金"); - * - * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum - */ - @ApiModelProperty(value = "活动类型") - private String couponType; - /** - * @see cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum - */ - @ApiModelProperty(value = "关联范围类型") - private String scopeType; - @ApiModelProperty(value = "范围关联的id") - private String scopeId; - @ApiModelProperty(value = "面额,可以为范围,如10_1000") - private String price; - @ApiModelProperty(value = "发行数量,可以为范围,如10_1000") - private String publishNum; - @ApiModelProperty(value = "已被领取的数量,可以为范围,如10_1000") - private String receivedNum; - /** - * @see cn.lili.modules.promotion.entity.enums.CouponGetEnum - */ - @ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送") - private String getType; - - @ApiModelProperty(value = "活动开始时间") - private Long startTime; - - @ApiModelProperty(value = "活动结束时间") - private Long endTime; - /** - * @see MemberCouponStatusEnum - */ - @ApiModelProperty(value = "会员优惠券状态") - private String memberCouponStatus; - /** - * @see PromotionStatusEnum - */ - @ApiModelProperty(value = "活动状态") - private String promotionStatus; - - public QueryWrapper wrapper() { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (storeId != null) { - queryWrapper.in("store_id", Arrays.asList(storeId)); - } - if (CharSequenceUtil.isNotEmpty(couponName)) { - queryWrapper.like("coupon_name", couponName); - } - if (memberId != null) { - queryWrapper.eq("member_id", memberId); - } - if (CharSequenceUtil.isNotEmpty(couponType)) { - queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name()); - } - if (CharSequenceUtil.isNotEmpty(scopeType)) { - queryWrapper.eq("scope_type", CouponScopeTypeEnum.valueOf(scopeType).name()); - } - if (CharSequenceUtil.isNotEmpty(scopeId)) { - queryWrapper.eq("scope_id", scopeId); - } - if (CharSequenceUtil.isNotEmpty(getType)) { - queryWrapper.eq("get_type", CouponGetEnum.valueOf(getType).name()); - } - if (startTime != null) { - queryWrapper.ge("start_time", new Date(startTime)); - } - if (endTime != null) { - queryWrapper.le("end_time", new Date(endTime)); - } - if (CharSequenceUtil.isNotEmpty(memberCouponStatus)) { - queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.valueOf(memberCouponStatus).name()); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name()); - } - this.betweenWrapper(queryWrapper); - queryWrapper.eq("delete_flag", false); - return queryWrapper; - } - - private void betweenWrapper(QueryWrapper queryWrapper) { - if (CharSequenceUtil.isNotEmpty(publishNum)) { - String[] s = publishNum.split("_"); - if (s.length > 1) { - queryWrapper.ge("publish_num", s[1]); - } else { - queryWrapper.le("publish_num", publishNum); - } - } - if (CharSequenceUtil.isNotEmpty(price)) { - String[] s = price.split("_"); - if (s.length > 1) { - queryWrapper.ge(PRICE_COLUMN, s[1]); - } else { - queryWrapper.le(PRICE_COLUMN, s[0]); - } - } - if (CharSequenceUtil.isNotEmpty(receivedNum)) { - String[] s = receivedNum.split("_"); - if (s.length > 1) { - queryWrapper.ge("received_num", s[1]); - } else { - queryWrapper.le("received_num", s[0]); - } - } - } - - public Query mongoQuery() { - Query query = new Query(); - if (storeId != null) { - query.addCriteria(Criteria.where("storeId").in(Arrays.asList(storeId))); - } - if (CharSequenceUtil.isNotEmpty(couponName)) { - Pattern pattern = Pattern.compile("^.*" + couponName + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("couponName").regex(pattern)); - } - if (memberId != null) { - query.addCriteria(Criteria.where("memberId").is(memberId)); - } - if (CharSequenceUtil.isNotEmpty(couponType)) { - query.addCriteria(Criteria.where("couponType").is(CouponTypeEnum.valueOf(couponType).name())); - } - if (CharSequenceUtil.isNotEmpty(scopeType)) { - query.addCriteria(Criteria.where("scopeType").is(CouponScopeTypeEnum.valueOf(scopeType).name())); - } - if (CharSequenceUtil.isNotEmpty(scopeId)) { - query.addCriteria(Criteria.where("scopeId").is(scopeId)); - } - if (CharSequenceUtil.isNotEmpty(getType)) { - query.addCriteria(Criteria.where("getType").is(CouponGetEnum.valueOf(getType).name())); - } - if (startTime != null) { - query.addCriteria(Criteria.where("startTime").gte(new Date(startTime))); - } - if (endTime != null) { - query.addCriteria(Criteria.where("endTime").lte(new Date(endTime))); - } - if (CharSequenceUtil.isNotEmpty(memberCouponStatus)) { - query.addCriteria(Criteria.where("memberCouponStatus").is(MemberCouponStatusEnum.valueOf(memberCouponStatus).name())); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name())); - } - query.addCriteria(Criteria.where("deleteFlag").is(false)); - betweenQuery(query); - return query; - } - - private void betweenQuery(Query query) { - if (CharSequenceUtil.isNotEmpty(price)) { - String[] s = price.split("_"); - if (s.length > 1) { - query.addCriteria(Criteria.where(PRICE_COLUMN).gt(s[1])); - } else { - query.addCriteria(Criteria.where(PRICE_COLUMN).lt(s[0])); - } - } - if (CharSequenceUtil.isNotEmpty(publishNum)) { - String[] s = publishNum.split("_"); - if (s.length > 1) { - query.addCriteria(Criteria.where("publishNum").gt(s[1])); - } else { - query.addCriteria(Criteria.where("publishNum").lt(s[0])); - } - } - if (CharSequenceUtil.isNotEmpty(receivedNum)) { - String[] s = receivedNum.split("_"); - if (s.length > 1) { - query.addCriteria(Criteria.where("receivedNum").gt(s[1])); - } else { - query.addCriteria(Criteria.where("receivedNum").lt(s[0])); - } - } - } - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponVO.java index c27e2a52..0a33ba99 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponVO.java @@ -5,6 +5,10 @@ import cn.lili.modules.promotion.entity.dos.PromotionGoods; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.springframework.beans.BeanUtils; import java.util.List; @@ -12,10 +16,13 @@ import java.util.List; * 优惠券视图对象 * * @author Chopper - * @date 2020/8/14 + * @since 2020/8/14 */ +@EqualsAndHashCode(callSuper = true) @Data @ApiModel(value = "优惠券") +@ToString(callSuper = true) +@NoArgsConstructor public class CouponVO extends Coupon { private static final long serialVersionUID = 8372420376262437018L; @@ -26,5 +33,10 @@ public class CouponVO extends Coupon { @ApiModelProperty(value = "优惠券关联商品集合") private List promotionGoodsList; - + public CouponVO(Coupon coupon) { + if (coupon == null) { + return; + } + BeanUtils.copyProperties(coupon, this); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/FullDiscountSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/FullDiscountSearchParams.java deleted file mode 100644 index f4709418..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/FullDiscountSearchParams.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.lili.modules.promotion.entity.vos; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Date; -import java.util.regex.Pattern; - -/** - * 满优惠查询通用类 - * - * @author paulG - * @date 2020/8/21 - **/ -@Data -public class FullDiscountSearchParams implements Serializable { - - private static final long serialVersionUID = -4052716630253333681L; - - - @ApiModelProperty(value = "活动名称") - private String promotionName; - - @ApiModelProperty(value = "店铺编号 如有多个','分割") - private String storeId; - - @ApiModelProperty(value = "活动开始时间", required = true) - private Long startTime; - - @ApiModelProperty(value = "活动结束时间", required = true) - private Long endTime; - - /** - * @see PromotionStatusEnum - */ - @ApiModelProperty(value = "活动状态") - private String promotionStatus; - - - public QueryWrapper wrapper() { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (CharSequenceUtil.isNotEmpty(promotionName)) { - queryWrapper.like("title", promotionName); - } - if (storeId != null) { - queryWrapper.in("store_id", Arrays.asList(storeId.split(","))); - } - if (startTime != null) { - queryWrapper.ge("start_time", new Date(startTime)); - } - if (endTime != null) { - queryWrapper.le("end_time", new Date(endTime)); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name()); - } - return queryWrapper; - } - - public Query mongoQuery() { - Query query = new Query(); - if (CharSequenceUtil.isNotEmpty(promotionName)) { - Pattern pattern = Pattern.compile("^.*" + promotionName + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("promotionName").regex(pattern)); - } - if (storeId != null) { - query.addCriteria(Criteria.where("storeId").in(Arrays.asList(storeId.split(",")))); - } - if (startTime != null) { - query.addCriteria(Criteria.where("startTime").gte(new Date(startTime))); - } - if (endTime != null) { - query.addCriteria(Criteria.where("endTime").lte(new Date(endTime))); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name())); - } - query.addCriteria(Criteria.where("deleteFlag").is(false)); - return query; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/MemberCouponVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/MemberCouponVO.java new file mode 100644 index 00000000..1aace9f9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/MemberCouponVO.java @@ -0,0 +1,35 @@ +package cn.lili.modules.promotion.entity.vos; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * MemberCouponVO + * + * @author Chopper + * @version v1.0 + * 2021-08-24 14:30 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class MemberCouponVO extends MemberCoupon { + + private static final long serialVersionUID = -5533168813075444962L; + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + + @ApiModelProperty(value = "无法使用原因") + private String reason; + + public MemberCouponVO(MemberCoupon memberCoupon, String reason) { + BeanUtil.copyProperties(memberCoupon, this); + this.reason = reason; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanMemberVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanMemberVO.java index 94baea1e..99d65b1f 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanMemberVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanMemberVO.java @@ -10,7 +10,7 @@ import lombok.NoArgsConstructor; * 拼图会员视图对象 * * @author paulG - * @date 2021/3/3 + * @since 2021/3/3 **/ @Data @NoArgsConstructor @@ -33,13 +33,13 @@ public class PintuanMemberVO { private String orderSn; @ApiModelProperty(value = "已参团人数") - private Integer groupedNum; + private long groupedNum; @ApiModelProperty(value = "待参团人数") - private Integer toBeGroupedNum; + private long toBeGroupedNum; @ApiModelProperty(value = "成团人数") - private Integer groupNum; + private long groupNum; public PintuanMemberVO(Member member) { this.memberId = member.getId(); diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanSearchParams.java deleted file mode 100644 index 34a64425..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanSearchParams.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.lili.modules.promotion.entity.vos; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Date; -import java.util.regex.Pattern; - -/** - * 拼团查询通用类 - * - * @author paulG - * @date 2020/10/9 - **/ -@Data -public class PintuanSearchParams { - - @ApiModelProperty(value = "商家id") - private String storeId; - - @ApiModelProperty(value = "商家名称,如果是平台,这个值为 platform") - private String storeName; - - @NotEmpty(message = "活动名称不能为空") - @ApiModelProperty(value = "活动名称", required = true) - private String promotionName; - - /** - * @see PromotionStatusEnum - */ - @ApiModelProperty(value = "活动状态") - @NotNull(message = "活动状态不能为空") - private String promotionStatus; - - @ApiModelProperty(value = "活动开始时间") - private Long startTime; - - @ApiModelProperty(value = "活动结束时间") - private Long endTime; - - public QueryWrapper wrapper() { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (CharSequenceUtil.isNotEmpty(promotionName)) { - queryWrapper.like("promotion_name", promotionName); - } - if (!StringUtils.isEmpty(storeName)) { - queryWrapper.like("store_name", storeName); - } - if (!StringUtils.isEmpty(storeId)) { - queryWrapper.eq("store_id", storeName); - } - if (startTime != null) { - queryWrapper.ge("start_time", new Date(startTime)); - } - if (endTime != null) { - queryWrapper.le("end_time", new Date(endTime)); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name()); - } - queryWrapper.eq("delete_flag", false); - return queryWrapper; - } - - public Query mongoQuery() { - Query query = new Query(); - if (CharSequenceUtil.isNotEmpty(promotionName)) { - Pattern pattern = Pattern.compile("^.*" + promotionName + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("promotionName").regex(pattern)); - } - if (!StringUtils.isEmpty(storeName)) { - Pattern pattern = Pattern.compile("^.*" + storeName + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("storeName").regex(pattern)); - } - if (!StringUtils.isEmpty(storeId)) { - query.addCriteria(Criteria.where("storeId").is(storeId)); - } - if (startTime != null) { - query.addCriteria(Criteria.where("startTime").gte(new Date(startTime))); - } - if (endTime != null) { - query.addCriteria(Criteria.where("endTime").lte(new Date(endTime))); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name())); - } - query.addCriteria(Criteria.where("deleteFlag").is(false)); - return query; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanShareVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanShareVO.java index fa9a2ba0..20909287 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanShareVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanShareVO.java @@ -9,7 +9,7 @@ import java.util.List; * 拼图会员分享对象 * * @author paulG - * @date 2021/3/24 + * @since 2021/3/24 **/ @Data public class PintuanShareVO { diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanVO.java index 3b134d0e..b19019a6 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PintuanVO.java @@ -4,6 +4,8 @@ import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.beans.BeanUtils; import java.util.List; @@ -11,13 +13,18 @@ import java.util.List; * 拼团视图对象 * * @author paulG - * @date 2020/10/28 + * @since 2020/10/28 **/ +@EqualsAndHashCode(callSuper = true) @Data +@NoArgsConstructor public class PintuanVO extends Pintuan { private static final long serialVersionUID = 218582640653676201L; private List promotionGoodsList; + public PintuanVO(Pintuan pintuan) { + BeanUtils.copyProperties(pintuan, this); + } } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsCategoryVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsCategoryVO.java index 919dd989..568be735 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsCategoryVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsCategoryVO.java @@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode; * 积分商品分类视图对象 * * @author paulG - * @date 2021/1/15 + * @since 2021/1/15 **/ @Data public class PointsGoodsCategoryVO extends PointsGoodsCategory { diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsSearchParams.java deleted file mode 100644 index 1b37c5d3..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsSearchParams.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.lili.modules.promotion.entity.vos; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; - -import java.util.regex.Pattern; - -/** - * 积分商品查询通用类 - * - * @author paulG - * @date 2021/1/13 - **/ -@Data -public class PointsGoodsSearchParams { - - @ApiModelProperty(value = "商品名称") - private String goodsName; - - @ApiModelProperty(value = "商品skuId") - private String skuId; - - @ApiModelProperty(value = "积分商品分类编号") - private String pointsGoodsCategoryId; - - @ApiModelProperty(value = "是否为推荐商品") - private Boolean recommend; - - @ApiModelProperty(value = "积分,可以为范围,如10_1000") - private String points; - - /** - * @see PromotionStatusEnum - */ - @ApiModelProperty(value = "活动状态") - private String promotionStatus; - - - public QueryWrapper queryWrapper() { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (CharSequenceUtil.isNotEmpty(goodsName)) { - queryWrapper.eq("gs.goods_name", goodsName); - } - if (CharSequenceUtil.isNotEmpty(skuId)) { - queryWrapper.eq("pg.sku_id", skuId); - } - if (CharSequenceUtil.isNotEmpty(pointsGoodsCategoryId)) { - queryWrapper.eq("pg.points_goods_category_id", pointsGoodsCategoryId); - } - if (CharSequenceUtil.isNotEmpty(points)) { - String[] s = points.split("_"); - if (s.length > 1) { - queryWrapper.between("pg.points", s[0], s[1]); - } else { - queryWrapper.eq("pg.points", s[0]); - } - } - if (recommend != null) { - queryWrapper.eq("gs.recommend", recommend); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - queryWrapper.eq("pg.promotion_status", promotionStatus); - } - return queryWrapper; - } - - - public Query mongoQuery() { - Query query = new Query(); - if (CharSequenceUtil.isNotEmpty(goodsName)) { - Pattern pattern = Pattern.compile("^.*" + goodsName + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("goodsSku.goodsName").regex(pattern)); - } - if (CharSequenceUtil.isNotEmpty(skuId)) { - query.addCriteria(Criteria.where("skuId").is(skuId)); - } - if (CharSequenceUtil.isNotEmpty(pointsGoodsCategoryId)) { - query.addCriteria(Criteria.where("pointsGoodsCategoryId").is(pointsGoodsCategoryId)); - } - if (CharSequenceUtil.isNotEmpty(points)) { - String[] s = points.split("_"); - if (s.length > 1) { - query.addCriteria(Criteria.where("points").gte(Integer.parseInt(s[0])).lte(Integer.parseInt(s[1]))); - } else { - query.addCriteria(Criteria.where("points").gte(Integer.parseInt(s[0]))); - } - } - if (recommend != null) { - query.addCriteria(Criteria.where("goodsSku.recommend").is(recommend)); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - query.addCriteria(Criteria.where("promotionStatus").is(promotionStatus)); - } - query.addCriteria(Criteria.where("deleteFlag").is(false)); - return query; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsVO.java index e649ffa6..68c71df8 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PointsGoodsVO.java @@ -10,7 +10,7 @@ import lombok.EqualsAndHashCode; * 积分商品视图对象 * * @author paulG - * @date 2021/1/13 + * @since 2021/1/13 **/ @EqualsAndHashCode(callSuper = true) @Data diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PromotionGoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PromotionGoodsSearchParams.java deleted file mode 100644 index 12951732..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PromotionGoodsSearchParams.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.lili.modules.promotion.entity.vos; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * 促销商品查询通用类 - * - * @author paulG - * @date 2021/2/21 - **/ -@Data -public class PromotionGoodsSearchParams { - - @ApiModelProperty(value = "促销活动id") - private String promotionId; - - @ApiModelProperty(value = "促销类型") - private String promotionType; - - @ApiModelProperty(value = "促销状态") - private String promotionStatus; - - @ApiModelProperty(value = "商品名称") - private String goodsName; - - @ApiModelProperty(value = "商品分类路径") - private String categoryPath; - - @ApiModelProperty(value = "开始时间") - private Long startTime; - - @ApiModelProperty(value = "结束时间") - private Long endTime; - - - public LambdaQueryWrapper queryWrapper() { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (CharSequenceUtil.isNotEmpty(promotionId)) { - queryWrapper.eq(PromotionGoods::getPromotionId, promotionId); - } - if (CharSequenceUtil.isNotEmpty(goodsName)) { - queryWrapper.like(PromotionGoods::getGoodsName, goodsName); - } - if (CharSequenceUtil.isNotEmpty(promotionType)) { - queryWrapper.eq(PromotionGoods::getPromotionType, promotionType); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - queryWrapper.eq(PromotionGoods::getPromotionStatus, promotionStatus); - } - if (CharSequenceUtil.isNotEmpty(categoryPath)) { - queryWrapper.like(PromotionGoods::getCategoryPath, categoryPath); - } - if (startTime != null) { - queryWrapper.ge(PromotionGoods::getStartTime, new Date(startTime)); - } - if (endTime != null) { - queryWrapper.ge(PromotionGoods::getEndTime, new Date(endTime)); - } - queryWrapper.eq(PromotionGoods::getDeleteFlag, false); - return queryWrapper; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PromotionSkuVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PromotionSkuVO.java new file mode 100644 index 00000000..24b3558d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/PromotionSkuVO.java @@ -0,0 +1,35 @@ +package cn.lili.modules.promotion.entity.vos; + +import cn.lili.common.enums.PromotionTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 促销skuVO + * + * @author Chopper + * @version v1.0 + * 2021-08-28 03:24 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PromotionSkuVO implements Serializable { + + private static final long serialVersionUID = -8587010496940375179L; + + /** + * 促销类型 + * @see PromotionTypeEnum + */ + private String promotionType; + + /** + * 促销活动 + */ + private String activityId; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java index d351d4d2..f51b3c75 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java @@ -5,10 +5,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** - * 限时抢购申请视图对象 + * 秒杀活动申请视图对象 * * @author paulG - * @date 2020/8/21 + * @since 2020/8/21 **/ @Data public class SeckillApplyVO extends SeckillApply { diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java index 238c5cdb..01b1ffba 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java @@ -6,10 +6,10 @@ import lombok.Data; import java.io.Serializable; /** - * 限时抢购商品视图对象 + * 秒杀活动商品视图对象 * * @author paulG - * @date 2020/8/26 + * @since 2020/8/26 **/ @Data public class SeckillGoodsVO implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillSearchParams.java deleted file mode 100644 index 04838e41..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillSearchParams.java +++ /dev/null @@ -1,134 +0,0 @@ -package cn.lili.modules.promotion.entity.vos; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Date; -import java.util.regex.Pattern; - -/** - * 限时抢购查询通用类 - * - * @author paulG - * @date 2020/8/21 - **/ -@Data -public class SeckillSearchParams implements Serializable { - - private static final long serialVersionUID = -4052716630253333681L; - - @ApiModelProperty(value = "限时抢购活动编号") - private String seckillId; - - @ApiModelProperty(value = "活动名称") - private String promotionName; - - @ApiModelProperty(value = "时刻") - private Integer timeLine; - - @ApiModelProperty(value = "商家id") - private String[] storeIds; - - @ApiModelProperty(value = "商家编号") - private String storeId; - - @ApiModelProperty(value = "商品名称") - private String goodsName; - - @ApiModelProperty(value = "活动开始时间", required = true) - private Long startTime; - - @ApiModelProperty(value = "活动结束时间", required = true) - private Long endTime; - - /** - * @see PromotionStatusEnum - */ - @ApiModelProperty(value = "活动状态") - private String promotionStatus; - - /** - * @see cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum - */ - @ApiModelProperty(value = "APPLY(\"申请\"), PASS(\"通过\"), REFUSE(\"拒绝\")") - private String promotionApplyStatus; - - public QueryWrapper wrapper() { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (CharSequenceUtil.isNotEmpty(goodsName)) { - queryWrapper.like("goods_name", goodsName); - } - if (CharSequenceUtil.isNotEmpty(promotionName)) { - queryWrapper.like("promotion_name", promotionName); - } - if (CharSequenceUtil.isNotEmpty(seckillId)) { - queryWrapper.eq("seckill_id", seckillId); - } - if (storeIds != null) { - queryWrapper.in("store_id", Arrays.asList(storeIds)); - } - if (timeLine != null) { - queryWrapper.eq("time_line", timeLine); - } - if (startTime != null) { - queryWrapper.ge("start_time", new Date(startTime)); - } - if (endTime != null) { - queryWrapper.le("end_time", new Date(endTime)); - } - if (CharSequenceUtil.isNotEmpty(promotionApplyStatus)) { - queryWrapper.eq("promotion_apply_status", PromotionApplyStatusEnum.valueOf(promotionApplyStatus).name()); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - queryWrapper.eq("promotion_status", PromotionStatusEnum.valueOf(promotionStatus).name()); - } - return queryWrapper; - } - - public Query mongoQuery() { - Query query = new Query(); - if (CharSequenceUtil.isNotEmpty(goodsName)) { - Pattern pattern = Pattern.compile("^.*" + goodsName + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("goodsName").regex(pattern)); - } - if (CharSequenceUtil.isNotEmpty(promotionName)) { - Pattern pattern = Pattern.compile("^.*" + promotionName + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("promotionName").regex(pattern)); - } - if (CharSequenceUtil.isNotEmpty(seckillId)) { - query.addCriteria(Criteria.where("_id").is(seckillId)); - } - if (storeIds != null) { - Pattern pattern = Pattern.compile("^.*" + ArrayUtil.join(storeIds, ",") + ".*$", Pattern.CASE_INSENSITIVE); - query.addCriteria(Criteria.where("storeIds").regex(pattern)); - } - if (timeLine != null) { - query.addCriteria(Criteria.where("timeLine").is(timeLine)); - } - if (startTime != null) { - query.addCriteria(Criteria.where("startTime").gte(new Date(startTime))); - } - if (endTime != null) { - query.addCriteria(Criteria.where("endTime").lte(new Date(endTime))); - } - if (CharSequenceUtil.isNotEmpty(promotionApplyStatus)) { - query.addCriteria(Criteria.where("promotionApplyStatus").is(PromotionApplyStatusEnum.valueOf(promotionApplyStatus).name())); - } - if (CharSequenceUtil.isNotEmpty(promotionStatus)) { - query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.valueOf(promotionStatus).name())); - } - query.addCriteria(Criteria.where("deleteFlag").is(false)); - return query; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java index 1c8a7ae1..3fa276d3 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java @@ -7,10 +7,10 @@ import java.io.Serializable; import java.util.List; /** - * 限时抢购时刻视图对象 + * 秒杀活动时刻视图对象 * * @author paulG - * @date 2020/8/27 + * @since 2020/8/27 **/ @Data public class SeckillTimelineVO implements Serializable { @@ -26,7 +26,7 @@ public class SeckillTimelineVO implements Serializable { @ApiModelProperty(value = "距离本组活动开始的时间,秒为单位。如果活动的开始时间是10点,服务器时间为8点,距离开始还有多少时间") private Long distanceStartTime; - @ApiModelProperty(value = "本组活动内的限时抢购商品列表") + @ApiModelProperty(value = "本组活动内的秒杀活动商品列表") private List seckillGoodsList; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java index 6191c84d..4e986652 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java @@ -1,24 +1,23 @@ package cn.lili.modules.promotion.entity.vos; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.DateUtil; import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.ToString; -import java.util.Arrays; -import java.util.Date; import java.util.List; /** - * 限时抢购视图对象 + * 秒杀活动视图对象 * * @author paulG - * @date 2020/8/20 + * @since 2020/8/20 **/ +@EqualsAndHashCode(callSuper = true) @Data +@ToString(callSuper = true) public class SeckillVO extends Seckill { private static final long serialVersionUID = 2891461638257152270L; @@ -30,60 +29,8 @@ public class SeckillVO extends Seckill { private String seckillApplyStatus; /** - * 当前限时抢购下所有的秒杀申请信息 + * 当前秒杀活动下所有的秒杀申请信息 */ private List seckillApplyList; - /** - * 检查当前时间 - */ - public void checkTime() { - String[] timeRange = this.getHours().split(","); - int[] hoursSored = Arrays.stream(timeRange).mapToInt(Integer::parseInt).toArray(); - Arrays.sort(hoursSored); - int lastTime = 0; - for (int s : hoursSored) { - if (lastTime == s) { - throw new ServiceException("抢购区间的值不能重复"); - } else { - lastTime = s; - } - - if (s < 0 || s > 23) { - throw new ServiceException("抢购区间必须在0点到23点的整点时刻"); - } - } - - // 活动开始时间 - long startTime = this.getStartTime().getTime() / 1000; - // 报名截止时间 - long applyEndTime = this.getApplyEndTime().getTime() / 1000; - - int timeHour = hoursSored[0]; - int endTimeHour = hoursSored[hoursSored.length - 1]; - //获取活动开始当天0点的时间 - String startDate = DateUtil.toString(startTime, DateUtil.STANDARD_DATE_FORMAT) + " " + (timeHour > 10 ? timeHour : "0" + timeHour) + ":00:00"; - long startDayTime = cn.hutool.core.date.DateUtil.parse(startDate, DateUtil.STANDARD_FORMAT).getTime() / 1000; - // 结束时间 - String endDate = DateUtil.toString(startTime, DateUtil.STANDARD_DATE_FORMAT) + " " + (endTimeHour > 10 ? endTimeHour : "0" + endTimeHour) + ":59:00"; - long endDayTime = cn.hutool.core.date.DateUtil.parse(endDate, DateUtil.STANDARD_FORMAT).getTime() / 1000; - //活动时间小于当天开始时间 - if (startDayTime < DateUtil.startOfTodDay()) { - throw new ServiceException("活动时间不能小于当前时间"); - } - - //报名截止时间小于当前时间 - if (applyEndTime < DateUtil.getDateline()) { - throw new ServiceException("报名截止时间不能小于当前时间"); - } - - //报名截止时间大于活动开始当天的起始时间 - if (applyEndTime >= startDayTime) { - throw new ServiceException("报名截止时间不能大于等于活动开始时间"); - } - - this.setStartTime(new Date(startDayTime * 1000)); - this.setEndTime(new Date(endDayTime * 1000)); - } - } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsListVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsListVO.java new file mode 100644 index 00000000..5c7024e2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsListVO.java @@ -0,0 +1,30 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 砍价商品视图对象 + * + * @author paulG + * @date 2021/1/13 + **/ +@Data +public class KanjiaActivityGoodsListVO { + + @ApiModelProperty(value = "砍价活动商品id") + private String id; + + @ApiModelProperty(value = "货品名称") + private String goodsName; + + @ApiModelProperty(value = "缩略图") + private String thumbnail; + + @ApiModelProperty(value = "最低购买金额") + private Double purchasePrice; + + @ApiModelProperty(value = "活动库存") + private Integer stock; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsVO.java new file mode 100644 index 00000000..b48ae9cf --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityGoodsVO.java @@ -0,0 +1,32 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + +import cn.lili.modules.goods.entity.dos.GoodsSku; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 砍价商品视图对象 + * + * @author paulG + * @date 2021/1/13 + **/ +@Data +public class KanjiaActivityGoodsVO { + + @ApiModelProperty(value = "商品规格详细信息") + private GoodsSku goodsSku; + + @ApiModelProperty(value = "最低购买金额") + private Double purchasePrice; + + public Double getPurchasePrice() { + if (purchasePrice < 0) { + return 0D; + } + return purchasePrice; + } + + @ApiModelProperty(value = "活动库存") + private Integer stock; + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityVO.java new file mode 100644 index 00000000..696dddb6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/kanjia/KanjiaActivityVO.java @@ -0,0 +1,33 @@ +package cn.lili.modules.promotion.entity.vos.kanjia; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 砍价活动参与实体类 + * + * @author qiuqiu + * @date 2020-7-1 10:44 上午 + */ +@Data +@ApiModel(value = "砍价活动VO") +public class KanjiaActivityVO extends KanjiaActivity { + + @ApiModelProperty(value = "是否可以砍价") + private Boolean help; + + @ApiModelProperty(value = "是否已发起砍价") + private Boolean launch; + + @ApiModelProperty(value = "是否可购买") + private Boolean pass; + + public KanjiaActivityVO() { + this.setHelp(false); + this.setLaunch(false); + this.setPass(false); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java new file mode 100644 index 00000000..16f7eb79 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java @@ -0,0 +1,26 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 优惠券活动 + * + * @author Bulbasaur + * @since 2021/5/20 6:11 下午 + */ +public interface CouponActivityItemMapper extends BaseMapper { + + /** + * 获取优惠券活动关联优惠券列表VO + * + * @param activityId 优惠券活动ID + * @return 优惠券活动关联优惠券列表VO + */ + @Select("SELECT cai.*,c.coupon_name,c.price,c.coupon_type,c.coupon_discount FROM li_coupon_activity_item cai INNER JOIN li_coupon c ON cai.coupon_id = c.id WHERE cai.activity_id= #{activityId} ") + List getCouponActivityItemListVO(String activityId); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityMapper.java new file mode 100644 index 00000000..b03bf3fb --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 优惠券活动 + * @author Bulbasaur + * @since 2021/5/20 6:11 下午 + * + */ +public interface CouponActivityMapper extends BaseMapper { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponMapper.java index a3307375..553979eb 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 优惠券数据处理层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ public interface CouponMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/FullDiscountMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/FullDiscountMapper.java index d74297c3..4a42e5b8 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/FullDiscountMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/FullDiscountMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 满优惠数据处理层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ public interface FullDiscountMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityGoodsMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityGoodsMapper.java new file mode 100644 index 00000000..3baeb5f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityGoodsMapper.java @@ -0,0 +1,30 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * + * 砍价活动商品数据处理层 + * + * @author qiuqiu + * @date 2021/7/1 + */ +public interface KanJiaActivityGoodsMapper extends BaseMapper { + + /** + * 获取砍价商品VO分页 + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 砍价商品VO分页 + */ + @Select("SELECT * FROM li_kanjia_activity_goods ${ew.customSqlSegment}") + IPage kanjiaActivityGoodsVOPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityLogMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityLogMapper.java new file mode 100644 index 00000000..2a297688 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityLogMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * + * 砍价活动日志数据处理层 + * + * @author qiuqiu + * @date 2021/7/1 + */ +public interface KanJiaActivityLogMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityMapper.java new file mode 100644 index 00000000..237aa46a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/KanJiaActivityMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * + * 砍价活动参与记录 数据处理层 + * + * @author qiuqiu + * @date 2021/7/1 + */ +public interface KanJiaActivityMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponMapper.java index 27d2cc4b..fab24537 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponMapper.java @@ -1,14 +1,23 @@ package cn.lili.modules.promotion.mapper; import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.vos.MemberCouponVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; /** * 会员优惠券数据处理层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ public interface MemberCouponMapper extends BaseMapper { + @Select("SELECT mc.*,c.coupon_name FROM li_member_coupon mc LEFT JOIN li_coupon c ON mc.coupon_id = c.id ${ew.customSqlSegment}") + Page getMemberCoupons(Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponSignMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponSignMapper.java new file mode 100644 index 00000000..ecb28ab9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponSignMapper.java @@ -0,0 +1,17 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.MemberCouponSign; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 会员优惠券领取标记 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2023/1/3 18:11 + */ +public interface MemberCouponSignMapper extends BaseMapper { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/PintuanMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/PintuanMapper.java index b6345bc4..1e078347 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/PintuanMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/PintuanMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 拼团数据处理层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ public interface PintuanMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsCategoryMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsCategoryMapper.java index c706e299..f73122dc 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsCategoryMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsCategoryMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 积分商品分类数据处理层 * * @author paulG - * @date 2020/8/21 + * @since 2020/8/21 **/ public interface PointsGoodsCategoryMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsMapper.java index d3e32af8..6e81a047 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/PointsGoodsMapper.java @@ -1,24 +1,14 @@ package cn.lili.modules.promotion.mapper; import cn.lili.modules.promotion.entity.dos.PointsGoods; -import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; /** * 积分商品数据处理层 * * @author paulG - * @date 2020/8/21 + * @since 2020/8/21 **/ public interface PointsGoodsMapper extends BaseMapper { - - @Select("select * from points_goods pg left join goods_sku gs on pg.sku_id = gs.id ${ew.customSqlSegment}") - IPage getPointsGoodsVO(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - } diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/PromotionGoodsMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/PromotionGoodsMapper.java index bef0f0cb..c8b7ba8b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/PromotionGoodsMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/PromotionGoodsMapper.java @@ -1,7 +1,9 @@ package cn.lili.modules.promotion.mapper; import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -11,7 +13,7 @@ import java.util.Date; * 促销商品数据处理层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ public interface PromotionGoodsMapper extends BaseMapper { @@ -28,9 +30,38 @@ public interface PromotionGoodsMapper extends BaseMapper { @Select("select count(0) from li_promotion_goods where promotion_type = #{promotionType} and sku_id = #{skuId} and (" + "( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " + "( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" + - " || promotion_status = 'START' )") + ")") Integer selectInnerOverlapPromotionGoods(@Param("promotionType") String promotionType, @Param("skuId") String skuId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 查询参加活动促销商品是否同时参加指定类型的活动 + * + * @param promotionType 促销类型 + * @param skuId skuId + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param promotionId 促销活动ID + * @return 共参加了几种活动 + */ + @Select("select count(0) from li_promotion_goods where promotion_type = #{promotionType} and sku_id = #{skuId} and (" + + "( start_time < #{startTime} && end_time > #{startTime} ) || ( start_time < #{endTime} && end_time > #{endTime} ) || " + + "( start_time < #{startTime} && end_time > #{endTime} ) || ( start_time > #{startTime} && end_time < #{endTime} )" + + ") and promotion_id != #{promotionId}") + Integer selectInnerOverlapPromotionGoodsWithout(@Param("promotionType") String promotionType, + @Param("skuId") String skuId, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime, + @Param("promotionId") String promotionId); + + /** + * 查询参加活动促销商品价格 + * + * @param queryWrapper 查询条件 + * @return 共参加了几种活动 + */ + @Select("select price from li_promotion_goods ${ew.customSqlSegment} ") + Double selectPromotionsGoodsPrice(@Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java index 45eb1ce6..9fffad06 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java @@ -4,10 +4,10 @@ import cn.lili.modules.promotion.entity.dos.SeckillApply; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** - * 限时抢购申请数据处理层 + * 秒杀活动申请数据处理层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ public interface SeckillApplyMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java index 1ffae1f8..95cdeb0a 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java @@ -2,13 +2,21 @@ package cn.lili.modules.promotion.mapper; import cn.lili.modules.promotion.entity.dos.Seckill; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Update; /** - * 限时抢购数据处理层 + * 秒杀活动数据处理层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ public interface SeckillMapper extends BaseMapper { + /** + * 修改秒杀活动数量 + * + * @param seckillId 秒杀活动ID + */ + @Update("UPDATE li_seckill SET goods_num =( SELECT count( id ) FROM li_seckill_apply WHERE seckill_id = #{seckillId} ) WHERE id = #{seckillId}") + void updateSeckillGoodsNum(String seckillId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/AbstractPromotionsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/AbstractPromotionsService.java new file mode 100644 index 00000000..18a65b7f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/AbstractPromotionsService.java @@ -0,0 +1,138 @@ +package cn.lili.modules.promotion.service; + +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.BasePromotions; +import cn.lili.modules.promotion.entity.dto.search.BasePromotionsSearchParams; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 抽象通用促销服务 + * 如需拓展原促销实体字段,新拓展类继承自促销实体即可 + * + * @param 促销类型,继承自促销基础类 + * @author paulG + * @since 2021/11/18 + **/ +public interface AbstractPromotionsService extends IService { + + /** + * 通用促销保存 + * 调用顺序: + * 1. initPromotion 初始化促销信息 + * 2. checkPromotions 检查促销参数 + * 3. save 保存促销信息 + * 4. updatePromotionGoods 更新促销商品信息 + * 5。 updateEsGoodsIndex 更新商品索引促销信息 + * + * @param promotions 促销信息 + * @return 是否保存成功 + */ + boolean savePromotions(T promotions); + + /** + * 通用促销更新 + * 调用顺序: + * 1. checkStatus 检查促销状态 + * 2. checkPromotions 检查促销参数 + * 3. saveOrUpdate 保存促销信息 + * 4. updatePromotionGoods 更新促销商品信息 + * 5. updateEsGoodsIndex 更新商品索引促销信息 + * + * @param promotions 促销信息 + * @return 是否更新成功 + */ + boolean updatePromotions(T promotions); + + /** + * 更新促销状态 + * 如果要更新促销状态为关闭,startTime和endTime置为空即可 + * + * @param ids 促销id集合 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 是否更新成功 + */ + boolean updateStatus(List ids, Long startTime, Long endTime); + + /** + * 移除促销活动 + * + * @param ids 促销活动id集合 + * @return 是否移除成功 + */ + boolean removePromotions(List ids); + + /** + * 分页查询促销信息 + * + * @param searchParams 查询参数,继承自继承促销查询参数 + * @param page 分页参数 + * @param 继承自基础促销查询参数的促销查询参数 + * @return 分页促销信息 + */ + IPage pageFindAll(S searchParams, PageVO page); + + /** + * 列表查询促销信息 + * + * @param searchParams 查询参数,继承自继承促销查询参数 + * @param 继承自基础促销查询参数的促销查询参数 + * @return 列表促销信息 + */ + List listFindAll(S searchParams); + + /** + * 初始化促销字段 + * + * @param promotions 促销实体 + */ + void initPromotion(T promotions); + + /** + * 检查促销参数 + * + * @param promotions 促销实体 + */ + void checkPromotions(T promotions); + + /** + * 检查促销状态 + * + * @param promotions 促销实体 + */ + void checkStatus(T promotions); + + /** + * 更新促销商品信息 + * + * @param promotions 促销实体 + * @return + */ + boolean updatePromotionsGoods(T promotions); + + /** + * 更新促销信息到商品索引 + * + * @param promotions 促销实体 + */ + void updateEsGoodsIndex(T promotions); + + /** + * 当前促销类型 + * + * @return 当前促销类型 + */ + PromotionTypeEnum getPromotionType(); + + /** + * 是否允许同一时间内存在相同的促销 + * + * @return 是否允许同一时间内存在相同的促销 + */ + boolean allowExistSame(); + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java new file mode 100644 index 00000000..d936cf3b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java @@ -0,0 +1,38 @@ +package cn.lili.modules.promotion.service; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 优惠券活动-优惠券业务层 + * + * @author Bulbasaur + * @since 2021/5/20 6:10 下午 + */ +public interface CouponActivityItemService extends IService { + + /** + * 获取优惠券活动关联优惠券列表 + * + * @param activityId 优惠券活动ID + * @return 优惠券关联优惠券列表 + */ + List getCouponActivityList(String activityId); + /** + * 获取优惠券活动关联优惠券列表VO + * + * @param activityId 优惠券活动ID + * @return 优惠券关联优惠券列表 + */ + List getCouponActivityItemListVO(String activityId); + + /** + * 根据优惠券id删除优惠活动关联信息项 + * + * @param couponIds 优惠券id集合 + */ + void removeByCouponId(List couponIds); +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java new file mode 100644 index 00000000..b9bf6820 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java @@ -0,0 +1,42 @@ +package cn.lili.modules.promotion.service; + +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.dto.CouponActivityTrigger; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; + +import java.util.List; + +/** + * 优惠券活动业务层 + * + * @author Bulbasaur + * @since 2021/5/20 6:10 下午 + */ +public interface CouponActivityService extends AbstractPromotionsService { + + + /** + * 获取优惠券活动VO + * 包含优惠券活动信息以及优惠券关联优惠券列表 + * + * @param couponActivityId 优惠券活动ID + * @return 优惠券VO + */ + CouponActivityVO getCouponActivityVO(String couponActivityId); + + /** + * 精准发券 + * + * @param couponActivity 精准发券 + */ + void specify(CouponActivity couponActivity); + + /** + * 用户优惠券活动触发 + * + * @return 优惠券列表 + */ + List trigger(CouponActivityTrigger couponActivityTrigger); + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java index 037f1193..47b95335 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java @@ -2,90 +2,17 @@ package cn.lili.modules.promotion.service; import cn.lili.common.vo.PageVO; import cn.lili.modules.promotion.entity.dos.Coupon; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams; import cn.lili.modules.promotion.entity.vos.CouponVO; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; /** * 优惠券业务层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ -public interface CouponService extends IService { - - /** - * 添加优惠券 - * - * @param coupon 优惠券 - * @return 是否添加成功 - */ - CouponVO add(CouponVO coupon); - - /** - * 更新优惠卷 - * - * @param coupon 优惠卷信息 - * @return 是否更新成功 - */ - CouponVO updateCoupon(CouponVO coupon); - - /** - * 更新优惠卷状态 - * - * @param couponId 优惠券编号 - * @param promotionStatus 促销状态 - * @return 更新结果 - */ - boolean updateCouponStatus(List couponId, PromotionStatusEnum promotionStatus); - - /** - * 删除优惠券 - * - * @param id 优惠券id - * @return 是否删除成功 - */ - boolean deleteCoupon(String id); - - - /** - * 根据查询条件从mongo中获取优惠券信息列表 - * - * @param param 查询参数 - * @param page 分页参数 - * @return 优惠券信息列表 - */ - IPage getCouponsByPageFromMongo(CouponSearchParams param, PageVO page); - - /** - * 根据查询条件从mongo中获取优惠券信息列表 - * - * @param param 查询参数 - * @param page 分页参数 - * @return 优惠券信息列表 - */ - IPage getCanReceiveCoupons(CouponSearchParams param, PageVO page); - - /** - * 获取优惠券详情 - * - * @param id 优惠券id - * @return 优惠券详情 - */ - CouponVO getCouponDetailFromMongo(String id); - - /** - * 根据条件获取优惠券列表 - * - * @param param 条件参数 - * @param page 分页条件 - * @return 可领取优惠券集合 - */ - IPage getCouponsByPage(CouponSearchParams param, PageVO page); +public interface CouponService extends AbstractPromotionsService { /** * 领取优惠券 @@ -103,5 +30,21 @@ public interface CouponService extends IService { */ void usedCoupon(String couponId, Integer usedNum); + /** + * 获取优惠券展示实体 + * + * @param searchParams 查询参数 + * @param page 分页参数 + * @return 优惠券展示实体列表 + */ + IPage pageVOFindAll(CouponSearchParams searchParams, PageVO page); + + /** + * 获取优惠券展示详情 + * + * @param couponId 优惠券id + * @return 返回优惠券展示详情 + */ + CouponVO getDetail(String couponId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/FullDiscountService.java b/framework/src/main/java/cn/lili/modules/promotion/service/FullDiscountService.java index 03e3b3db..04314bde 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/FullDiscountService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/FullDiscountService.java @@ -1,11 +1,7 @@ package cn.lili.modules.promotion.service; -import cn.lili.common.vo.PageVO; -import cn.lili.modules.promotion.entity.dos.FullDiscount; -import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; +import cn.lili.modules.promotion.entity.dos.FullDiscount; import java.util.List; @@ -13,17 +9,9 @@ import java.util.List; * 满优惠业务层 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ -public interface FullDiscountService extends IService { - - /** - * 当前满优惠活动 - * - * @param storeId 商家编号 - * @return 满优惠活动信息 - */ - FullDiscountVO currentPromotion(String storeId); +public interface FullDiscountService extends AbstractPromotionsService { /** * 当前满优惠活动 @@ -33,41 +21,6 @@ public interface FullDiscountService extends IService { */ List currentPromotion(List storeId); - /** - * 添加满优惠活动 - * - * @param fullDiscountVO 满优惠活动信息 - * @return 满优惠活动 - */ - FullDiscount addFullDiscount(FullDiscountVO fullDiscountVO); - - /** - * 从mysql中分页获取满优惠列表 - * - * @param searchParams 参数 - * @param page 分页参数 - * @return 满优惠列表 - */ - IPage getFullDiscountByPageFromMysql(FullDiscountSearchParams searchParams, PageVO page); - - /** - * 从mongo中分页获取满优惠列表 - * - * @param searchParams 搜索参数 - * @param page 分页参数 - * @return 满优惠列表 - */ - IPage getFullDiscountByPageFromMongo(FullDiscountSearchParams searchParams, PageVO page); - - - /** - * 修改满优惠活动 - * - * @param fullDiscountVO 满优惠活动信息 - * @return 满优惠活动 - */ - FullDiscountVO modifyFullDiscount(FullDiscountVO fullDiscountVO); - /** * 获取满优惠活动详情 * @@ -76,12 +29,6 @@ public interface FullDiscountService extends IService { */ FullDiscountVO getFullDiscount(String id); - /** - * 删除满优惠获取 - * - * @param id 满优惠活动编号 - * @return 删除结果 - */ - boolean deleteFullDiscount(String id); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityGoodsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityGoodsService.java new file mode 100644 index 00000000..1479f61f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityGoodsService.java @@ -0,0 +1,79 @@ +package cn.lili.modules.promotion.service; + + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityGoodsParams; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import java.util.List; + + +/** + * 砍价业务层 + * + * @author qiuqiu + * @date 2021/7/1 9:45 上午 + */ +public interface KanjiaActivityGoodsService extends AbstractPromotionsService { + + + /** + * 添加砍价活动商品 + * + * @param kanJiaActivityGoodsDTOS 砍价商品 + * @return 是否添加成功 + */ + Boolean add(KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsDTOS); + + /** + * 查询砍价活动商品分页信息 + * + * @param kanJiaActivityGoodsParams 砍价活动商品 + * @param pageVO 分页信息 + * @return 砍价商品 + */ + IPage kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO); + + /** + * 查询砍价活动商品 + * + * @param goodsId 砍价活动商品id + * @return 砍价活动商品信息 + */ + KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId); + + /** + * 根据SkuId获取正在进行中的砍价商品 + * + * @param skuId 商品规格Id + * @return 砍价商品 + */ + KanjiaActivityGoods getKanjiaGoodsBySkuId(String skuId); + + /** + * 查询砍价活动商品VO + * + * @param id 砍价活动商品ID + * @return 砍价活动商品 + */ + KanjiaActivityGoodsVO getKanJiaGoodsVO(String id); + + /** + * 修改看见商品信息 + * + * @param kanjiaActivityGoodsDTO 砍价商品信息 + * @return 是否修改成功 + */ + boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO); + + /** + * 根据商品id删除促销活动 + * @param goodsIds + */ + void deleteByGoodsIds(List goodsIds); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityLogService.java b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityLogService.java new file mode 100644 index 00000000..c6a3de22 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityLogService.java @@ -0,0 +1,36 @@ +package cn.lili.modules.promotion.service; + + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; +import cn.lili.modules.promotion.entity.dto.search.KanJiaActivityLogQuery; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + + +/** + * 砍价活动日志业务层 + * + * @author qiuqiu + * @date 2021/7/1 9:45 上午 + */ +public interface KanjiaActivityLogService extends IService { + + /** + * 根据砍价参与记录id查询砍价记录 + * + * @param kanJiaActivityLogQuery 砍价活动帮砍信息 + * @param pageVO 分页信息 + * @return 砍价日志 + */ + IPage getForPage(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO pageVO); + + /** + * 砍一刀 + * + * @param kanJiaActivityDTO 砍价记录 + * @return + */ + KanjiaActivityLog addKanJiaActivityLog(KanjiaActivityDTO kanJiaActivityDTO); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityService.java b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityService.java new file mode 100644 index 00000000..909942e5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/KanjiaActivityService.java @@ -0,0 +1,74 @@ +package cn.lili.modules.promotion.service; + + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityQuery; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + + +/** + * 砍价活动参与记录业务层 + * + * @author qiuqiu + * @date 2021/7/1 9:45 上午 + */ +public interface KanjiaActivityService extends IService { + + /** + * 获取砍价活动 + * + * @param kanJiaActivitySearchParams 砍价活动搜索参数 + * @return 砍价活动 + */ + KanjiaActivity getKanjiaActivity(KanjiaActivitySearchParams kanJiaActivitySearchParams); + + /** + * 获取砍价活动 + *

+ * 有值说明是已参加的砍价活动 + * 没有值说明是未参加的砍价活动 + * + * @param kanJiaActivitySearchParams 砍价活动搜索参数 + * @return 砍价活动 + */ + KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams); + + /** + * 发起人发起砍价活动 + * + * @param id 活动ID + * @return + */ + KanjiaActivityLog add(String id); + + /** + * 帮砍 + * + * @param kanJiaActivityId 活动id + * @return 砍价详细 + */ + KanjiaActivityLog helpKanJia(String kanJiaActivityId); + + /** + * 根据条件查询我参与的砍价活动 + * + * @param kanJiaActivityQuery 砍价活动查询条件 + * @param page 分页对象 + * @return 我参与的砍价活动信息 + */ + IPage getForPage(KanjiaActivityQuery kanJiaActivityQuery, PageVO page); + + + /** + * 结束砍价活动 + * + * @param kanjiaId 砍价活动id + * @return 是否更新成功 + */ + boolean endKanjiaActivity(String kanjiaId); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java b/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java index d2de9d52..b807a080 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java @@ -2,9 +2,10 @@ package cn.lili.modules.promotion.service; import cn.lili.common.vo.PageVO; import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams; +import cn.lili.modules.promotion.entity.vos.MemberCouponVO; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -13,7 +14,7 @@ import java.util.List; * 会员优惠券业务层 * * @author Chopper - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 */ public interface MemberCouponService extends IService { @@ -25,6 +26,14 @@ public interface MemberCouponService extends IService { */ void checkCouponLimit(String couponId, String memberId); + /** + * 领取优惠券 + * + * @param couponId 优惠券编号 + * @param memberId 会员 + * @param memberName 会员名称 + */ + void receiveBuyerCoupon(String couponId, String memberId, String memberName); /** * 领取优惠券 @@ -42,17 +51,33 @@ public interface MemberCouponService extends IService { * @param pageVo 分页参数 * @return 会员优惠券列表 */ - IPage getMemberCoupons(CouponSearchParams param, PageVO pageVo); + IPage getMemberCoupons(MemberCouponSearchParams param, PageVO pageVo); + + /** + * 获取会员优惠券列表 + * + * @param param 查询参数 + * @return 会员优惠券列表 + */ + List getMemberCoupons(MemberCouponSearchParams param); + + /** + * 获取当前用户的优惠券列表(优先读取缓存) + * + * @param memberId 会员id + * @return 会员优惠券列表 + */ + List getMemberCoupons(String memberId); /** * 获取会员优惠券列表 * * @param param 查询参数 - * @param pageVo 分页参数 * @param totalPrice 当前商品总价 + * @param pageVo 分页参数 * @return 会员优惠券列表 */ - IPage getMemberCouponsByCanUse(CouponSearchParams param, Double totalPrice, PageVO pageVo); + IPage getMemberCouponsByCanUse(MemberCouponSearchParams param, Double totalPrice, PageVO pageVo); /** * 获取当前会员当前商品可用的会员优惠券 @@ -73,33 +98,76 @@ public interface MemberCouponService extends IService { */ List getAllScopeMemberCoupon(String memberId, List storeId); + /** + * 获取会员优惠券 + * + * @param param 查询参数 + * @return 会员优惠券列表 + */ + MemberCoupon getMemberCoupon(MemberCouponSearchParams param); + /** * 获取会员优惠券数量 * * @return 会员优惠券数量 */ - Integer getMemberCouponsNum(); - - /** - * 更新会员优惠券状态 - * - * @param status 要变更的状态 - * @param id 会员优惠券id - */ - void updateMemberCouponStatus(MemberCouponStatusEnum status, String id); + long getMemberCouponsNum(); /** * 使用优惠券 * * @param ids 会员优惠券id */ - void used(List ids); + void used(String memberId, List ids); /** * 作废当前会员优惠券 * * @param id id */ - void cancellation(String id); + void cancellation(String memberId, String id); + + /** + * 作废无效的会员优惠券 + * + * @return 是否操作成功 + */ + boolean expireInvalidMemberCoupon(String memberId); + + /** + * 关闭会员优惠券 + * + * @param couponIds 优惠券id集合 + */ + void closeMemberCoupon(List couponIds); + + /** + * 恢复会员优惠券 + * + * @param memberCouponIds 会员优惠券id列表 + * @return 是否恢复成功 + */ + boolean recoveryMemberCoupon(List memberCouponIds); + + /** + * 作废优惠券 + * + * @param couponId 优惠券ID + */ + void voidCoupon(String couponId); + + /** + * 获取会员优惠券列表 + * + * @param page 分页参数 + * @param param 查询参数 + * @return 会员优惠券列表 + */ + Page getMemberCouponsPage(Page page, MemberCouponSearchParams param); + + /** + * 获取会员领取过的优惠券数量 + */ + long getMemberCouponNum(String memberId, String couponId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponSignService.java b/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponSignService.java new file mode 100644 index 00000000..5e4c4fff --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponSignService.java @@ -0,0 +1,33 @@ +package cn.lili.modules.promotion.service; + +import cn.lili.modules.promotion.entity.dos.MemberCouponSign; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 优惠券领取标记业务层 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2023/1/3 18:12 + */ + +public interface MemberCouponSignService extends IService { + + + /** + * 清除缓存 + * 清除失效标记 + */ + void clean(); + + + /** + * 清除缓存 + * 清除失效标记 + */ + List receiveCoupon(List couponActivity); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PintuanService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PintuanService.java index e3162511..a1c6f345 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PintuanService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PintuanService.java @@ -1,33 +1,20 @@ package cn.lili.modules.promotion.service; -import cn.lili.common.vo.PageVO; import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.entity.vos.PintuanMemberVO; -import cn.lili.modules.promotion.entity.vos.PintuanSearchParams; import cn.lili.modules.promotion.entity.vos.PintuanShareVO; import cn.lili.modules.promotion.entity.vos.PintuanVO; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import java.util.Date; import java.util.List; /** * 拼图活动业务层 * * @author Chopper - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 */ -public interface PintuanService extends IService { +public interface PintuanService extends AbstractPromotionsService { - /** - * 根据条件分页查询拼团活动列表 - * - * @param param 拼团活动查询参数 - * @param page 分页参数 - * @return 拼团活动列表 - */ - IPage getPintuanByPage(PintuanSearchParams param, PageVO page); /** * 获取当前拼团的会员 @@ -38,79 +25,12 @@ public interface PintuanService extends IService { List getPintuanMember(String pintuanId); /** - * 从mongo中根据条件分页查询拼团活动列表 - * - * @param param 拼团活动查询参数 - * @param page 分页参数 - * @return 拼团活动列表 - */ - IPage getPintuanByPageFromMongo(PintuanSearchParams param, PageVO page); - - /** - * 从mongo中查询拼团活动详情 + * 查询拼团活动详情 * * @param id 拼团ID * @return 拼团活动详情 */ - PintuanVO getPintuanByIdFromMongo(String id); - - /** - * 从mysql中查询拼团活动详情 - * - * @param id 拼团活动id - * @return 拼团活动详情 - */ - Pintuan getPintuanById(String id); - - /** - * 从mongo中根据条件查询拼团活动总数 - * - * @param param 拼团活动查询参数 - * @return 总数 - */ - Long getPintuanByPageFromMongoCount(PintuanSearchParams param); - - /** - * 拼团新增业务处理 - * - * @param pintuan 拼团实体 - * @return 是否成功 - */ - boolean addPintuan(PintuanVO pintuan); - - /** - * 拼团修改 - * - * @param pintuan 拼团实体 - * @return 是否成功 - */ - boolean modifyPintuan(PintuanVO pintuan); - - /** - * 开启拼团 - * - * @param pintuanId 拼团活动编号 - * @param startTime 开始时间 - * @param endTime 结束时间 - * @return 是否成功 - */ - boolean openPintuan(String pintuanId, Date startTime, Date endTime); - - /** - * 关闭拼团 - * - * @param pintuanId 拼团活动编号 - * @return 是否成功 - */ - boolean closePintuan(String pintuanId); - - /** - * 删除拼团 - * - * @param pintuanId 拼团活动编号 - * @return 是否成功 - */ - boolean deletePintuan(String pintuanId); + PintuanVO getPintuanVO(String id); /** * 获取拼团分享信息 diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsCategoryService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsCategoryService.java index 7f0d7a89..2de42b43 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsCategoryService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsCategoryService.java @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 积分商品分类业务层 * * @author paulG - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 **/ public interface PointsGoodsCategoryService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java index 122d6142..948d98f8 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PointsGoodsService.java @@ -1,11 +1,7 @@ package cn.lili.modules.promotion.service; -import cn.lili.common.vo.PageVO; import cn.lili.modules.promotion.entity.dos.PointsGoods; -import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -13,42 +9,17 @@ import java.util.List; * 积分商品业务层 * * @author paulG - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 **/ -public interface PointsGoodsService extends IService { +public interface PointsGoodsService extends AbstractPromotionsService { /** - * 批量添加积分商品 + * 批量保存库存商品 * - * @param pointsGoodsList 积分商品列表 - * @return 是否添加成功 + * @param promotionsList 积分商品列表 + * @return 是否保存成功 */ - boolean addPointsGoods(List pointsGoodsList); - - /** - * 更新一个积分商品 - * - * @param pointsGoodsDTO 编辑的积分商品信息 - * @return 是否更新成功 - */ - boolean updatePointsGoods(PointsGoodsVO pointsGoodsDTO); - - /** - * 批量更新积分商品状态 - * - * @param ids 积分商品id集合 - * @param promotionStatus 更新的状态 - * @return 是否更新成功 - */ - boolean updatePointsGoodsPromotionStatus(List ids, String promotionStatus); - - /** - * 批量删除积分商品 - * - * @param ids 积分商品id集合 - * @return 是否删除成功 - */ - boolean deletePointsGoods(List ids); + boolean savePointsGoodsBatch(List promotionsList); /** * 根据ID获取积分详情 @@ -59,20 +30,11 @@ public interface PointsGoodsService extends IService { PointsGoodsVO getPointsGoodsDetail(String id); /** - * 根据SkuID获取积分商品信息 + * 根据ID获取积分详情 * - * @param skuId 商品skuId + * @param skuId 商品SkuId * @return 积分详情 */ - PointsGoods getPointsGoodsDetailBySkuId(String skuId); - - /** - * 根据条件查询积分商品 - * - * @param searchParams 积分商品查询参数 - * @param page 分页参数 - * @return 积分商品查询结果 - */ - IPage getPointsGoodsByPage(PointsGoodsSearchParams searchParams, PageVO page); + PointsGoodsVO getPointsGoodsDetailBySkuId(String skuId); } diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java index e4be4e76..a53d9d7e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java @@ -1,23 +1,24 @@ package cn.lili.modules.promotion.service; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dto.GoodsSkuDTO; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; -import cn.lili.modules.order.cart.entity.vo.CartSkuVO; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Date; import java.util.List; +import java.util.Map; /** * 促销商品业务层 * * @author Chopper - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 */ public interface PromotionGoodsService extends IService { @@ -35,51 +36,22 @@ public interface PromotionGoodsService extends IService { } /** - * 根据活动获取商品 + * 获取某sku所有有效活动 * - * @param promotionId 促销活动id - * @param skuId 商品id - * @return 促销商品信息 - */ - PromotionGoods findByPromotion(String promotionId, String skuId); - - /** - * 删除指定促销类型的促销商品 - * - * @param promotionGoodsList 促销商品列表 - * @param promotionType 促销类型 - */ - void removePromotionGoods(List promotionGoodsList, PromotionTypeEnum promotionType); - - /** - * 更新促销活动 - * - * @param cartSkuVO 购物车中的产品 - */ - void updatePromotion(CartSkuVO cartSkuVO); - - /** - * 获取购物车商品的促销活动 - * - * @param cartSkuVO 购物车中的产品 - */ - void getCartSkuPromotion(CartSkuVO cartSkuVO); - - /** - * 获取某sku当日所有活动 - * - * @param skuId 商品skuId + * @param skuId 商品skuId + * @param storeIds 店铺id * @return 促销商品集合 */ - List findNowSkuPromotion(String skuId); + List findSkuValidPromotion(String skuId, String storeIds); + /** - * 分页获取促销商品信息 + * 获取sku所有有效活动 * - * @param goodsId 商品skuId - * @return 某商品的促销信息 + * @param skus 商品skuId + * @return 促销商品集合 */ - List getPromotionGoods(String goodsId); + List findSkuValidPromotions(List skus); /** * 分页获取促销商品信息 @@ -88,16 +60,42 @@ public interface PromotionGoodsService extends IService { * @param pageVo 分页参数 * @return 促销商品列表 */ - IPage getPromotionGoods(PromotionGoodsSearchParams searchParams, PageVO pageVo); + Page pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo); /** - * 分页获取当前进行中的促销活动的促销商品信息 + * 获取促销商品信息 * - * @param promotionType 促销活动类型 - * @param pageVo 分页参数 + * @param searchParams 查询参数 * @return 促销商品列表 */ - IPage getCurrentPromotionGoods(String promotionType, PageVO pageVo); + List listFindAll(PromotionGoodsSearchParams searchParams); + + /** + * 获取促销商品信息 + * + * @param searchParams 查询参数 + * @return 促销商品信息 + */ + PromotionGoods getPromotionsGoods(PromotionGoodsSearchParams searchParams); + + + /** + * 获取当前有效时间特定促销类型的促销商品信息 + * + * @param skuId skuId + * @param promotionTypes 特定促销类型 + * @return 促销商品信息 + */ + PromotionGoods getValidPromotionsGoods(String skuId, List promotionTypes); + + /** + * 获取当前有效时间特定促销类型的促销商品价格 + * + * @param skuId skuId + * @param promotionTypes 特定促销类型 + * @return 促销商品价格 + */ + Double getValidPromotionsGoodsPrice(String skuId, List promotionTypes); /** * 查询参加活动促销商品是否同时参加指定类型的活动 @@ -106,9 +104,10 @@ public interface PromotionGoodsService extends IService { * @param skuId skuId * @param startTime 开始时间 * @param endTime 结束时间 + * @param promotionId 促销活动id(是否排除当前活动,如排除,则填写,没有的话,为null) * @return 共参加了几种活动 */ - Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime); + Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime, String promotionId); /** @@ -122,34 +121,73 @@ public interface PromotionGoodsService extends IService { Integer getPromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId); /** - * 根据条件获取促销活动商品详情 + * 批量获取促销活动商品库存 * - * @param typeEnum 促销类型 + * @param typeEnum 促销商品类型 * @param promotionId 促销活动id - * @param skuId 商品skuId - * @return 促销活动商品详情 + * @param skuId 批量商品skuId + * @return 促销活动商品库存 */ - PromotionGoods getPromotionGoods(PromotionTypeEnum typeEnum, String promotionId, String skuId); + List getPromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, List skuId); /** * 更新促销活动商品库存 * - * @param typeEnum 促销商品类型 - * @param promotionId 促销活动id - * @param skuId 商品skuId - * @param quantity 更新后的库存数量 + * @param promotionGoodsList 更新促销活动商品信息 */ - void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity); - + void updatePromotionGoodsStock(List promotionGoodsList); /** - * 分页获取根据条件获取促销商品 + * 更新促销活动商品库存 * - * @param goodsName 商品名称 - * @param categoryPath 商品分类 - * @param promotionType 促销类型 - * @param pageVo 分页参数 - * @return 促销商品信息 + * @param skuId 商品skuId + * @param quantity 库存 */ - IPage getPromotionGoodsPage(String goodsName, String categoryPath, String promotionType, PageVO pageVo); + void updatePromotionGoodsStock(String skuId, Integer quantity); + + /** + * 更新促销活动商品索引 + * + * @param promotionGoods 促销商品信息 + */ + void updatePromotionGoodsByPromotions(PromotionGoods promotionGoods); + + /** + * 删除促销商品 + * + * @param promotionId 促销活动id + * @param skuIds skuId + */ + void deletePromotionGoods(String promotionId, List skuIds); + + /** + * 删除促销促销商品 + * + * @param promotionIds 促销活动id + */ + void deletePromotionGoods(List promotionIds); + + /** + * 删除商品的促销 + * + * @param goodsIds 商品id + */ + void deletePromotionGoodsByGoods(List goodsIds); + + /** + * 根据参数删除促销商品 + * + * @param searchParams 查询参数 + */ + void deletePromotionGoods(PromotionGoodsSearchParams searchParams); + + /** + * 获取当前商品促销信息 + * + * @param dataSku 商品sku信息 + * @param cartType 购物车类型 + * @return 当前商品促销信息 + */ + Map getCurrentGoodsPromotion(GoodsSku dataSku, String cartType); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionPriceService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionPriceService.java deleted file mode 100644 index 0b934850..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionPriceService.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.lili.modules.promotion.service; - -import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.dto.PromotionPriceDTO; -import cn.lili.modules.promotion.entity.dto.PromotionPriceParamDTO; - -import java.util.List; - -/** - * 促销计算 - * - * @author paulG - * @date 2020/8/21 - **/ -public interface PromotionPriceService { - - /** - * 计算商品当前所参与的促销活动的价格 - * - * @param tradeSkuList 促销计算参数 - * @param memberCouponList 使用的优惠券 - * @return 促销计算结果 - */ - PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList); - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionService.java index 6b825e40..66660817 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionService.java @@ -1,41 +1,46 @@ package cn.lili.modules.promotion.service; -import cn.lili.common.delayqueue.PromotionMessage; -import cn.lili.modules.search.entity.dos.EsGoodsIndex; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import java.util.List; import java.util.Map; /** * 促销业务层 * * @author Chopper - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 */ public interface PromotionService { - - /** - * 更新促销活动状态 - * - * @param promotionMessage 促销变更信息 - * @return 是否更新成功 - */ - boolean updatePromotionStatus(PromotionMessage promotionMessage); - - /** * 获取当前进行的所有促销活动信息 * * @return 当前促销活动集合 */ - Map getCurrentPromotion(); + Map> getCurrentPromotion(); /** * 根据商品索引获取当前商品索引的所有促销活动信息 * - * @param index 商品索引 + * @param storeId 店铺id + * @param goodsSkuId 商品skuId * @return 当前促销活动集合 */ - Map getGoodsCurrentPromotionMap(EsGoodsIndex index); + Map getGoodsSkuPromotionMap(String storeId, String goodsSkuId); + /** + * 删除商品,则删除相关促销信息 + * + * @param goodsIdsJsonStr + */ + void removeByGoodsIds(String goodsIdsJsonStr); + + /** + * 根据促销商品信息包装促销信息 + * + * @param promotionGoodsList 促销商品信息 + * @return 促销信息 + */ + Map wrapperPromotionMapList(List promotionGoodsList); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java index aeff8ee7..f674b489 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java @@ -1,103 +1,109 @@ package cn.lili.modules.promotion.service; import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; +import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillApplyVO; import cn.lili.modules.promotion.entity.vos.SeckillGoodsVO; -import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillTimelineVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; -import java.util.Map; /** * 秒杀申请业务层 * * @author Chopper - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 */ public interface SeckillApplyService extends IService { /** - * 获取当天限时抢购信息列表(时刻及对应时刻下的商品) + * 获取当天秒杀活动信息列表(时刻及对应时刻下的商品) * - * @return 限时抢购信息列表 + * @return 秒杀活动信息列表 */ List getSeckillTimeline(); - /** - * 获取当天某个时刻的限时抢购商品列表 + * 获取当天某个时刻的秒杀活动商品列表 * * @param timeline 指定时刻 - * @return 限时抢购商品列表 + * @return 秒杀活动商品列表 */ List getSeckillGoods(Integer timeline); - /** - * 审核一批申请 - * - * @param ids 限时抢购申请编号 - * @param seckillId 限时抢购编号 - * @param applyStatus 审批状态 - * @param failReason 驳回原因 - */ - void auditBatchApply(String[] ids, String seckillId, String applyStatus, String failReason); - /** * 分页查询限时请购申请列表 * - * @param queryParam 限时抢购申请查询参数 + * @param queryParam 秒杀活动申请查询参数 * @param pageVo 分页参数 * @return 限时请购申请列表 */ - IPage getSeckillApplyFromMysql(SeckillSearchParams queryParam, PageVO pageVo); + IPage getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo); /** - * 从mongo中分页查询限时请购申请列表 + * 查询限时请购申请列表 * - * @param queryParam 限时抢购申请查询参数 - * @param pageVo 分页参数 + * @param queryParam 秒杀活动申请查询参数 * @return 限时请购申请列表 */ - IPage getSeckillApplyFromMongo(SeckillSearchParams queryParam, PageVO pageVo); + List getSeckillApplyList(SeckillSearchParams queryParam); /** - * 添加限时抢购申请 + * 查询限时请购申请列表总数 * - * @param seckillId 限时抢购编号 + * @param queryParam 查询条件 + * @return 限时请购申请列表总数 + */ + long getSeckillApplyCount(SeckillSearchParams queryParam); + + /** + * 查询限时请购申请 + * + * @param queryParam 秒杀活动申请查询参数 + * @return 限时请购申请 + */ + SeckillApply getSeckillApply(SeckillSearchParams queryParam); + + /** + * 添加秒杀活动申请 + * 检测是否商品是否同时参加多个活动 + * 将秒杀商品信息存入秒杀活动中 + * 保存秒杀活动商品,促销商品信息 + * + * @param seckillId 秒杀活动编号 * @param storeId 商家id - * @param seckillApplyList 限时抢购申请列表 + * @param seckillApplyList 秒杀活动申请列表 */ void addSeckillApply(String seckillId, String storeId, List seckillApplyList); /** - * 批量删除限时抢购申请 + * 批量删除秒杀活动商品 * - * @param seckillId 限时抢购活动id - * @param ids 限时抢购申请id集合 + * @param seckillId 秒杀活动活动id + * @param id 秒杀活动商品 */ - void removeSeckillApplyByIds(String seckillId, List ids); + void removeSeckillApply(String seckillId, String id); /** - * 更新限时抢购库存数量 + * 更新秒杀商品出售数量 * - * @param id 限时抢购申请(限时抢购商品)id - * @param num 数量 - * @return 是否成功 + * @param seckillId 秒杀活动id + * @param skuId 商品skuId + * @param saleNum 出售数量 */ - boolean updateSeckillStock(String id, Integer num); - + void updateSeckillApplySaleNum(String seckillId, String skuId, Integer saleNum); /** - * 更新限时抢购库存数量 + * 更新秒杀活动时间 * - * @param map key 为 限时抢购申请(限时抢购商品)id, value 为数量 - * @return 是否成功 + * @param seckill 秒杀活动 + * @return 是否更新成功 */ - boolean updateSeckillStock(Map map); + boolean updateSeckillApplyTime(Seckill seckill); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java index bd8cfc90..2b916e61 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java @@ -1,95 +1,72 @@ package cn.lili.modules.promotion.service; -import cn.lili.common.vo.PageVO; import cn.lili.modules.promotion.entity.dos.Seckill; -import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; +import cn.lili.modules.promotion.entity.dos.SeckillApply; import cn.lili.modules.promotion.entity.vos.SeckillVO; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; /** * 秒杀业务层 * * @author Chopper - * @date 2020/11/18 9:45 上午 + * @since 2020/11/18 9:45 上午 */ -public interface SeckillService extends IService { - +public interface SeckillService extends AbstractPromotionsService { /** - * 从mysql中根据条件获取限时抢购分页列表 - * - * @param queryParam 查询参数 - * @param pageVo 分页参数 - * @return 限时抢购分页列表 + * 预创建活动数量 */ - IPage getSeckillByPageFromMysql(SeckillSearchParams queryParam, PageVO pageVo); + Integer PRE_CREATION = 7; /** - * 从mongo中根据条件获取限时抢购分页列表 + * 获取秒杀活动信息 * - * @param queryParam 查询参数 - * @param pageVo 分页参数 - * @return 限时抢购分页列表 + * @param id 秒杀活动id + * @return 秒杀活动信息 */ - IPage getSeckillByPageFromMongo(SeckillSearchParams queryParam, PageVO pageVo); + SeckillVO getSeckillDetail(String id); /** - * 从mongo中获取限时抢购信息 - * - * @param id 限时抢购id - * @return 限时抢购信息 + * 初始化秒杀活动,默认开启三十天的秒杀活动 */ - SeckillVO getSeckillByIdFromMongo(String id); - - /** - * 保存限时抢购 - * - * @param seckill 限时抢购信息 - * @return 是否保存成功 - */ - boolean saveSeckill(SeckillVO seckill); - - /** - * 商家报名限时抢购活动 - * - * @param storeId 商家编号 - * @param seckillId 限时抢购编号 - */ - void storeApply(String storeId, String seckillId); - - /** - * 修改限时抢购 - * - * @param seckillVO 限时抢购信息 - * @return 是否修改成功 - */ - boolean modifySeckill(SeckillVO seckillVO); - - /** - * 删除限时抢购 - * - * @param id 限时抢购编号 - */ - void deleteSeckill(String id); - - /** - * 开启一个限时抢购 - * - * @param id 限时抢购编号 - */ - void openSeckill(String id); - - /** - * 关闭一个限时抢购 - * - * @param id 限时抢购编号 - */ - void closeSeckill(String id); + void init(); /** * 获取当前可参与的活动数量 + * * @return 可参与活动数量 */ - Integer getApplyNum(); + long getApplyNum(); + + /** + * 更新秒杀活动的商品数量 + * + * @param seckillId 秒杀活动ID + */ + void updateSeckillGoodsNum(String seckillId); + + /** + * 更新商品索引限时抢购信息 + * + * @param seckill 限时抢购信息 + * @param seckillApplies 限时抢购商品列表 + */ + void updateEsGoodsSeckill(Seckill seckill, List seckillApplies); + + /** + * 删除商品索引限时抢购信息 + * + * @param seckill 限时抢购信息 + * @param skuIds 商品skuId列表 + */ + void deleteEsGoodsSeckill(Seckill seckill, List skuIds); + + /** + * 设置秒杀活动的每个参与活动商品的详细时间 + * + * @param seckill 秒杀活动信息 + * @param seckillApply 申请参与秒杀活动的商品信息 + */ + void setSeckillApplyTime(Seckill seckill, SeckillApply seckillApply); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/AbstractPromotionsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/AbstractPromotionsServiceImpl.java new file mode 100644 index 00000000..a92abfb5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/AbstractPromotionsServiceImpl.java @@ -0,0 +1,288 @@ +package cn.lili.modules.promotion.serviceimpl; + +import cn.hutool.core.map.MapBuilder; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.BasePromotions; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.search.BasePromotionsSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.service.AbstractPromotionsService; +import cn.lili.modules.promotion.service.PromotionGoodsService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.tags.GoodsTagsEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * @author paulG + * @since 2021/11/30 + **/ +public abstract class AbstractPromotionsServiceImpl, T extends BasePromotions> extends ServiceImpl implements AbstractPromotionsService { + + /** + * 促销商品 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + + /** + * rocketMq配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + + /** + * 通用促销保存 + * 调用顺序: + * 1. initPromotion 初始化促销信息 + * 2. checkPromotions 检查促销参数 + * 3. save 保存促销信息 + * 4. updatePromotionGoods 更新促销商品信息 + * 5。 updateEsGoodsIndex 更新商品索引促销信息 + * + * @param promotions 促销信息 + * @return 是否保存成功 + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean savePromotions(T promotions) { + this.initPromotion(promotions); + this.checkPromotions(promotions); + boolean save = this.save(promotions); + if (this.updatePromotionsGoods(promotions)) { + this.updateEsGoodsIndex(promotions); + } + return save; + } + + /** + * 通用促销更新 + * 调用顺序: + * 1. checkStatus 检查促销状态 + * 2. checkPromotions 检查促销参数 + * 3. saveOrUpdate 保存促销信息 + * 4. updatePromotionGoods 更新促销商品信息 + * 5. updateEsGoodsIndex 更新商品索引促销信息 + * + * @param promotions 促销信息 + * @return 是否更新成功 + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean updatePromotions(T promotions) { + this.checkStatus(promotions); + this.checkPromotions(promotions); + boolean save = this.saveOrUpdate(promotions); + if (this.updatePromotionsGoods(promotions)) { + this.updateEsGoodsIndex(promotions); + } + return save; + } + + /** + * 更新促销状态 + * 如果要更新促销状态为关闭,startTime和endTime置为空即可 + * + * @param ids 促销id集合 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 是否更新成功 + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean updateStatus(List ids, Long startTime, Long endTime) { + List promotionsList = this.list(new QueryWrapper().in("id", ids)); + for (T t : promotionsList) { + if (startTime != null && endTime != null) { + t.setStartTime(new Date(startTime)); + t.setEndTime(new Date(endTime)); + this.checkPromotions(t); + } else { + t.setStartTime(null); + t.setEndTime(null); + } + this.checkStatus(t); + this.updatePromotionsGoods(t); + this.updateEsGoodsIndex(t); + } + if (startTime != null && endTime != null) { + return this.update(new UpdateWrapper().in("id", ids).set("start_time", new Date(startTime)).set("end_time", new Date(endTime))); + } else { + return this.update(new UpdateWrapper().in("id", ids).set("start_time", null).set("end_time", null)); + } + } + + /** + * 移除促销活动 + * + * @param ids 促销活动id集合 + * @return 是否移除成功 + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean removePromotions(List ids) { + for (String id : ids) { + T promotions = this.getById(id); + this.checkStatus(promotions); + promotions.setStartTime(null); + promotions.setEndTime(null); + this.updateEsGoodsIndex(promotions); + } + this.promotionGoodsService.deletePromotionGoods(ids); + return this.removeByIds(ids); + } + + /** + * 分页查询促销信息 + * + * @param searchParams 查询参数,继承自继承促销查询参数 + * @param page 分页参数 + * @return 分页促销信息 + */ + @Override + public IPage pageFindAll(S searchParams, PageVO page) { + return this.page(PageUtil.initPage(page), searchParams.queryWrapper()); + } + + /** + * 列表查询促销信息 + * + * @param searchParams 查询参数,继承自继承促销查询参数 + * @return 列表促销信息 + */ + @Override + public List listFindAll(S searchParams) { + return this.list(searchParams.queryWrapper()); + } + + /** + * 初始化促销字段 + * + * @param promotions 促销实体 + */ + @Override + public void initPromotion(T promotions) { + if (CharSequenceUtil.isEmpty(promotions.getScopeType())) { + promotions.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name()); + } + } + + /** + * 检查促销参数 + * + * @param promotions 促销实体 + */ + @Override + public void checkPromotions(T promotions) { + PromotionTools.checkPromotionTime(promotions.getStartTime(), promotions.getEndTime()); + if (!this.allowExistSame()) { + this.checkSamePromotions(promotions); + } + } + + /** + * 检查促销状态 + * + * @param promotions 促销实体 + */ + @Override + public void checkStatus(T promotions) { + T byId = this.getById(promotions.getId()); + if (byId == null) { + throw new ServiceException(ResultCode.PROMOTION_ACTIVITY_ERROR); + } + } + + /** + * 更新促销商品信息 + * + * @param promotions 促销实体 + * @return + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean updatePromotionsGoods(T promotions) { + if (promotions.getStartTime() == null && promotions.getEndTime() == null) { + this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId())); + return true; + } + boolean result = true; + if (CharSequenceUtil.equalsAny(promotions.getScopeType(), PromotionsScopeTypeEnum.ALL.name(), PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name())) { + PromotionGoods promotionGoods = new PromotionGoods(); + promotionGoods.setScopeId(promotions.getScopeId()); + promotionGoods.setScopeType(promotions.getScopeType()); + promotionGoods.setPromotionId(promotions.getId()); + promotionGoods.setStoreId(promotions.getStoreId()); + promotionGoods.setStoreName(promotions.getStoreName()); + promotionGoods.setStartTime(promotions.getStartTime()); + promotionGoods.setEndTime(promotions.getEndTime()); + promotionGoods.setPromotionType(this.getPromotionType().name()); + promotionGoods.setTitle(promotions.getPromotionName()); + this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId())); + result = this.promotionGoodsService.save(promotionGoods); + } + return result; + } + + /** + * 更新促销信息到商品索引 + * + * @param promotions 促销实体 + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public void updateEsGoodsIndex(T promotions) { + if (promotions.getStartTime() == null && promotions.getEndTime() == null) { + Map build = MapBuilder.create().put("promotionKey", this.getPromotionType() + "-" + promotions.getId()).put("scopeId", promotions.getScopeId()).build(); + //删除商品促销消息 + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("删除商品促销事件", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.DELETE_GOODS_INDEX_PROMOTIONS.name(), JSONUtil.toJsonStr(build))); + } else { + + String esPromotionKey = this.getPromotionType().name() + "-" + promotions.getId(); + Map map = new HashMap<>(); + // es促销key + map.put("esPromotionKey", esPromotionKey); + // 促销类型全路径名 + map.put("promotionsType", promotions.getClass().getName()); + // 促销实体 + map.put("promotions", promotions); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("更新商品索引促销事件", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.UPDATE_GOODS_INDEX_PROMOTIONS.name(), JSONUtil.toJsonStr(map))); + } + } + + @Override + public boolean allowExistSame() { + return false; + } + + public void checkSamePromotions(T promotions) { + if (promotions.getStartTime() == null || promotions.getEndTime() == null) { + return; + } + QueryWrapper queryWrapper = PromotionTools.checkActiveTime(promotions.getStartTime(), promotions.getEndTime(), this.getPromotionType(), promotions.getStoreId(), promotions.getId()); + long sameNum = this.count(queryWrapper); + //当前时间段是否存在同类活动 + if (sameNum > 0) { + throw new ServiceException(ResultCode.PROMOTION_SAME_ACTIVE_EXIST); + } + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java new file mode 100644 index 00000000..03eedfa4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java @@ -0,0 +1,44 @@ +package cn.lili.modules.promotion.serviceimpl; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO; +import cn.lili.modules.promotion.mapper.CouponActivityItemMapper; +import cn.lili.modules.promotion.service.CouponActivityItemService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 优惠券活动关联优惠券业务层实现 + * + * @author Bulbasaur + * @since 2021/5/21 6:42 下午 + */ +@Service +public class CouponActivityItemServiceImpl extends ServiceImpl implements CouponActivityItemService { + + @Override + public List getCouponActivityList(String activityId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(CouponActivityItem::getActivityId, activityId); + return this.list(lambdaQueryWrapper); + } + + @Override + public List getCouponActivityItemListVO(String activityId) { + return this.baseMapper.getCouponActivityItemListVO(activityId); + } + + /** + * 根据优惠券id删除优惠活动关联信息项 + * + * @param couponIds 优惠券id集合 + */ + @Override + public void removeByCouponId(List couponIds) { + this.remove(new LambdaQueryWrapper() + .in(CouponActivityItem::getCouponId, couponIds)); + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java new file mode 100644 index 00000000..c818245a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java @@ -0,0 +1,403 @@ +package cn.lili.modules.promotion.serviceimpl; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.promotion.entity.dos.Coupon; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.dto.CouponActivityDTO; +import cn.lili.modules.promotion.entity.dto.CouponActivityTrigger; +import cn.lili.modules.promotion.entity.enums.*; +import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; +import cn.lili.modules.promotion.mapper.CouponActivityMapper; +import cn.lili.modules.promotion.service.*; +import cn.lili.modules.promotion.tools.PromotionTools; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import groovy.util.logging.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 优惠券活动业务层实现 + * + * @author Bulbasaur + * @since 2021/5/20 6:10 下午 + */ +@Slf4j +@Service +public class CouponActivityServiceImpl extends AbstractPromotionsServiceImpl implements CouponActivityService { + + @Autowired + private CouponService couponService; + @Autowired + private MemberCouponService memberCouponService; + @Autowired + private CouponActivityItemService couponActivityItemService; + + + @Autowired + private MemberCouponSignService memberCouponSignService; + + @Autowired + private MemberService memberService; + + + @Autowired + private Cache> cache; + + @Override + public CouponActivityVO getCouponActivityVO(String couponActivityId) { + CouponActivity couponActivity = this.getById(couponActivityId); + return new CouponActivityVO(couponActivity, couponActivityItemService.getCouponActivityItemListVO(couponActivityId)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void specify(CouponActivity couponActivity) { + //获取活动优惠券发送范围 + List> member = this.getMemberList(couponActivity); + + //如果指定会员发券,则当下直接进行发送,如果是全体会员发券,则变更为用户登录首页进行请求发券 + //PS:即不主动发券,需要用户在活动时间内登录自动领取优惠券,类似美团、饿了么 的发放方式 + if (couponActivity.getActivityScope().equals(CouponActivitySendTypeEnum.DESIGNATED.name())) { + //会员拆成多个小组进行发送 + List>> memberGroup = new ArrayList<>(); + + //循环分组 + for (int i = 0; i < (member.size() / 100 + (member.size() % 100 == 0 ? 0 : 1)); i++) { + int endPoint = Math.min((100 + (i * 100)), member.size()); + memberGroup.add(member.subList((i * 100), endPoint)); + } + + //优惠优惠券活动的优惠券列表 + List couponActivityItems = couponActivityItemService.getCouponActivityList(couponActivity.getId()); + //发送优惠券 + for (List> memberList : memberGroup) { + sendCoupon(memberList, couponActivityItems); + } + } + + } + + /** + * 初始化促销字段 + * + * @param promotions 促销实体 + */ + @Override + public void initPromotion(CouponActivity promotions) { + super.initPromotion(promotions); + if (promotions instanceof CouponActivityDTO) { + CouponActivityDTO couponActivityDTO = (CouponActivityDTO) promotions; + //如果有会员,则写入会员信息 + if (couponActivityDTO.getMemberDTOS() != null && !couponActivityDTO.getMemberDTOS().isEmpty()) { + couponActivityDTO.setActivityScopeInfo(JSONUtil.toJsonStr(couponActivityDTO.getMemberDTOS())); + } + } + } + + /** + * 检查优惠券活动参数 + * + * @param couponActivity 优惠券活动实体 + */ + @Override + public void checkPromotions(CouponActivity couponActivity) { + super.checkPromotions(couponActivity); + + if (couponActivity instanceof CouponActivityDTO) { + CouponActivityDTO couponActivityDTO = (CouponActivityDTO) couponActivity; + //指定会员判定 + if (couponActivity.getActivityScope().equals(CouponActivitySendTypeEnum.DESIGNATED.name()) && couponActivityDTO.getMemberDTOS().isEmpty()) { + throw new ServiceException(ResultCode.COUPON_ACTIVITY_MEMBER_ERROR); + } + // 检查优惠券 + this.checkCouponActivityItem(couponActivityDTO.getCouponActivityItems()); + } + + } + + /** + * 更新优惠券活动商品信息 + * + * @param couponActivity 优惠券活动实体 + * @return 是否更新成功 + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean updatePromotionsGoods(CouponActivity couponActivity) { + boolean result = super.updatePromotionsGoods(couponActivity); + if (couponActivity instanceof CouponActivityDTO && !PromotionsStatusEnum.CLOSE.name().equals(couponActivity.getPromotionStatus()) && PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(couponActivity.getScopeType())) { + CouponActivityDTO couponActivityDTO = (CouponActivityDTO) couponActivity; + //创建优惠券活动子列表 + for (CouponActivityItem couponActivityItem : couponActivityDTO.getCouponActivityItems()) { + couponActivityItem.setActivityId(couponActivityDTO.getId()); + } + // 更新优惠券活动项信息 + result = couponActivityItemService.saveBatch(couponActivityDTO.getCouponActivityItems()); + } + return result; + } + + /** + * 更新优惠券活动信息到商品索引 + * + * @param couponActivity 促销实体 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateEsGoodsIndex(CouponActivity couponActivity) { + + + switch (CouponActivityTypeEnum.valueOf(couponActivity.getCouponActivityType())) { + + // 精准发券 则立即发放 + case SPECIFY: + this.specify(couponActivity); + break; + //其他活动则是缓存模块,根据缓存中的优惠券活动信息来确认发放优惠券测略 + case INVITE_NEW: + case AUTO_COUPON: + case REGISTERED: + this.resetCache(couponActivity.getCouponActivityType()); + break; + } + + } + + @Override + public List trigger(CouponActivityTrigger couponActivityTrigger) { + //获取当前正在进行的优惠券活动 + List couponActivities = currentCouponActivity(couponActivityTrigger.getCouponActivityTypeEnum().name()); + + + /** + * 自动发送优惠券则需要补足日志 + */ + if (couponActivityTrigger.getCouponActivityTypeEnum().equals(CouponActivityTypeEnum.AUTO_COUPON)) { + couponActivities = memberCouponSignService.receiveCoupon(couponActivities); + } + + //优惠券发放列表 + List couponActivityItemVOS = new ArrayList<>(); + + //准备发放优惠券活动的列表 + couponActivities.stream().forEach(item -> couponActivityItemVOS.addAll(item.getCouponActivityItems())); + + AuthUser authUser = new AuthUser(); + authUser.setId(couponActivityTrigger.getUserId()); + authUser.setNickName(couponActivityTrigger.getNickName()); + + + return this.sendCoupon(authUser, couponActivityItemVOS); + } + + + /** + * 当前促销类型 + * + * @return 当前促销类型 + */ + @Override + public PromotionTypeEnum getPromotionType() { + return PromotionTypeEnum.COUPON_ACTIVITY; + } + + /** + * 缓存key生成策略 + * + * @param couponActivityType 优惠券活动类型 + * @return 缓存key + */ + private String cacheKey(String couponActivityType) { + return CachePrefix.CURRENT_COUPON_ACTIVITY.getPrefix() + couponActivityType; + } + + /** + * 当前进行的活动 + * + * @return 当前进行的活动列表 + */ + private List currentCouponActivity() { + return currentCouponActivity(CouponActivityTypeEnum.AUTO_COUPON.name()); + } + + /** + * 当前进行的活动 + * + * @return 当前进行的活动列表 + */ + private List currentCouponActivity(String couponActivityTypeEnum) { + //获取缓存中的活动 + List couponActivityList = cache.get(cacheKey(couponActivityTypeEnum)); + if (couponActivityList == null) { + return ongoingActivities(resetCache(couponActivityTypeEnum)); + } + return ongoingActivities(couponActivityList); + } + + /** + * 从生效的活动优惠券中,过滤出正在进行的活动列表 + * + * @param activityVOS + * @return + */ + private List ongoingActivities(List activityVOS) { + if (activityVOS == null || activityVOS.size() == 0) { + return new ArrayList<>(); + } + return activityVOS.stream().filter(item -> { + return item.getPromotionStatus().equals(PromotionsStatusEnum.START.name()); + }).collect(Collectors.toList()); + } + + /** + * 重写缓存中的活动优惠券信息 + */ + private List resetCache(String couponActivityType) { + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + + //如果结束时间大于当前时间,则表示有效 + lambdaQueryWrapper.gt(CouponActivity::getEndTime, new Date()); + //发送策略 + lambdaQueryWrapper.eq(CouponActivity::getActivityScope, CouponActivitySendTypeEnum.ALL); + //活动类型 + lambdaQueryWrapper.eq(CouponActivity::getCouponActivityType, couponActivityType); + + //查询出结果,缓存后返回 + List couponActivities = list(lambdaQueryWrapper); + + List couponActivityVOS = new ArrayList<>(); + for (CouponActivity couponActivity : couponActivities) { + couponActivityVOS.add(new CouponActivityVO(couponActivity, couponActivityItemService.getCouponActivityItemListVO(couponActivity.getId()))); + } + + cache.put(cacheKey(couponActivityType), couponActivityVOS); + return couponActivityVOS; + } + + /** + * 定向发送优惠券 + * + * @param memberList 用户列表 + * @param couponActivityItems 优惠券列表 + */ + private void sendCoupon(List> memberList, List couponActivityItems) { + + for (Map map : memberList) { + AuthUser authUser = new AuthUser(); + authUser.setId(map.get("id").toString()); + authUser.setNickName(map.get("nick_name").toString()); + + sendCoupon(authUser, couponActivityItems); + + } + } + + /** + * 给当前用户发送优惠券 + * 1.循环优惠券列表 + * 2.判断优惠券每个会员发送数量 + * 3.记录优惠券发送数量 + * + * @param authUser 发送目标用户 + * @param couponActivityItems 优惠券列表 + */ + private List sendCoupon(AuthUser authUser, List couponActivityItems) { + + //最终优惠券列表 + List finalCoupons = new ArrayList<>(); + + //循环优惠券赠送列表 + for (CouponActivityItem couponActivityItem : couponActivityItems) { + //获取优惠券 + Coupon coupon = couponService.getById(couponActivityItem.getCouponId()); + //判断优惠券是否存在 + if (coupon != null) { + //循环优惠券的领取数量 + int activitySendNum = couponActivityItem.getNum(); + + List memberCouponList = new ArrayList<>(); + for (int i = 1; i <= activitySendNum; i++) { + MemberCoupon memberCoupon = new MemberCoupon(coupon); + memberCoupon.setMemberId(authUser.getId()); + memberCoupon.setMemberName(authUser.getNickName()); + memberCoupon.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name()); + memberCoupon.setPlatformFlag(PromotionTools.PLATFORM_ID.equals(coupon.getStoreId())); + memberCouponList.add(memberCoupon); + } + + finalCoupons.addAll(memberCouponList); + //批量添加优惠券 + memberCouponService.saveBatch(memberCouponList); + //添加优惠券已领取数量 + couponService.receiveCoupon(couponActivityItem.getCouponId(), memberCouponList.size()); + } else { + log.error("赠送优惠券失败,当前优惠券不存在:" + couponActivityItem.getCouponId()); + } + } + if (finalCoupons.isEmpty()) { + return new ArrayList<>(); + } + return finalCoupons; + + } + + /** + * 获取优惠券的范围范围 + * 此方法用于精准发券 + * + * @param couponActivity 优惠券活动 + * @return 获取优惠券的会员列表 + */ + private List> getMemberList(CouponActivity couponActivity) { + //判断优惠券的发送范围,获取会员列表 + + List ids = new ArrayList<>(); + if (JSONUtil.isJsonArray(couponActivity.getActivityScopeInfo())) { + JSONArray array = JSONUtil.parseArray(couponActivity.getActivityScopeInfo()); + ids = array.toList(Map.class).stream().map(i -> i.get("id").toString()).collect(Collectors.toList()); + } + return memberService.listFieldsByMemberIds("id,nick_name", ids); + } + + /** + * 检查优惠券 + * + * @param couponActivityItems 优惠券列表 + */ + private void checkCouponActivityItem(List couponActivityItems) { + //优惠券数量判定 + if (couponActivityItems.isEmpty()) { + throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_ERROR); + } else if (couponActivityItems.size() > 10) { + throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_MUST_NUM_ERROR); + } else { + for (CouponActivityItem item : couponActivityItems) { + if (item.getNum() == null || item.getNum() <= 0) { + throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_NUM_ERROR); + } + if (item.getNum() > 2) { + throw new ServiceException(ResultCode.COUPON_ACTIVITY_ITEM_NUM_MAX_VALUE_2); + } + } + } + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java index b2f67ac3..88259b66 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java @@ -1,48 +1,37 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.delayqueue.DelayQueueTools; -import cn.lili.common.delayqueue.DelayQueueType; -import cn.lili.common.delayqueue.PromotionMessage; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.model.TimeExecuteConstant; -import cn.lili.common.trigger.model.TimeTriggerMsg; import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.FullDiscount; -import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.*; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.FullDiscountSearchParams; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum; +import cn.lili.modules.promotion.entity.enums.CouponTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.mapper.CouponMapper; -import cn.lili.modules.promotion.service.CouponService; -import cn.lili.modules.promotion.service.FullDiscountService; -import cn.lili.modules.promotion.service.MemberCouponService; -import cn.lili.modules.promotion.service.PromotionGoodsService; +import cn.lili.modules.promotion.service.*; import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.mybatis.util.PageUtil; 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 lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -50,173 +39,36 @@ import java.util.stream.Collectors; * 优惠券活动业务层实现 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class CouponServiceImpl extends ServiceImpl implements CouponService { - - //延时任务 - private final TimeTrigger timeTrigger; - //Mongo - private final MongoTemplate mongoTemplate; - //规格商品 - private GoodsSkuService goodsSkuService; - //Rocketmq - private RocketmqCustomProperties rocketmqCustomProperties; - //促销商品 - private PromotionGoodsService promotionGoodsService; - //会员优惠券 - private MemberCouponService memberCouponService; - //满额活动 - private FullDiscountService fullDiscountService; - - @Override - public CouponVO add(CouponVO coupon) { - // 检查参数 - this.checkParam(coupon); - coupon.setUsedNum(0); - coupon.setReceivedNum(0); - // 保存到MYSQL中 - this.save(coupon); - // 如果优惠券类型为部分商品则将促销活动商品更新 - this.updateScopePromotionGoods(coupon); - // 保存到MONGO中 - this.mongoTemplate.save(coupon); - PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime()); - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, - coupon.getStartTime().getTime(), - promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - rocketmqCustomProperties.getPromotionTopic()); - // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(coupon.getStartTime().getTime())); - return coupon; - } - - @Override - public CouponVO updateCoupon(CouponVO couponVO) { - CouponVO coupon = checkStatus(couponVO.getId()); - // 检查参数 - this.checkParam(couponVO); - // 更新到MYSQL中 - this.updateById(couponVO); - // 如果优惠券类型为部分商品则将促销活动商品更新 - this.updateScopePromotionGoods(couponVO); - // 保存到MONGO中 - this.mongoTemplate.save(couponVO); - PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime()); - // 更新延时任务 - this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, - promotionMessage, - coupon.getStartTime().getTime(), couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - DateUtil.getDelayTime(coupon.getStartTime().getTime()), - rocketmqCustomProperties.getPromotionTopic()); - return couponVO; - } - - @Override - public boolean updateCouponStatus(List couponId, PromotionStatusEnum promotionStatus) { - Query query = new Query(); - query.addCriteria(Criteria.where("id").in(couponId)); - List couponVOS = this.mongoTemplate.find(query, CouponVO.class); - couponVOS = couponVOS.parallelStream().filter(i -> Boolean.FALSE.equals(i.getDeleteFlag())).collect(Collectors.toList()); - if (couponVOS.isEmpty()) { - throw new ServiceException("优惠券不存在"); - } - for (CouponVO couponVO : couponVOS) { - if (promotionStatus.name().equals(PromotionStatusEnum.START.name())) { - this.checkParam(couponVO); - } - couponVO.setPromotionStatus(promotionStatus.name()); - this.updateById(couponVO); - this.mongoTemplate.save(couponVO); - if (promotionStatus.name().equals(PromotionStatusEnum.START.name())) { - PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), couponVO.getStartTime(), couponVO.getEndTime()); - // 更新延时任务 - this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, - promotionMessage, - couponVO.getStartTime().getTime(), couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - DateUtil.getDelayTime(couponVO.getStartTime().getTime()), - rocketmqCustomProperties.getPromotionTopic()); - } - } - return true; - } - - @Override - public boolean deleteCoupon(String id) { - CouponVO couponVO = checkStatus(id); - LambdaUpdateWrapper couponUpdateWrapper = new LambdaUpdateWrapper().eq(Coupon::getId, id).set(Coupon::getPromotionStatus, PromotionStatusEnum.CLOSE.name()).set(Coupon::getDeleteFlag, true); - // 更新优惠券状态为关闭,标示删除标志 - boolean result = this.update(couponUpdateWrapper); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper().eq(PromotionGoods::getPromotionId, id).set(PromotionGoods::getPromotionStatus, PromotionStatusEnum.CLOSE.name()).set(PromotionGoods::getDeleteFlag, true); - // 更新促销商品记录信息为删除 - this.promotionGoodsService.update(updateWrapper); - LambdaUpdateWrapper memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper().eq(MemberCoupon::getCouponId, id).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.CLOSED.name()); - memberCouponService.update(memberCouponLambdaUpdateWrapper); - this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), CouponVO.class); - this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, - couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())), - rocketmqCustomProperties.getPromotionTopic()); - return result; - } - - @Override - public IPage getCouponsByPageFromMongo(CouponSearchParams param, PageVO page) { - Query query = param.mongoQuery(); - IPage coupons = new Page<>(); - if (page != null) { - page.setNotConvert(true); - PromotionTools.mongoQueryPageParam(query, page); - coupons.setSize(page.getPageSize()); - coupons.setCurrent(page.getPageNumber()); - } - List couponVOList = mongoTemplate.find(query, CouponVO.class); - coupons.setRecords(couponVOList); - coupons.setTotal(mongoTemplate.count(query, CouponVO.class)); - return coupons; - } +public class CouponServiceImpl extends AbstractPromotionsServiceImpl implements CouponService { /** - * 根据查询条件从mongo中获取优惠券信息列表 - * - * @param param 查询参数 - * @param page 分页参数 - * @return 优惠券信息列表 + * 规格商品 */ - @Override - public IPage getCanReceiveCoupons(CouponSearchParams param, PageVO page) { - Query query = param.mongoQuery(); - query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); - query.addCriteria(Criteria.where("endTime").gte(new Date())); - IPage coupons = new Page<>(); - if (page != null) { - page.setNotConvert(true); - PromotionTools.mongoQueryPageParam(query, page); - coupons.setSize(page.getPageSize()); - coupons.setCurrent(page.getPageNumber()); - } - List couponVOList = mongoTemplate.find(query, CouponVO.class); - coupons.setRecords(couponVOList); - coupons.setTotal(mongoTemplate.count(query, CouponVO.class)); - return coupons; - } - - @Override - public CouponVO getCouponDetailFromMongo(String id) { - return mongoTemplate.findById(id, CouponVO.class); - } - - @Override - public IPage getCouponsByPage(CouponSearchParams param, PageVO page) { - QueryWrapper queryWrapper = param.wrapper(); - return page(PageUtil.initPage(page), queryWrapper); - } + @Autowired + private GoodsSkuService goodsSkuService; + /** + * 促销商品 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + /** + * 会员优惠券 + */ + @Autowired + private MemberCouponService memberCouponService; + /** + * 满额活动 + */ + @Autowired + private FullDiscountService fullDiscountService; + /** + * 优惠券活动-优惠券关联 + */ + @Autowired + private CouponActivityItemService couponActivityItemService; /** * 领取优惠券 @@ -226,13 +78,23 @@ public class CouponServiceImpl extends ServiceImpl impleme */ @Override public void receiveCoupon(String couponId, Integer receiveNum) { - CouponVO couponVO = checkStatus(couponId); - couponVO.setReceivedNum(couponVO.getReceivedNum() + receiveNum); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Coupon::getId, couponId); - updateWrapper.set(Coupon::getReceivedNum, couponVO.getReceivedNum()); - this.update(updateWrapper); - this.mongoTemplate.save(couponVO); + Coupon coupon = this.getById(couponId); + if (coupon == null) { + throw new ServiceException(ResultCode.COUPON_NOT_EXIST); + } + this.update(new LambdaUpdateWrapper().eq(Coupon::getId, coupon.getId()).set(Coupon::getReceivedNum, + coupon.getReceivedNum() + receiveNum)); + } + + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean removePromotions(List ids) { + //删除优惠券信息 + this.memberCouponService.closeMemberCoupon(ids); + + //删除优惠券活动关联优惠券 + this.couponActivityItemService.removeByCouponId(ids); + return super.removePromotions(ids); } /** @@ -243,46 +105,179 @@ public class CouponServiceImpl extends ServiceImpl impleme */ @Override public void usedCoupon(String couponId, Integer usedNum) { - CouponVO couponVO = checkStatus(couponId); - couponVO.setUsedNum(couponVO.getUsedNum() + usedNum); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Coupon::getId, couponId); - updateWrapper.set(Coupon::getUsedNum, couponVO.getUsedNum()); - this.update(updateWrapper); - this.mongoTemplate.save(couponVO); + Coupon coupon = this.getById(couponId); + if (coupon == null) { + throw new ServiceException(ResultCode.COUPON_NOT_EXIST); + } + + this.update(new LambdaUpdateWrapper().eq(Coupon::getId, coupon.getId()).set(Coupon::getUsedNum, + coupon.getUsedNum() + usedNum)); } /** - * 检查优惠券信息是否合法 + * 获取优惠券展示实体 * - * @param coupon 优惠券信息 + * @param searchParams 查询参数 + * @param page 分页参数 + * @return 优惠券展示实体列表 */ - private void checkParam(CouponVO coupon) { + @Override + public IPage pageVOFindAll(CouponSearchParams searchParams, PageVO page) { + IPage couponIPage = super.pageFindAll(searchParams, page); + List couponVOList = couponIPage.getRecords().stream().map(CouponVO::new).collect(Collectors.toList()); + return PageUtil.convertPage(couponIPage, couponVOList); + } + /** + * 获取优惠券展示详情 + * + * @param couponId 优惠券id + * @return 返回优惠券展示详情 + */ + @Override + public CouponVO getDetail(String couponId) { + CouponVO couponVO = new CouponVO(this.getById(couponId)); + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionId(couponId); + List promotionsByPromotionId = this.promotionGoodsService.listFindAll(searchParams); + if (promotionsByPromotionId != null && !promotionsByPromotionId.isEmpty()) { + couponVO.setPromotionGoodsList(promotionsByPromotionId); + } + return couponVO; + } + + /** + * 更新促销状态 + * 如果要更新促销状态为关闭,startTime和endTime置为空即可 + * + * @param ids 促销id集合 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 是否更新成功 + */ + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean updateStatus(List ids, Long startTime, Long endTime) { + List list = this.list(new LambdaQueryWrapper().in(Coupon::getId, ids).eq(Coupon::getRangeDayType, CouponRangeDayEnum.DYNAMICTIME.name())); + if (!list.isEmpty()) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(Coupon::getId, list.stream().map(Coupon::getId).collect(Collectors.toList())); + updateWrapper.set(Coupon::getEffectiveDays, 0); + this.update(updateWrapper); + } + + // 关闭优惠券,删除相关会员优惠券和券活动 + if (startTime == null && endTime == null) { + //删除优惠券信息 + this.memberCouponService.closeMemberCoupon(ids); + //删除优惠券活动关联优惠券 + this.couponActivityItemService.removeByCouponId(ids); + } + return super.updateStatus(ids, startTime, endTime); + } + + @Override + public void initPromotion(Coupon promotions) { + promotions.setUsedNum(0); + promotions.setReceivedNum(0); + } + + @Override + public void checkPromotions(Coupon coupon) { + if (coupon.getRangeDayType() == null) { + super.checkPromotions(coupon); + } + //优惠券限制领取数量 if (coupon.getCouponLimitNum() < 0) { - throw new ServiceException("领取限制数量不能为负数"); + throw new ServiceException(ResultCode.COUPON_LIMIT_NUM_LESS_THAN_0); + } + //如果发行数量是0则判断领取限制数量 + if (coupon.getPublishNum() != 0 && coupon.getCouponLimitNum() > coupon.getPublishNum()) { + throw new ServiceException(ResultCode.COUPON_LIMIT_GREATER_THAN_PUBLISH); + } + //打折优惠券大于10折 + boolean discountCoupon = (coupon.getCouponType().equals(CouponTypeEnum.DISCOUNT.name()) + && (coupon.getCouponDiscount() < 0 || coupon.getCouponDiscount() > 10)); + if (discountCoupon) { + throw new ServiceException(ResultCode.COUPON_DISCOUNT_ERROR); } - if (coupon.getCouponLimitNum() > coupon.getPublishNum()) { - throw new ServiceException("领取限制数量超出发行数量"); + //如果优惠券使用时间类型不合法,抛出异常,抛出异常 + if (!CouponRangeDayEnum.exist(coupon.getRangeDayType())) { + throw new ServiceException(ResultCode.COUPON_RANGE_ERROR); } - if (coupon.getCouponType().equals(CouponTypeEnum.PRICE.name()) && coupon.getPrice() > coupon.getConsumeThreshold()) { - throw new ServiceException("优惠券面额必须小于优惠券消费限额"); - } else if (coupon.getCouponType().equals(CouponTypeEnum.DISCOUNT.name()) && (coupon.getCouponDiscount() < 0 && coupon.getCouponDiscount() > 10)) { - throw new ServiceException("优惠券折扣必须小于10且大于0"); + switch (CouponRangeDayEnum.valueOf(coupon.getRangeDayType())) { + case FIXEDTIME: + //如果优惠券为固定时间,则开始结束时间不能为空 + if (coupon.getEndTime() == null || coupon.getStartTime() == null) { + throw new ServiceException(ResultCode.PROMOTION_TIME_ERROR); + } + long nowTime = DateUtil.getDateline() * 1000; + //固定时间的优惠券不能小于当前时间 + if (coupon.getEndTime().getTime() < nowTime) { + throw new ServiceException(ResultCode.PROMOTION_END_TIME_ERROR); + } + break; + case DYNAMICTIME: + //固定时间的优惠券不能小于当前时间 + if (coupon.getEffectiveDays() == null || coupon.getEffectiveDays() < 0) { + throw new ServiceException(ResultCode.PROMOTION_END_TIME_ERROR); + } + break; } - long nowTime = DateUtil.getDateline() * 1000; - if (coupon.getStartTime().getTime() < nowTime && coupon.getEndTime().getTime() > nowTime) { - throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作"); + + this.checkCouponScope((CouponVO) coupon); + } + + @Override + public void checkStatus(Coupon promotions) { + super.checkStatus(promotions); + FullDiscountSearchParams searchParams = new FullDiscountSearchParams(); + searchParams.setCouponFlag(true); + searchParams.setCouponId(promotions.getId()); + searchParams.setPromotionStatus(PromotionsStatusEnum.START.name()); + List fullDiscounts = fullDiscountService.listFindAll(searchParams); + if (fullDiscounts != null && !fullDiscounts.isEmpty()) { + throw new ServiceException("当前优惠券参与了促销活动【" + fullDiscounts.get(0).getPromotionName() + "】不能进行编辑删除操作"); } + } - PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime()); + @Override + @Transactional(rollbackFor = {Exception.class}) + public boolean updatePromotionsGoods(Coupon promotions) { + boolean result = super.updatePromotionsGoods(promotions); + if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus()) && + PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType()) && + promotions instanceof CouponVO) { + CouponVO couponVO = (CouponVO) promotions; + this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId())); + List promotionGoodsList = PromotionTools.promotionGoodsInit(couponVO.getPromotionGoodsList(), couponVO, this.getPromotionType()); + for (PromotionGoods promotionGoods : promotionGoodsList) { + promotionGoods.setStoreId(promotions.getStoreId()); + promotionGoods.setStoreName(promotions.getStoreName()); + } + //促销活动商品更新 + result = this.promotionGoodsService.saveBatch(promotionGoodsList); + } + return result; + } - this.checkCouponScope(coupon); - //对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态 - this.promotionStatusEmpty(coupon); + /** + * 更新商品索引优惠券信息 + * + * @param promotions 优惠券信息 + */ + @Override + public void updateEsGoodsIndex(Coupon promotions) { + Coupon coupon = JSONUtil.parse(promotions).toBean(Coupon.class); + super.updateEsGoodsIndex(coupon); + } + + @Override + public PromotionTypeEnum getPromotionType() { + return PromotionTypeEnum.COUPON; } /** @@ -291,106 +286,39 @@ public class CouponServiceImpl extends ServiceImpl impleme * @param coupon 检查的优惠券对象 */ private void checkCouponScope(CouponVO coupon) { - if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name()) && (coupon.getPromotionGoodsList() == null || coupon.getPromotionGoodsList().isEmpty())) { - throw new ServiceException("当前关联范围类型为指定商品时,商品列表不能为空"); - } else if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { - throw new ServiceException("当前关联范围类型为指定商品时,范围关联的id不能为空"); - } else if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { - throw new ServiceException("当前关联范围类型为部分商品分类时,范围关联的id不能为空"); - } else if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_SHOP_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { - throw new ServiceException("当前关联范围类型为部分店铺分类时,范围关联的id不能为空"); + boolean portionGoodsScope = (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name()) + && (coupon.getPromotionGoodsList() == null || coupon.getPromotionGoodsList().isEmpty())); + if (portionGoodsScope) { + throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_GOODS_ERROR); + } else if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { + throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_GOODS_ERROR); + } else if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { + throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_CATEGORY_ERROR); + } else if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_SHOP_CATEGORY.name()) && CharSequenceUtil.isEmpty(coupon.getScopeId())) { + throw new ServiceException(ResultCode.COUPON_SCOPE_TYPE_STORE_ERROR); } - if (coupon.getScopeType().equals(CouponScopeTypeEnum.PORTION_GOODS.name())) { - String[] split = coupon.getScopeId().split(","); - if (split.length <= 0) { - throw new ServiceException("指定商品范围关联id无效!"); - } - for (String id : split) { - GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(id); - if (goodsSku == null) { - throw new ServiceException("商品已下架"); - } - } + if (coupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) { + this.checkCouponPortionGoods(coupon); } } /** - * 对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态 + * 检查指定商品 * - * @param coupon 优惠券参数 + * @param coupon 优惠券信息 */ - private void promotionStatusEmpty(CouponVO coupon) { - if (StringUtils.isEmpty(coupon.getPromotionStatus())) { - //格式时间 - long startTme = coupon.getStartTime().getTime() / 1000; - long endTime = coupon.getEndTime().getTime() / 1000; - //校验时间确定当前优惠券有效期 - long currentTime = DateUtil.getDateline(); - //如果未到时间点则为新建 - if (startTme > currentTime) { - coupon.setPromotionStatus(PromotionStatusEnum.NEW.name()); - } - //如果超过结束时间则为结束 - if (endTime < currentTime) { - coupon.setPromotionStatus(PromotionStatusEnum.END.name()); - } - //如果在使用时间内 则是开始状态 - if (startTme <= currentTime && endTime > currentTime) { - coupon.setPromotionStatus(PromotionStatusEnum.START.name()); + private void checkCouponPortionGoods(CouponVO coupon) { + String[] split = coupon.getScopeId().split(","); + if (split.length == 0) { + throw new ServiceException(ResultCode.COUPON_SCOPE_ERROR); + } + for (String id : split) { + GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(id); + if (goodsSku == null) { + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); } } } - /** - * 检查优惠券状态是否可进行编辑删除 - * - * @param id 优惠券id - * @return 优惠券信息 - */ - private CouponVO checkStatus(String id) { - CouponVO coupon = this.mongoTemplate.findById(id, CouponVO.class); - if (coupon == null) { - throw new ServiceException("当前优惠券活动不存在"); - } - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(FullDiscount::getIsCoupon, true).eq(FullDiscount::getCouponId, id); - FullDiscount fullDiscount = fullDiscountService.getOne(queryWrapper); - if (fullDiscount != null) { - throw new ServiceException("当前优惠券参与了促销活动 " + fullDiscount.getTitle() + " 不能进行编辑删除操作"); - } - return coupon; - } - - private void updateScopePromotionGoods(CouponVO couponVO) { - // 如果优惠券类型为部分商品则将促销活动更新至ES中 - if (CouponScopeTypeEnum.PORTION_GOODS.name().equals(couponVO.getScopeType()) && !couponVO.getPromotionGoodsList().isEmpty()) { - PromotionTools.promotionGoodsInit(couponVO.getPromotionGoodsList(), couponVO, PromotionTypeEnum.COUPON); - } - } - - @Autowired - public void setGoodsSkuService(GoodsSkuService goodsSkuService) { - this.goodsSkuService = goodsSkuService; - } - - @Autowired - public void setRocketmqCustomProperties(RocketmqCustomProperties rocketmqCustomProperties) { - this.rocketmqCustomProperties = rocketmqCustomProperties; - } - - @Autowired - public void setPromotionGoodsService(PromotionGoodsService promotionGoodsService) { - this.promotionGoodsService = promotionGoodsService; - } - - @Autowired - public void setMemberCouponService(MemberCouponService memberCouponService) { - this.memberCouponService = memberCouponService; - } - - @Autowired - public void setFullDiscountService(FullDiscountService fullDiscountService) { - this.fullDiscountService = fullDiscountService; - } - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java index ad59314b..9cf4f520 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java @@ -1,163 +1,67 @@ package cn.lili.modules.promotion.serviceimpl; -import cn.lili.common.delayqueue.DelayQueueTools; -import cn.lili.common.delayqueue.DelayQueueType; -import cn.lili.common.delayqueue.PromotionMessage; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.model.TimeExecuteConstant; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.FullDiscount; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.mapper.FullDiscountMapper; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.FullDiscountService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.tools.PromotionTools; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** * 满优惠业务层实现 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class FullDiscountServiceImpl extends ServiceImpl implements FullDiscountService { +public class FullDiscountServiceImpl extends AbstractPromotionsServiceImpl implements FullDiscountService { - private static final String SELLER_ID_COLUMN = "storeId"; - private static final String PROMOTION_STATUS_COLUMN = "promotionStatus"; - //延时任务 - private final TimeTrigger timeTrigger; - //Mongo - private final MongoTemplate mongoTemplate; - //满额活动 - private final FullDiscountMapper fullDiscountMapper; - //Rocketmq - private final RocketmqCustomProperties rocketmqCustomProperties; - //优惠券 + /** + * 优惠券 + */ + @Autowired private CouponService couponService; - //促销商品 + /** + * 促销商品 + */ + @Autowired private PromotionGoodsService promotionGoodsService; - @Override - public FullDiscountVO currentPromotion(String storeId) { - Query query = this.getMongoQuery(); - query.addCriteria(Criteria.where(SELLER_ID_COLUMN).is(storeId)); - return mongoTemplate.findOne(query, FullDiscountVO.class); - } - @Override public List currentPromotion(List storeId) { - Query query = this.getMongoQuery(); - query.addCriteria(Criteria.where(SELLER_ID_COLUMN).in(storeId)); - return mongoTemplate.find(query, FullDiscountVO.class); - } - - @Override - public FullDiscount addFullDiscount(FullDiscountVO fullDiscountVO) { - // 验证是否是有效参数 - PromotionTools.paramValid(fullDiscountVO.getStartTime().getTime(), fullDiscountVO.getEndTime().getTime(), fullDiscountVO.getNumber(), fullDiscountVO.getPromotionGoodsList()); - // 当前时间段是否存在同类活动 - this.checkSameActiveExist(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getStoreId(), null); - // 检查满减参数 - this.checkFullDiscount(fullDiscountVO); - // 保存到MYSQL中 - this.save(fullDiscountVO); - if (fullDiscountVO.getPromotionGoodsList() != null) { - List promotionGoodsList = PromotionTools.promotionGoodsInit(fullDiscountVO.getPromotionGoodsList(), fullDiscountVO, PromotionTypeEnum.FULL_DISCOUNT); - // 促销活动商品更新 - this.promotionGoodsService.saveOrUpdateBatch(promotionGoodsList); + List result = new ArrayList<>(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in(storeId != null && !storeId.isEmpty(), "store_id", storeId); + queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)); + List list = this.list(queryWrapper); + if (list != null) { + for (FullDiscount fullDiscount : list) { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionId(fullDiscount.getId()); + FullDiscountVO fullDiscountVO = new FullDiscountVO(fullDiscount); + fullDiscountVO.setPromotionGoodsList(promotionGoodsService.listFindAll(searchParams)); + result.add(fullDiscountVO); + } } - // 保存到MONGO中 - this.mongoTemplate.save(fullDiscountVO); - PromotionMessage promotionMessage = new PromotionMessage(fullDiscountVO.getId(), PromotionTypeEnum.FULL_DISCOUNT.name(), PromotionStatusEnum.START.name(), fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime()); - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, - fullDiscountVO.getStartTime().getTime(), promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - rocketmqCustomProperties.getPromotionTopic()); - // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(fullDiscountVO.getStartTime().getTime())); - return fullDiscountVO; - } - - public IPage getFullDiscountByPageFromMysql(FullDiscountSearchParams searchParams, PageVO page) { - QueryWrapper queryWrapper = searchParams.wrapper(); - return this.page(PageUtil.initPage(page), queryWrapper); - } - - @Override - public IPage getFullDiscountByPageFromMongo(FullDiscountSearchParams searchParams, PageVO page) { - IPage fullDiscountIPage = new Page<>(); - Query query = searchParams.mongoQuery(); - if (page != null) { - PromotionTools.mongoQueryPageParam(query, page); - fullDiscountIPage.setCurrent(page.getPageNumber()); - fullDiscountIPage.setSize(page.getPageSize()); - } - List fullDiscountVOS = this.mongoTemplate.find(query, FullDiscountVO.class); - fullDiscountIPage.setRecords(fullDiscountVOS); - fullDiscountIPage.setTotal(this.mongoTemplate.count(query, FullDiscountVO.class)); - return fullDiscountIPage; - } - - @Override - public FullDiscountVO modifyFullDiscount(FullDiscountVO fullDiscountVO) { - // 检查满优惠活动是否存在 - FullDiscountVO fullDiscount = this.checkFullDiscountExist(fullDiscountVO.getId()); - if (!fullDiscount.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) { - throw new ServiceException("当前编辑的满优惠活动已经开始或者已经结束,无法修改"); - } - // 检查活动是否已经开始 - PromotionTools.checkPromotionTime(fullDiscountVO.getStartTime().getTime(), fullDiscountVO.getEndTime().getTime()); - // 检查满减参数 - this.checkFullDiscount(fullDiscountVO); - // 时间发生变化 - if (!fullDiscount.getStartTime().equals(fullDiscountVO.getStartTime()) && fullDiscount.getEndTime().equals(fullDiscountVO.getEndTime())) { - // 检查当前时间段是否存在同类活动 - this.checkSameActiveExist(fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime(), fullDiscountVO.getStoreId(), fullDiscount.getId()); - - } - // 更新到MYSQL中 - this.updateById(fullDiscountVO); - if (fullDiscountVO.getPromotionGoodsList() != null) { - // 促销活动商品更新 - this.promotionGoodsService.updateBatchById(PromotionTools.promotionGoodsInit(fullDiscountVO.getPromotionGoodsList(), fullDiscountVO, PromotionTypeEnum.FULL_DISCOUNT)); - } - // 保存到MONGO中 - this.mongoTemplate.save(fullDiscountVO); - PromotionMessage promotionMessage = new PromotionMessage(fullDiscountVO.getId(), PromotionTypeEnum.FULL_DISCOUNT.name(), PromotionStatusEnum.START.name(), fullDiscountVO.getStartTime(), fullDiscountVO.getEndTime()); - // 发送更新延时任务 - this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage, - fullDiscount.getStartTime().getTime(), fullDiscountVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - DateUtil.getDelayTime(fullDiscountVO.getStartTime().getTime()), - rocketmqCustomProperties.getPromotionTopic()); - return fullDiscountVO; + return result; } /** @@ -168,22 +72,75 @@ public class FullDiscountServiceImpl extends ServiceImpl promotionGoodsList = + PromotionTools.promotionGoodsInit(fullDiscountVO.getPromotionGoodsList(), fullDiscountVO, + PromotionTypeEnum.FULL_DISCOUNT); + this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId())); + //促销活动商品更新 + result = this.promotionGoodsService.saveBatch(promotionGoodsList); } - this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, fullDiscount.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.FULL_DISCOUNT.name() + fullDiscount.getId())), - rocketmqCustomProperties.getPromotionTopic()); return result; + + } + + /** + * 更新促销信息到商品索引 + * + * @param promotions 促销实体 + */ + @Override + public void updateEsGoodsIndex(FullDiscount promotions) { + FullDiscount fullDiscount = JSONUtil.parse(promotions).toBean(FullDiscount.class); + super.updateEsGoodsIndex(fullDiscount); + } + + /** + * 当前促销类型 + * + * @return 当前促销类型 + */ + @Override + public PromotionTypeEnum getPromotionType() { + return PromotionTypeEnum.FULL_DISCOUNT; } /** @@ -192,80 +149,66 @@ public class FullDiscountServiceImpl extends ServiceImpl queryWrapper = PromotionTools.checkActiveTime(statTime, endTime, PromotionTypeEnum.FULL_DISCOUNT, storeId, id); - Integer sameNum = this.fullDiscountMapper.selectCount(queryWrapper); - if (sameNum > 0) { - throw new ServiceException("当前时间内已存在同类活动"); - } - } - /** * 检查优惠券信息 * * @param couponId 优惠券编号 - * @param endTime 活动结束时间 */ - private void checkCoupon(String couponId, long endTime) { - // 是否没有选择优惠券 + private void checkCoupon(String couponId) { + //是否没有选择优惠券 boolean noCouponSelected = couponId == null; if (noCouponSelected) { - throw new ServiceException("请选择优惠券"); + throw new ServiceException(ResultCode.COUPON_NOT_EXIST); } Coupon coupon = this.couponService.getById(couponId); - if (coupon.getEndTime().getTime() < endTime) { - throw new ServiceException("赠送的优惠券有效时间必须大于活动时间"); + if (coupon == null) { + throw new ServiceException(ResultCode.COUPON_NOT_EXIST); } } @@ -276,13 +219,13 @@ public class FullDiscountServiceImpl extends ServiceImpl fullMoney) { - throw new ServiceException("满减金额不能大于优惠门槛"); + throw new ServiceException(ResultCode.FULL_DISCOUNT_MONEY_GREATER_THAN_MINUS); } } @@ -292,39 +235,14 @@ public class FullDiscountServiceImpl extends ServiceImpl= rateLimit || fullRate <= 0) { - throw new ServiceException("请填写打折数值"); + throw new ServiceException(ResultCode.FULL_RATE_NUM_ERROR); } } - - /** - * 通用有效的满优惠活动mongo查询 - * - * @return mongo查询对象 - */ - private Query getMongoQuery() { - Query query = new Query(); - Date now = new Date(); - query.addCriteria(Criteria.where(PROMOTION_STATUS_COLUMN).is(PromotionStatusEnum.START.name())); - query.addCriteria(Criteria.where("startTime").lt(now)); - query.addCriteria(Criteria.where("endTime").gt(now)); - return query; - } - - @Autowired - public void setPromotionGoodsService(PromotionGoodsService promotionGoodsService) { - this.promotionGoodsService = promotionGoodsService; - } - - @Autowired - public void setCouponService(CouponService couponService) { - this.couponService = couponService; - } - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java new file mode 100644 index 00000000..6dd7cbbe --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java @@ -0,0 +1,291 @@ +package cn.lili.modules.promotion.serviceimpl; + + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityGoodsParams; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO; +import cn.lili.modules.promotion.mapper.KanJiaActivityGoodsMapper; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.PromotionGoodsService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/** + * 砍价业务层实现 + * + * @author qiuqiu + * @since 2021/7/1 + */ +@Service +public class KanjiaActivityGoodsServiceImpl extends AbstractPromotionsServiceImpl implements KanjiaActivityGoodsService { + + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + + @Autowired + private PromotionGoodsService promotionGoodsService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean add(KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) { + List kanjiaActivityGoodsList = new ArrayList<>(); + List promotionGoodsList = new ArrayList<>(); + for (KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) { + //根据skuId查询商品信息 + GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId()); + //参数检测 + this.checkParam(kanJiaActivityGoodsDTO, goodsSku); + //检测同一时间段是否存在相同的商品 + PromotionTools.checkPromotionTime(kanJiaActivityGoodsOperationDTO.getStartTime(), kanJiaActivityGoodsOperationDTO.getEndTime()); + kanJiaActivityGoodsDTO.setStartTime(kanJiaActivityGoodsOperationDTO.getStartTime()); + kanJiaActivityGoodsDTO.setEndTime(kanJiaActivityGoodsOperationDTO.getEndTime()); + //检测同一时间段不能允许添加相同的商品 + if (this.checkSkuDuplicate(kanJiaActivityGoodsDTO) != null) { + throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!"); + } + kanJiaActivityGoodsDTO.setGoodsSku(goodsSku); + kanJiaActivityGoodsDTO.setGoodsId(goodsSku.getGoodsId()); + kanJiaActivityGoodsDTO.setSkuId(kanJiaActivityGoodsDTO.getSkuId()); + kanJiaActivityGoodsDTO.setThumbnail(goodsSku.getThumbnail()); + kanJiaActivityGoodsDTO.setGoodsName(goodsSku.getGoodsName()); + kanJiaActivityGoodsDTO.setOriginalPrice(goodsSku.getPrice()); + kanJiaActivityGoodsDTO.setScopeId(goodsSku.getId()); + kanjiaActivityGoodsList.add(kanJiaActivityGoodsDTO); + } + boolean result = this.saveBatch(kanjiaActivityGoodsList); + if (result) { + for (KanjiaActivityGoods kanjiaActivityGoods : kanjiaActivityGoodsList) { + PromotionGoods promotionGoods = new PromotionGoods(); + BeanUtils.copyProperties(kanjiaActivityGoods, promotionGoods); + promotionGoods.setQuantity(kanjiaActivityGoods.getStock()); + promotionGoods.setPromotionId(kanjiaActivityGoods.getId()); + promotionGoods.setPromotionType(PromotionTypeEnum.KANJIA.name()); + promotionGoods.setTitle(PromotionTypeEnum.KANJIA.name() + "-" + kanjiaActivityGoods.getGoodsName()); + promotionGoods.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name()); + promotionGoods.setScopeId(kanjiaActivityGoods.getSkuId()); + promotionGoods.setPromotionType(PromotionTypeEnum.KANJIA.name()); + promotionGoodsList.add(promotionGoods); + } + boolean saveBatch = this.promotionGoodsService.saveBatch(promotionGoodsList); + if (saveBatch) { + for (KanjiaActivityGoods kanjiaActivityGoods : kanjiaActivityGoodsList) { + this.updateEsGoodsIndex(kanjiaActivityGoods); + } + } + } + + return result; + } + + + @Override + public IPage kanjiaGoodsVOPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO pageVO) { + return this.baseMapper.kanjiaActivityGoodsVOPage(PageUtil.initPage(pageVO), kanjiaActivityGoodsParams.queryWrapper()); + } + + + /** + * 检查商品Sku是否存 + * + * @param skuId skuId + * @return 商品sku + */ + private GoodsSku checkSkuExist(String skuId) { + GoodsSku goodsSku = this.goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(skuId); + if (goodsSku == null) { + log.error("商品ID为" + skuId + "的商品不存在!"); + throw new ServiceException(); + } + return goodsSku; + } + + /** + * 检查参与砍价商品参数 + * + * @param kanJiaActivityGoodsDTO 砍价商品信息 + * @param goodsSku 商品sku信息 + */ + private void checkParam(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO, GoodsSku goodsSku) { + //校验商品是否存在 + if (goodsSku == null) { + throw new ServiceException(ResultCode.PROMOTION_GOODS_NOT_EXIT); + } + //校验商品状态 + if (goodsSku.getMarketEnable().equals(GoodsStatusEnum.DOWN.name())) { + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); + } + //校验活动库存是否超出此sku的库存 + if (goodsSku.getQuantity() < kanJiaActivityGoodsDTO.getStock()) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_STOCK_ERROR); + } + //校验最低购买金额不能高于商品金额 + if (goodsSku.getPrice() < kanJiaActivityGoodsDTO.getPurchasePrice()) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_PRICE_ERROR); + } + //校验结算价格不能超过商品金额 + if (goodsSku.getPrice() < kanJiaActivityGoodsDTO.getSettlementPrice()) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR); + } + //校验最高砍价金额 + if (kanJiaActivityGoodsDTO.getHighestPrice() > goodsSku.getPrice() || kanJiaActivityGoodsDTO.getHighestPrice() <= 0) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_HIGHEST_PRICE_ERROR); + } + //校验最低砍价金额 + if (kanJiaActivityGoodsDTO.getLowestPrice() > goodsSku.getPrice() || kanJiaActivityGoodsDTO.getLowestPrice() <= 0) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR); + } + //校验最低砍价金额不能高与最低砍价金额 + if (kanJiaActivityGoodsDTO.getLowestPrice() > kanJiaActivityGoodsDTO.getHighestPrice()) { + throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR); + } + } + + /** + * 检查砍价商品是否重复存在 + * + * @param kanJiaActivityGoodsDTO 砍价商品 + * @return 积分商品信息 + */ + private KanjiaActivityGoods checkSkuDuplicate(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("sku_id", kanJiaActivityGoodsDTO.getSkuId()); + if (kanJiaActivityGoodsDTO != null && CharSequenceUtil.isNotEmpty(kanJiaActivityGoodsDTO.getId())) { + queryWrapper.ne("id", kanJiaActivityGoodsDTO.getId()); + } + queryWrapper.and(i -> i + .or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)) + .or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW))); + + if (kanJiaActivityGoodsDTO != null && kanJiaActivityGoodsDTO.getStartTime() != null) { + queryWrapper.ge("start_time", kanJiaActivityGoodsDTO.getStartTime()); + } + + if (kanJiaActivityGoodsDTO != null && kanJiaActivityGoodsDTO.getEndTime() != null) { + queryWrapper.le("end_time", kanJiaActivityGoodsDTO.getEndTime()); + } + + return this.getOne(queryWrapper); + + } + + @Override + public KanjiaActivityGoodsDTO getKanjiaGoodsDetail(String goodsId) { + KanjiaActivityGoods kanjiaActivityGoods = this.getById(goodsId); + if (kanjiaActivityGoods == null) { + log.error("id为" + goodsId + "的砍价商品不存在!"); + throw new ServiceException(); + } + KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = new KanjiaActivityGoodsDTO(); + BeanUtils.copyProperties(kanjiaActivityGoods, kanjiaActivityGoodsDTO); + GoodsSku goodsSku = this.goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(kanjiaActivityGoods.getSkuId()); + if (goodsSku != null) { + kanjiaActivityGoodsDTO.setGoodsSku(goodsSku); + } + return kanjiaActivityGoodsDTO; + } + + @Override + public KanjiaActivityGoods getKanjiaGoodsBySkuId(String skuId) { + KanjiaActivityGoods kanjiaActivityGoods = this.getOne( + new LambdaQueryWrapper() + .eq(KanjiaActivityGoods::getSkuId, skuId) + .ge(KanjiaActivityGoods::getEndTime, new Date()) + .le(KanjiaActivityGoods::getStartTime, new Date())); + if (kanjiaActivityGoods != null && PromotionsStatusEnum.START.name().equals(kanjiaActivityGoods.getPromotionStatus())) { + return kanjiaActivityGoods; + } + return null; + } + + @Override + public KanjiaActivityGoodsVO getKanJiaGoodsVO(String id) { + + KanjiaActivityGoodsVO kanJiaActivityGoodsVO = new KanjiaActivityGoodsVO(); + //获取砍价商品 + KanjiaActivityGoods kanJiaActivityGoods = this.getById(id); + //获取商品SKU + GoodsSku goodsSku = this.goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId()); + //填写活动商品价格、剩余数量 + kanJiaActivityGoodsVO.setGoodsSku(goodsSku); + kanJiaActivityGoodsVO.setStock(kanJiaActivityGoods.getStock()); + kanJiaActivityGoodsVO.setPurchasePrice(kanJiaActivityGoods.getPurchasePrice()); + //返回商品数据 + return kanJiaActivityGoodsVO; + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateKanjiaActivityGoods(KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { + //校验砍价商品是否存在 + KanjiaActivityGoods dbKanJiaActivityGoods = this.getKanjiaGoodsDetail(kanJiaActivityGoodsDTO.getId()); + //校验当前活动是否已经开始,只有新建的未开始的活动可以编辑 + if (!dbKanJiaActivityGoods.getPromotionStatus().equals(PromotionsStatusEnum.NEW.name())) { + throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR); + } + //获取当前sku信息 + GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId()); + //校验商品状态 + if (goodsSku.getMarketEnable().equals(GoodsStatusEnum.DOWN.name())) { + throw new ServiceException(ResultCode.GOODS_NOT_EXIST); + } + //常规校验砍价商品参数 + this.checkParam(kanJiaActivityGoodsDTO, goodsSku); + //检测开始结束时间是否正确 + PromotionTools.checkPromotionTime(kanJiaActivityGoodsDTO.getStartTime(), kanJiaActivityGoodsDTO.getEndTime()); + //检测同一时间段不能允许添加相同的商品 + if (this.checkSkuDuplicate(kanJiaActivityGoodsDTO) != null) { + throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!"); + } + this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(kanJiaActivityGoodsDTO.getId())); + PromotionGoods promotionGoods = new PromotionGoods(kanJiaActivityGoodsDTO); + this.promotionGoodsService.save(promotionGoods); + this.updateEsGoodsIndex(kanJiaActivityGoodsDTO); + //修改数据库 + return this.updateById(kanJiaActivityGoodsDTO); + } + + @Override + public void deleteByGoodsIds(List goodsIds) { + this.remove(new LambdaQueryWrapper().in(KanjiaActivityGoods::getGoodsId, goodsIds)); + } + + /** + * 当前促销类型 + * + * @return 当前促销类型 + */ + @Override + public PromotionTypeEnum getPromotionType() { + return PromotionTypeEnum.KANJIA; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityLogServiceImpl.java new file mode 100644 index 00000000..0c98ca07 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityLogServiceImpl.java @@ -0,0 +1,80 @@ +package cn.lili.modules.promotion.serviceimpl; + + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; +import cn.lili.modules.promotion.entity.dto.search.KanJiaActivityLogQuery; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.mapper.KanJiaActivityLogMapper; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityLogService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +/** + * 砍价活动日志业务层实现 + * + * @author qiuqiu + * @date 2021/7/1 + */ +@Service +public class KanjiaActivityLogServiceImpl extends ServiceImpl implements KanjiaActivityLogService { + + @Autowired + private KanjiaActivityGoodsService kanJiaActivityGoodsService; + + @Autowired + private KanjiaActivityService kanJiaActivityService; + + @Override + public IPage getForPage(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO pageVO) { + QueryWrapper queryWrapper = kanJiaActivityLogQuery.wrapper(); + return this.page(PageUtil.initPage(pageVO), queryWrapper); + } + + + @Override + public KanjiaActivityLog addKanJiaActivityLog(KanjiaActivityDTO kanjiaActivityDTO) { + //校验当前会员是否已经参与过此次砍价 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(kanjiaActivityDTO.getKanjiaActivityId() != null, KanjiaActivityLog::getKanjiaActivityId, kanjiaActivityDTO.getKanjiaActivityId()); + queryWrapper.eq( KanjiaActivityLog::getKanjiaMemberId, UserContext.getCurrentUser().getId()); + long count = this.baseMapper.selectCount(queryWrapper); + if (count > 0) { + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_LOG_MEMBER_ERROR); + } + //校验当前砍价商品是否有效 + KanjiaActivityGoods kanjiaActivityGoods = kanJiaActivityGoodsService.getById(kanjiaActivityDTO.getKanjiaActivityGoodsId()); + //如果当前活动不为空且还在活动时间内 才可以参与砍价活动 + if (kanjiaActivityGoods != null && kanjiaActivityGoods.getPromotionStatus().equals(PromotionsStatusEnum.START.name())) { + //获取砍价参与者记录 + KanjiaActivity kanjiaActivity = kanJiaActivityService.getById(kanjiaActivityDTO.getKanjiaActivityId()); + if (kanjiaActivity != null) { + KanjiaActivityLog kanJiaActivityLog = new KanjiaActivityLog(); + kanJiaActivityLog.setKanjiaActivityId(kanjiaActivity.getId()); + BeanUtil.copyProperties(kanjiaActivityDTO, kanJiaActivityLog); + boolean result = this.save(kanJiaActivityLog); + if (result) { + return kanJiaActivityLog; + } + } + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_FOUND_ERROR); + } + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityServiceImpl.java new file mode 100644 index 00000000..b20d75ab --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityServiceImpl.java @@ -0,0 +1,237 @@ +package cn.lili.modules.promotion.serviceimpl; + + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.RandomUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.promotion.entity.dos.KanjiaActivity; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityDTO; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityQuery; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams; +import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; +import cn.lili.modules.promotion.mapper.KanJiaActivityMapper; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.KanjiaActivityLogService; +import cn.lili.modules.promotion.service.KanjiaActivityService; +import cn.lili.mybatis.util.PageUtil; +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.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Objects; + + +/** + * 砍价活动参与记录业务层实现 + * + * @author qiuqiu + * @since 2021/7/1 + */ +@Service +public class KanjiaActivityServiceImpl extends ServiceImpl implements KanjiaActivityService { + + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + @Autowired + private KanjiaActivityLogService kanjiaActivityLogService; + @Autowired + private MemberService memberService; + @Autowired + private GoodsSkuService goodsSkuService; + + @Override + public KanjiaActivity getKanjiaActivity(KanjiaActivitySearchParams kanJiaActivitySearchParams) { + return this.getOne(kanJiaActivitySearchParams.wrapper()); + } + + @Override + public KanjiaActivityVO getKanjiaActivityVO(KanjiaActivitySearchParams kanJiaActivitySearchParams) { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + KanjiaActivity kanjiaActivity = this.getKanjiaActivity(kanJiaActivitySearchParams); + KanjiaActivityVO kanjiaActivityVO = new KanjiaActivityVO(); + //判断是否参与活动 + if (kanjiaActivity == null) { + return kanjiaActivityVO; + } + BeanUtil.copyProperties(kanjiaActivity, kanjiaActivityVO); + + //判断是否发起了砍价活动,如果发起可参与活动 + kanjiaActivityVO.setLaunch(true); + //如果已发起砍价判断用户是否可以砍价 + KanjiaActivityLog kanjiaActivityLog = kanjiaActivityLogService.getOne(new LambdaQueryWrapper() + .eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivity.getId()) + .eq(KanjiaActivityLog::getKanjiaMemberId, authUser.getId())); + if (kanjiaActivityLog == null) { + kanjiaActivityVO.setHelp(true); + } + //判断活动已通过并且是当前用户发起的砍价则可以进行购买 + if (kanjiaActivity.getStatus().equals(KanJiaStatusEnum.SUCCESS.name()) && + kanjiaActivity.getMemberId().equals(UserContext.getCurrentUser().getId())) { + kanjiaActivityVO.setPass(true); + } + return kanjiaActivityVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public KanjiaActivityLog add(String id) { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + //根据skuId查询当前sku是否参与活动并且是在活动进行中 + KanjiaActivityGoods kanJiaActivityGoods = kanjiaActivityGoodsService.getById(id); + //只有砍价商品存在且已经开始的活动才可以发起砍价 + if (kanJiaActivityGoods == null || !kanJiaActivityGoods.getPromotionStatus().equals(PromotionsStatusEnum.START.name())) { + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + } + KanjiaActivityLog kanjiaActivityLog = new KanjiaActivityLog(); + //获取会员信息 + Member member = memberService.getById(authUser.getId()); + //校验此活动是否已经发起过 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("kanjia_activity_goods_id", kanJiaActivityGoods.getId()); + queryWrapper.eq("member_id", member.getId()); + if (this.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.KANJIA_ACTIVITY_MEMBER_ERROR); + } + KanjiaActivity kanJiaActivity = new KanjiaActivity(); + //获取商品信息 + GoodsSku goodsSku = goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(kanJiaActivityGoods.getSkuId()); + if (goodsSku != null) { + kanJiaActivity.setSkuId(kanJiaActivityGoods.getSkuId()); + kanJiaActivity.setGoodsName(goodsSku.getGoodsName()); + kanJiaActivity.setKanjiaActivityGoodsId(kanJiaActivityGoods.getId()); + kanJiaActivity.setThumbnail(goodsSku.getThumbnail()); + kanJiaActivity.setMemberId(UserContext.getCurrentUser().getId()); + kanJiaActivity.setMemberName(member.getUsername()); + kanJiaActivity.setStatus(KanJiaStatusEnum.START.name()); + //剩余砍价金额 开始 是商品金额 + kanJiaActivity.setSurplusPrice(goodsSku.getPrice()); + //砍价最低购买金额 + kanJiaActivity.setPurchasePrice(kanJiaActivityGoods.getPurchasePrice()); + //保存我的砍价活动 + boolean result = this.save(kanJiaActivity); + + //因为发起砍价就是自己给自己砍一刀,所以要添加砍价记录信息 + if (result) { + kanjiaActivityLog = this.helpKanJia(kanJiaActivity.getId()); + } + } + return kanjiaActivityLog; + } + + + @Override + public KanjiaActivityLog helpKanJia(String kanjiaActivityId) { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + //获取会员信息 + Member member = memberService.getById(authUser.getId()); + //根据砍价发起活动id查询砍价活动信息 + KanjiaActivity kanjiaActivity = this.getById(kanjiaActivityId); + //判断活动非空或非正在进行中的活动 + if (kanjiaActivity == null || !kanjiaActivity.getStatus().equals(PromotionsStatusEnum.START.name())) { + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + } else if (member == null) { + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } + //根据skuId查询当前sku是否参与活动并且是在活动进行中 + KanjiaActivityGoods kanJiaActivityGoods = kanjiaActivityGoodsService.getById(kanjiaActivity.getKanjiaActivityGoodsId()); + if (kanJiaActivityGoods == null) { + throw new ServiceException(ResultCode.PROMOTION_STATUS_END); + } + //判断是否已参与 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(KanjiaActivityLog::getKanjiaActivityId, kanjiaActivityId) + .eq(KanjiaActivityLog::getKanjiaMemberId, member.getId()); + if (kanjiaActivityLogService.count(lambdaQueryWrapper) > 0) { + throw new ServiceException(ResultCode.PROMOTION_LOG_EXIST); + } + + //添加砍价记录 + KanjiaActivityDTO kanjiaActivityDTO = new KanjiaActivityDTO(); + kanjiaActivityDTO.setKanjiaActivityGoodsId(kanjiaActivity.getKanjiaActivityGoodsId()); + kanjiaActivityDTO.setKanjiaActivityId(kanjiaActivityId); + //获取砍价金额 + Double price = this.getKanjiaPrice(kanJiaActivityGoods, kanjiaActivity.getSurplusPrice()); + kanjiaActivityDTO.setKanjiaPrice(price); + //计算剩余金额 + kanjiaActivityDTO.setSurplusPrice(CurrencyUtil.sub(kanjiaActivity.getSurplusPrice(), price)); + kanjiaActivityDTO.setKanjiaMemberId(member.getId()); + kanjiaActivityDTO.setKanjiaMemberName(member.getUsername()); + kanjiaActivityDTO.setKanjiaMemberFace(member.getFace()); + KanjiaActivityLog kanjiaActivityLog = kanjiaActivityLogService.addKanJiaActivityLog(kanjiaActivityDTO); + + //如果可砍金额为0的话说明活动成功了 + if (Double.doubleToLongBits(kanjiaActivityDTO.getSurplusPrice()) == Double.doubleToLongBits(0D)) { + kanjiaActivity.setStatus(KanJiaStatusEnum.SUCCESS.name()); + } + kanjiaActivity.setSurplusPrice(kanjiaActivityLog.getSurplusPrice()); + this.updateById(kanjiaActivity); + return kanjiaActivityLog; + } + + + /** + * 随机获取砍一刀价格 + * + * @param kanjiaActivityGoods 砍价商品信息 + * @param surplusPrice 剩余可砍金额 + * @return 砍一刀价格 + */ + private Double getKanjiaPrice(KanjiaActivityGoods kanjiaActivityGoods, Double surplusPrice) { + + //如果剩余砍价金额小于最低砍价金额则返回0 + if (kanjiaActivityGoods.getLowestPrice() > surplusPrice) { + return surplusPrice; + } + + //如果金额相等则直接返回 + if (kanjiaActivityGoods.getLowestPrice().equals(kanjiaActivityGoods.getHighestPrice())) { + return kanjiaActivityGoods.getLowestPrice(); + } + //获取随机砍价金额 + BigDecimal bigDecimal = RandomUtil.randomBigDecimal(Convert.toBigDecimal(kanjiaActivityGoods.getLowestPrice()), + Convert.toBigDecimal(kanjiaActivityGoods.getHighestPrice())); + return bigDecimal.setScale(2, RoundingMode.UP).doubleValue(); + + } + + + @Override + public IPage getForPage(KanjiaActivityQuery kanjiaActivityQuery, PageVO page) { + QueryWrapper queryWrapper = kanjiaActivityQuery.wrapper(); + return this.page(PageUtil.initPage(page), queryWrapper); + } + + /** + * 结束砍价活动 + * + * @param kanjiaId 砍价活动id + * @return 是否更新成功 + */ + @Override + public boolean endKanjiaActivity(String kanjiaId) { + return this.update(new LambdaUpdateWrapper() + .eq(KanjiaActivity::getId, kanjiaId) + .set(KanjiaActivity::getStatus, KanJiaStatusEnum.END.name())); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java index 9c634c59..b4d643ae 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java @@ -1,89 +1,156 @@ package cn.lili.modules.promotion.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; +import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams; +import cn.lili.modules.promotion.entity.enums.CouponGetEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.entity.vos.MemberCouponVO; import cn.lili.modules.promotion.mapper.MemberCouponMapper; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.mybatis.util.PageUtil; 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.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.util.*; /** * 会员优惠券业务层实现 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@CacheConfig(cacheNames = "{MemberCoupon}") public class MemberCouponServiceImpl extends ServiceImpl implements MemberCouponService { /** * 优惠券 */ + @Autowired private CouponService couponService; + /** + * 缓存 + */ + @Autowired + private Cache cache; + @Override public void checkCouponLimit(String couponId, String memberId) { Coupon coupon = couponService.getById(couponId); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(MemberCoupon::getCouponId, couponId) .eq(MemberCoupon::getMemberId, memberId); - int haveCoupons = this.count(queryWrapper); - if (!PromotionStatusEnum.START.name().equals(coupon.getPromotionStatus())) { - throw new ServiceException("当前优惠券状态不可领取"); + long haveCoupons = this.count(queryWrapper); + if (!PromotionsStatusEnum.START.name().equals(coupon.getPromotionStatus())) { + throw new ServiceException(ResultCode.COUPON_RECEIVE_ERROR); } - if (coupon.getReceivedNum() >= coupon.getPublishNum()) { - throw new ServiceException("优惠券剩余领取数量不足"); + if (coupon.getPublishNum() != 0 && coupon.getReceivedNum() >= coupon.getPublishNum()) { + throw new ServiceException(ResultCode.COUPON_NUM_INSUFFICIENT_ERROR); } - if (haveCoupons >= coupon.getCouponLimitNum()) { - throw new ServiceException("此优惠券最多领取" + coupon.getCouponLimitNum()+"张"); + if (!coupon.getCouponLimitNum().equals(0) && haveCoupons >= coupon.getCouponLimitNum()) { + throw new ServiceException(ResultCode.COUPON_LIMIT_ERROR, "此优惠券最多领取" + coupon.getCouponLimitNum() + "张"); } } + /** + * 领取优惠券 + * + * @param couponId 优惠券编号 + * @param memberId 会员 + * @param memberName 会员名称 + */ @Override + @CacheEvict(key = "#memberId") + @Transactional(rollbackFor = Exception.class) + public void receiveBuyerCoupon(String couponId, String memberId, String memberName) { + Coupon coupon = couponService.getById(couponId); + if (coupon != null && !CouponGetEnum.FREE.name().equals(coupon.getGetType())) { + throw new ServiceException(ResultCode.COUPON_DO_NOT_RECEIVER); + } else if (coupon != null) { + this.receiverCoupon(couponId, memberId, memberName, coupon); + } + + } + + @Override + @CacheEvict(key = "#memberId") + @Transactional(rollbackFor = Exception.class) public void receiveCoupon(String couponId, String memberId, String memberName) { - Coupon coupon = couponService.getCouponDetailFromMongo(couponId); + Coupon coupon = couponService.getById(couponId); if (coupon != null) { - this.checkCouponLimit(couponId, memberId); - MemberCoupon memberCoupon = new MemberCoupon(coupon); - memberCoupon.setMemberId(memberId); - memberCoupon.setMemberName(memberName); - memberCoupon.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name()); - memberCoupon.setIsPlatform(coupon.getStoreId().equals("platform")); - this.save(memberCoupon); - couponService.receiveCoupon(couponId, 1); + this.receiverCoupon(couponId, memberId, memberName, coupon); } else { - throw new ServiceException("当前优惠券不存在"); + throw new ServiceException(ResultCode.COUPON_NOT_EXIST); } } @Override - public IPage getMemberCoupons(CouponSearchParams param, PageVO pageVo) { - QueryWrapper queryWrapper = param.wrapper(); - return this.page(PageUtil.initPage(pageVo), queryWrapper); + public IPage getMemberCoupons(MemberCouponSearchParams param, PageVO pageVo) { + QueryWrapper queryWrapper = param.queryWrapper(); + Page page = this.page(PageUtil.initPage(pageVo), queryWrapper); + if (page.getRecords() != null && page.getRecords().size() > 0) { + if (page.getRecords().stream().anyMatch(i -> i.getEndTime().before(new Date()))) { + this.expireInvalidMemberCoupon(param.getMemberId()); + return this.page(PageUtil.initPage(pageVo), queryWrapper); + } + } + return page; + } + + /** + * 获取会员优惠券列表 + * + * @param param 查询参数 + * @return 会员优惠券列表 + */ + @Override + public List getMemberCoupons(MemberCouponSearchParams param) { + List list = this.list(param.queryWrapper()); + if (list.stream().anyMatch(i -> i.getEndTime().before(new Date()))) { + this.expireInvalidMemberCoupon(param.getMemberId()); + return this.list(param.queryWrapper()); + } + return list; + } + + /** + * 获取当前用户的优惠券列表(优先读取缓存) + * + * @param memberId 会员id + * @return 会员优惠券列表 + */ + @Override + @Cacheable(key = "#memberId") + public List getMemberCoupons(String memberId) { + MemberCouponSearchParams searchParams = new MemberCouponSearchParams(); + searchParams.setMemberId(Objects.requireNonNull(UserContext.getCurrentUser()).getId()); + searchParams.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name()); + searchParams.setPromotionStatus(PromotionsStatusEnum.START.name()); + return this.getMemberCoupons(searchParams); } /** @@ -94,16 +161,18 @@ public class MemberCouponServiceImpl extends ServiceImpl getMemberCouponsByCanUse(CouponSearchParams param, Double totalPrice, PageVO pageVo) { + public IPage getMemberCouponsByCanUse(MemberCouponSearchParams param, Double totalPrice, PageVO pageVo) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(MemberCoupon::getStoreId, Arrays.asList(param.getStoreId(), "platform")); + List storeIds = new ArrayList<>(Arrays.asList(param.getStoreId().split(","))); + storeIds.add(PromotionTools.PLATFORM_ID); + queryWrapper.in(MemberCoupon::getStoreId, storeIds); queryWrapper.eq(MemberCoupon::getMemberId, param.getMemberId()); queryWrapper.and( i -> i.like(MemberCoupon::getScopeId, param.getScopeId()) - .or(j -> j.eq(MemberCoupon::getScopeType, CouponScopeTypeEnum.ALL.name()))); + .or(j -> j.eq(MemberCoupon::getScopeType, PromotionsScopeTypeEnum.ALL.name()))); queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()); queryWrapper.le(MemberCoupon::getConsumeThreshold, totalPrice); - queryWrapper.gt(MemberCoupon::getEndTime, new Date()); + queryWrapper.ge(MemberCoupon::getEndTime, new Date()); return this.page(PageUtil.initPage(pageVo), queryWrapper); } @@ -120,9 +189,9 @@ public class MemberCouponServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MemberCoupon::getMemberId, memberId); queryWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()); - queryWrapper.eq(MemberCoupon::getScopeType, CouponScopeTypeEnum.ALL.name()); - queryWrapper.gt(MemberCoupon::getEndTime, new Date()).and(i -> i.in(MemberCoupon::getStoreId, storeId).or(j -> j.eq(MemberCoupon::getIsPlatform, true))); + queryWrapper.eq(MemberCoupon::getScopeType, PromotionsScopeTypeEnum.ALL.name()); + queryWrapper.ge(MemberCoupon::getEndTime, new Date()).and(i -> i.in(MemberCoupon::getStoreId, storeId).or(j -> j.eq(MemberCoupon::getPlatformFlag, true))); return this.list(queryWrapper); } + /** + * 获取当前会员全品类优惠券 + * + * @param param 查询参数 + * @return 会员优惠券列表 + */ @Override - public Integer getMemberCouponsNum() { + public MemberCoupon getMemberCoupon(MemberCouponSearchParams param) { + return this.getOne(param.queryWrapper(), false); + } + + @Override + public long getMemberCouponsNum() { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.eq("member_id", UserContext.getCurrentUser().getId()); + queryWrapper.eq("member_id", authUser.getId()); queryWrapper.eq("member_coupon_status", MemberCouponStatusEnum.NEW.name()); queryWrapper.eq("delete_flag", false); return this.count(queryWrapper); } - /** - * 更新会员优惠券状态 - * - * @param status 要变更的状态 - * @param id 会员优惠券id - */ - @Override - public void updateMemberCouponStatus(MemberCouponStatusEnum status, String id) { - MemberCoupon memberCoupon = this.getById(id); - if (memberCoupon == null) { - throw new ServiceException("没有当前会员优惠券!"); - } - String memberCouponStatus = memberCoupon.getMemberCouponStatus(); - if (memberCouponStatus.equals(MemberCouponStatusEnum.NEW.name()) || memberCouponStatus.equals(MemberCouponStatusEnum.USED.name())) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(MemberCoupon::getId, id).set(MemberCoupon::getMemberCouponStatus, status.name()); - this.update(updateWrapper); - } else { - throw new ServiceException("当前会员优惠券已过期/作废无法变更状态!"); - } - } - @Override - public void used(List ids) { + @CacheEvict(key = "#memberId") + @Transactional(rollbackFor = Exception.class) + public void used(String memberId, List ids) { if (ids != null && !ids.isEmpty()) { List memberCoupons = this.listByIds(ids); @@ -203,15 +264,102 @@ public class MemberCouponServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(MemberCoupon::getId, id); updateWrapper.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.CLOSED.name()); this.update(updateWrapper); } - @Autowired - public void setCouponService(CouponService couponService) { - this.couponService = couponService; + /** + * 关闭会员优惠券 + * + * @param couponIds 优惠券id集合 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void closeMemberCoupon(List couponIds) { + LambdaUpdateWrapper memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper() + .in(MemberCoupon::getCouponId, couponIds) + .set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.CLOSED.name()); + this.cache.vagueDel("{MemberCoupon}"); + this.update(memberCouponLambdaUpdateWrapper); + } + + @Override + public boolean recoveryMemberCoupon(List memberCouponIds) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(MemberCoupon::getId, memberCouponIds); + updateWrapper.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()); + updateWrapper.set(MemberCoupon::getConsumptionTime, null); + return this.update(updateWrapper); + } + + @Override + public void voidCoupon(String couponId) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(MemberCoupon::getCouponId, couponId); + updateWrapper.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.CLOSED.name()); + updateWrapper.set(MemberCoupon::getDeleteFlag, true); + this.update(updateWrapper); + } + + @Override + public Page getMemberCouponsPage(Page page, MemberCouponSearchParams param) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getMemberId()), "mc.member_id", param.getMemberId()); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getStoreId()), "c.store_id", param.getStoreId()); + queryWrapper.like(CharSequenceUtil.isNotEmpty(param.getMemberName()), "mc.member_name", param.getMemberName()); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getCouponId()), "mc.coupon_id", param.getCouponId()); + queryWrapper.like(CharSequenceUtil.isNotEmpty(param.getCouponName()), "c.coupon_name", param.getCouponName()); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getGetType()), "mc.get_type", param.getGetType()); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getScopeType()), "mc.scope_type", param.getPromotionStatus()); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getCouponType()), "mc.coupon_type", param.getCouponType()); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getMemberCouponStatus()), "mc.member_coupon_status", param.getMemberCouponStatus()); + if (param.getStartTime() != null) { + queryWrapper.ge("mc.start_time", new Date(param.getStartTime())); + } + if (param.getEndTime() != null) { + queryWrapper.le("mc.end_time", new Date(param.getEndTime())); + } + return this.baseMapper.getMemberCoupons(page, queryWrapper); + } + + @Override + public long getMemberCouponNum(String memberId, String couponId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MemberCoupon::getMemberId, memberId); + queryWrapper.eq(MemberCoupon::getCouponId, couponId); + return this.count(queryWrapper); + } + + /** + * 清除无效的会员优惠券 + * + * @return 是否操作成功 + */ + @Override + @CacheEvict(key = "#memberId") + public boolean expireInvalidMemberCoupon(String memberId) { + //将过期优惠券变更为过期状体 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(CharSequenceUtil.isNotEmpty(memberId), MemberCoupon::getMemberId, memberId) + .eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()) + .le(MemberCoupon::getEndTime, new Date()) + .set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); + return this.update(updateWrapper); + } + + private void receiverCoupon(String couponId, String memberId, String memberName, Coupon coupon) { + this.checkCouponLimit(couponId, memberId); + MemberCoupon memberCoupon = new MemberCoupon(coupon); + memberCoupon.setMemberId(memberId); + memberCoupon.setMemberName(memberName); + memberCoupon.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name()); + memberCoupon.setPlatformFlag((PromotionTools.PLATFORM_ID).equals(coupon.getStoreId())); + this.save(memberCoupon); + couponService.receiveCoupon(couponId, 1); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponSignServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponSignServiceImpl.java new file mode 100644 index 00000000..ce2bea9d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponSignServiceImpl.java @@ -0,0 +1,124 @@ +package cn.lili.modules.promotion.serviceimpl; + +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.DateUtil; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dos.MemberCouponSign; +import cn.lili.modules.promotion.entity.enums.CouponFrequencyEnum; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; +import cn.lili.modules.promotion.mapper.MemberCouponSignMapper; +import cn.lili.modules.promotion.service.MemberCouponSignService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * 会员优惠券领取标记 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2023/1/3 18:13 + */ +@Service +public class MemberCouponSignServiceImpl extends ServiceImpl implements MemberCouponSignService { + + + @Autowired + private Cache cache; + + @Override + public void clean() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.lt(MemberCouponSign::getInvalidTime, DateUtil.getCurrentDayStartTime()); + this.baseMapper.delete(queryWrapper); + cache.remove(CachePrefix.MEMBER_COUPON_SIGN.getPrefix()); + } + + @Override + public List receiveCoupon(List couponActivity) { + List memberCouponSigns = new ArrayList<>(); + + + //查询当前用户领取标记 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MemberCouponSign::getMemberId, UserContext.getCurrentUser().getId()); + List oldMemberCouponSigns = this.list(queryWrapper); + + //定义生效的活动 + List assertCouponActivity = new ArrayList<>(); + + //生成标记对象 + couponActivityFor: + for (CouponActivityVO activity : couponActivity) { + //如果旧的标记中包含记号,则略过 + for (MemberCouponSign oldMemberCouponSign : oldMemberCouponSigns) { + if (oldMemberCouponSign.getCouponActivityId().equals(activity.getId())) { + continue couponActivityFor; + } + } + assertCouponActivity.add(activity); + + MemberCouponSign memberCouponSign = new MemberCouponSign(); + memberCouponSign.setMemberId(UserContext.getCurrentUser().getId()); + memberCouponSign.setCouponActivityId(activity.getId()); + memberCouponSign.setInvalidTime(getInvalidTime(activity)); + memberCouponSigns.add(memberCouponSign); + } + + this.saveBatch(memberCouponSigns); + return assertCouponActivity; + } + + /** + * 根据活动优惠券获取标记失效时间 + * + * @param activity + * @return + */ + private Date getInvalidTime(CouponActivity activity) { + + //领取周期符合预设 + if (CouponFrequencyEnum.exist(activity.getCouponFrequencyEnum())) { + + Calendar cal = DateUtil.getCleanCalendar(); + switch (CouponFrequencyEnum.valueOf(activity.getCouponFrequencyEnum())) { + case DAY: + return DateUtil.getCurrentDayEndTime(); + case WEEK: + //周一 + cal.set(Calendar.DAY_OF_WEEK, 2); + //去往下周 + cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR) + 1); + //减1毫秒上个星期最后一刻 + cal.set(Calendar.MILLISECOND, -1); + return cal.getTime(); + case MONTH: + //日期 1日 + cal.set(Calendar.DAY_OF_MONTH, 1); + //下个月 + cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1); + //减少一毫秒去上个月最后一刻 + cal.set(Calendar.MILLISECOND, -1); + + return cal.getTime(); + default: + + throw new ServiceException(); + } + } else { + throw new ServiceException(); + } + } + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java index 01c71d54..108931e9 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java @@ -1,87 +1,83 @@ package cn.lili.modules.promotion.serviceimpl; -import cn.hutool.core.bean.BeanUtil; -import cn.lili.common.delayqueue.DelayQueueTools; -import cn.lili.common.delayqueue.DelayQueueType; -import cn.lili.common.delayqueue.PromotionMessage; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.model.TimeExecuteConstant; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderSearchParams; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.entity.vos.PintuanMemberVO; -import cn.lili.modules.promotion.entity.vos.PintuanSearchParams; import cn.lili.modules.promotion.entity.vos.PintuanShareVO; import cn.lili.modules.promotion.entity.vos.PintuanVO; import cn.lili.modules.promotion.mapper.PintuanMapper; import cn.lili.modules.promotion.service.PintuanService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.tools.PromotionTools; -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 lombok.RequiredArgsConstructor; +import cn.lili.trigger.enums.DelayTypeEnums; +import cn.lili.trigger.interfaces.TimeTrigger; +import cn.lili.trigger.model.TimeExecuteConstant; +import cn.lili.trigger.model.TimeTriggerMsg; +import cn.lili.trigger.util.DelayQueueTools; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Date; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * 拼团业务层实现 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class PintuanServiceImpl extends ServiceImpl implements PintuanService { +public class PintuanServiceImpl extends AbstractPromotionsServiceImpl implements PintuanService { - //延时任务 - private final TimeTrigger timeTrigger; - //Mongo - private final MongoTemplate mongoTemplate; - //促销商品 - private final PromotionGoodsService promotionGoodsService; - //规格商品 - private final GoodsSkuService goodsSkuService; - //会员 - private final MemberService memberService; - //Rocketmq - private final RocketmqCustomProperties rocketmqCustomProperties; - //订单 + /** + * 促销商品 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; + /** + * 订单 + */ + @Autowired private OrderService orderService; - @Override - public IPage getPintuanByPage(PintuanSearchParams param, PageVO page) { - QueryWrapper queryWrapper = param.wrapper(); - return page(PageUtil.initPage(page), queryWrapper); - } + /** + * 延时任务 + */ + @Autowired + private TimeTrigger timeTrigger; + + /** + * RocketMQ + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; /** * 获取当前拼团的会员 @@ -92,217 +88,48 @@ public class PintuanServiceImpl extends ServiceImpl impl @Override public List getPintuanMember(String pintuanId) { List members = new ArrayList<>(); - PintuanVO pintuan = this.getPintuanByIdFromMongo(pintuanId); + Pintuan pintuan = this.getById(pintuanId); if (pintuan == null) { log.error("拼团活动为" + pintuanId + "的拼团活动不存在!"); return new ArrayList<>(); } - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Order::getPromotionId, pintuanId).eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) - .eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()).eq(Order::getParentOrderSn, ""); - List orders = orderService.list(queryWrapper); - // 遍历订单状态为已支付,为团长的拼团订单 + OrderSearchParams searchParams = new OrderSearchParams(); + searchParams.setOrderStatus(OrderStatusEnum.PAID.name()); + searchParams.setPromotionId(pintuanId); + searchParams.setOrderPromotionType(PromotionTypeEnum.PINTUAN.name()); + searchParams.setParentOrderSn(""); + searchParams.setMemberId(""); + List orders = orderService.queryListByParams(searchParams); + //遍历订单状态为已支付,为团长的拼团订单 for (Order order : orders) { Member member = memberService.getById(order.getMemberId()); PintuanMemberVO memberVO = new PintuanMemberVO(member); - LambdaQueryWrapper countQueryWrapper = new LambdaQueryWrapper<>(); - countQueryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()); - countQueryWrapper.and(i -> i.eq(Order::getSn, order.getSn()).or(j -> j.eq(Order::getParentOrderSn, order.getSn()))); - // 获取已参团人数 - int count = orderService.count(countQueryWrapper); - // 获取待参团人数 - int toBoGrouped = pintuan.getRequiredNum() - count; - memberVO.setGroupNum(pintuan.getRequiredNum()); - memberVO.setGroupedNum(count); - memberVO.setToBeGroupedNum(toBoGrouped); + //获取已参团人数 + this.setMemberVONum(memberVO, pintuan.getRequiredNum(), order.getSn()); memberVO.setOrderSn(order.getSn()); members.add(memberVO); } return members; } - @Override - public IPage getPintuanByPageFromMongo(PintuanSearchParams param, PageVO page) { - IPage pintuanPage = new Page<>(); - Query query = param.mongoQuery(); - if (page != null) { - page.setNotConvert(true); - PromotionTools.mongoQueryPageParam(query, page); - pintuanPage.setCurrent(page.getPageNumber()); - pintuanPage.setSize(page.getPageSize()); - } - List pintuanVOS = mongoTemplate.find(query, PintuanVO.class); - pintuanPage.setRecords(pintuanVOS); - pintuanPage.setTotal(this.getPintuanByPageFromMongoCount(param)); - return pintuanPage; - } - /** - * 从mongo中查询拼团活动详情 + * 查询拼团活动详情 * * @param id 拼团ID * @return 拼团活动详情 */ @Override - public PintuanVO getPintuanByIdFromMongo(String id) { - PintuanVO pintuanVO = mongoTemplate.findById(id, PintuanVO.class); - if (pintuanVO == null) { - log.error("拼团活动id[" + id + "]的拼团活动不存在!"); - throw new ServiceException("网络出现异常!"); - } - return pintuanVO; - } - - /** - * 从mysql中查询拼团活动详情 - * - * @param id 拼团活动id - * @return 拼团活动详情 - */ - @Override - public Pintuan getPintuanById(String id) { + public PintuanVO getPintuanVO(String id) { Pintuan pintuan = this.getById(id); if (pintuan == null) { log.error("拼团活动id[" + id + "]的拼团活动不存在!"); - throw new ServiceException("网络出现异常!"); + throw new ServiceException(ResultCode.PINTUAN_NOT_EXIST_ERROR); } - return pintuan; - } - - /** - * 从mongo中根据条件查询拼团活动总数 - * - * @param param 拼团活动查询参数 - * @return 总数 - */ - @Override - public Long getPintuanByPageFromMongoCount(PintuanSearchParams param) { - Query query = param.mongoQuery(); - return mongoTemplate.count(query, PintuanVO.class); - } - - @Override - public boolean addPintuan(PintuanVO pintuan) { - PromotionTools.checkPromotionTime(pintuan.getStartTime().getTime(), pintuan.getEndTime().getTime()); - this.checkSamePromotion(pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getStoreId(), null); - pintuan.setPromotionStatus(PromotionStatusEnum.NEW.name()); - // 保存到MYSQL中 - boolean result = this.save(pintuan); - this.updatePintuanPromotionGoods(pintuan); - this.mongoTemplate.save(pintuan); - this.addPintuanStartTask(pintuan); - return result; - } - - @Override - public boolean modifyPintuan(PintuanVO pintuan) { - PintuanVO pintuanVO = this.checkExist(pintuan.getId()); - if (!pintuan.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) { - throw new ServiceException("只有活动状态为新活动时(活动未开始)才可编辑!"); - } - // 检查促销时间 - PromotionTools.checkPromotionTime(pintuan.getStartTime().getTime(), pintuan.getEndTime().getTime()); - // 检查同一时间,同一店铺,同一类型的促销活动 - this.checkSamePromotion(pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getStoreId(), pintuan.getId()); - boolean result = this.updateById(pintuan); - if (pintuan.getPromotionGoodsList() != null) { - this.updatePintuanPromotionGoods(pintuan); - } - this.mongoTemplate.save(pintuan); - // 时间发生变化 - if (pintuan.getStartTime().getTime() != pintuanVO.getStartTime().getTime()) { - PromotionMessage promotionMessage = new PromotionMessage(pintuan.getId(), PromotionTypeEnum.PINTUAN.name(), PromotionStatusEnum.START.name(), pintuan.getStartTime(), pintuan.getEndTime()); - // 更新延时任务 - this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, - promotionMessage, - pintuanVO.getStartTime().getTime(), - pintuan.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - DateUtil.getDelayTime(pintuan.getStartTime().getTime()), - rocketmqCustomProperties.getPromotionTopic()); - } - - return result; - } - - @Override - public boolean openPintuan(String pintuanId, Date startTime, Date endTime) { - PintuanVO pintuan = checkExist(pintuanId); - pintuan.setStartTime(startTime); - pintuan.setEndTime(endTime); - boolean result; - - long endTimeLong = endTime.getTime() / 1000; - //如果还在活动时间内 - if (endTimeLong > DateUtil.getDateline()) { - pintuan.setPromotionStatus(PromotionStatusEnum.NEW.name()); - updatePintuanPromotionGoods(pintuan); - this.addPintuanStartTask(pintuan); - } else { - //活动时间范围外,修改状态为已结束 - pintuan.setPromotionStatus(PromotionStatusEnum.END.name()); - } - - pintuan.setPromotionGoodsList(new ArrayList<>()); - result = this.updateById(pintuan); - this.mongoTemplate.save(pintuan); - return result; - } - - @Override - public boolean closePintuan(String pintuanId) { - PintuanVO pintuan = checkExist(pintuanId); - - long endTime = pintuan.getEndTime().getTime() / 1000; - //如果还在活动时间内 - if (endTime > DateUtil.getDateline()) { - //表示可以再次开启,则不处理未成团订单,因为可以开启 - pintuan.setPromotionStatus(PromotionStatusEnum.CLOSE.name()); - } else { - pintuan.setPromotionStatus(PromotionStatusEnum.END.name()); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()); - queryWrapper.eq(Order::getPromotionId, pintuanId); - queryWrapper.nested(i -> i.eq(Order::getPayStatus, PayStatusEnum.PAID.name()).or().eq(Order::getOrderStatus, OrderStatusEnum.PAID.name())); - // 过滤父级拼团订单,根据父级拼团订单分组 - Map> collect = orderService.list(queryWrapper).stream().filter(i -> !i.getParentOrderSn().equals("")).collect(Collectors.groupingBy(Order::getParentOrderSn)); - this.isOpenFictitiousPintuan(pintuan, collect); - - } - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Pintuan::getId, pintuanId).set(Pintuan::getPromotionStatus, PromotionStatusEnum.CLOSE.name()); - boolean result = this.update(updateWrapper); - if (pintuan.getPromotionGoodsList() != null && !pintuan.getPromotionGoodsList().isEmpty()) { - LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); - deleteWrapper.eq(PromotionGoods::getPromotionId, pintuanId); - promotionGoodsService.remove(deleteWrapper); - pintuan.setPromotionGoodsList(new ArrayList<>()); - } - this.removePintuanGoodsFromEs(pintuanId, pintuan.getStartTime().getTime()); - this.mongoTemplate.save(pintuan); - return result; - } - - /** - * 删除拼团 - * - * @param pintuanId 拼团活动编号 - * @return 是否成功 - */ - @Override - public boolean deletePintuan(String pintuanId) { - PintuanVO pintuanVO = this.checkExist(pintuanId); - pintuanVO.setDeleteFlag(true); - if (pintuanVO.getPromotionGoodsList() != null && !pintuanVO.getPromotionGoodsList().isEmpty()) { - LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); - deleteWrapper.eq(PromotionGoods::getPromotionId, pintuanId); - promotionGoodsService.remove(deleteWrapper); - pintuanVO.setPromotionGoodsList(new ArrayList<>()); - } - boolean result = this.updateById(pintuanVO); - this.mongoTemplate.save(pintuanVO); - this.removePintuanGoodsFromEs(pintuanId, pintuanVO.getStartTime().getTime()); - return result; + PintuanVO pintuanVO = new PintuanVO(pintuan); + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionId(pintuan.getId()); + pintuanVO.setPromotionGoodsList(promotionGoodsService.listFindAll(searchParams)); + return pintuanVO; } /** @@ -316,28 +143,67 @@ public class PintuanServiceImpl extends ServiceImpl impl public PintuanShareVO getPintuanShareInfo(String parentOrderSn, String skuId) { PintuanShareVO pintuanShareVO = new PintuanShareVO(); pintuanShareVO.setPintuanMemberVOS(new ArrayList<>()); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - // 查找团长订单和已和当前拼团订单拼团的订单 - queryWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) - .eq(Order::getPayStatus, OrderStatusEnum.PAID.name()) - .and(i -> i.eq(Order::getParentOrderSn, parentOrderSn).or(j -> j.eq(Order::getSn, parentOrderSn))); - List orders = orderService.list(queryWrapper); + //查找团长订单和已和当前拼团订单拼团的订单 + List orders = orderService.queryListByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), parentOrderSn, parentOrderSn); this.setPintuanOrderInfo(orders, pintuanShareVO, skuId); - // 如果为根据团员订单sn查询拼团订单信息时,找到团长订单sn,然后找到所有参与到同一拼团的订单信息 + //如果为根据团员订单sn查询拼团订单信息时,找到团长订单sn,然后找到所有参与到同一拼团的订单信息 if (!orders.isEmpty() && pintuanShareVO.getPromotionGoods() == null) { - LambdaQueryWrapper orderLambdaQueryWrapper = new LambdaQueryWrapper<>(); - // 查找团长订单和已和当前拼团订单拼团的订单 - orderLambdaQueryWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) - .eq(Order::getPayStatus, OrderStatusEnum.PAID.name()) - .ne(Order::getSn, parentOrderSn) - .and(i -> i.eq(Order::getParentOrderSn, orders.get(0).getParentOrderSn()).or(j -> j.eq(Order::getSn, orders.get(0).getParentOrderSn()))); - List parentOrders = orderService.list(orderLambdaQueryWrapper); + List parentOrders = orderService.queryListByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), orders.get(0).getParentOrderSn(), orders.get(0).getParentOrderSn()); this.setPintuanOrderInfo(parentOrders, pintuanShareVO, skuId); - } return pintuanShareVO; } + /** + * 更新促销商品信息 + * + * @param promotions 促销实体 + * @return 是否更新成功 + */ + @Override + public boolean updatePromotionsGoods(Pintuan promotions) { + boolean result = super.updatePromotionsGoods(promotions); + if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus()) + && PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType()) + && promotions instanceof PintuanVO) { + PintuanVO pintuanVO = (PintuanVO) promotions; + this.updatePintuanPromotionGoods(pintuanVO); + TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, + promotions.getEndTime().getTime(), + promotions, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PINTUAN_ORDER, (promotions.getId())), + rocketmqCustomProperties.getPromotionTopic()); + //发送促销活动开始的延时任务 + this.timeTrigger.addDelay(timeTriggerMsg); + } + if (promotions.getEndTime() == null && promotions.getStartTime() == null) { + //过滤父级拼团订单,根据父级拼团订单分组 + this.orderService.checkFictitiousOrder(promotions.getId(), promotions.getRequiredNum(), promotions.getFictitious()); + } + return result; + } + + /** + * 更新促销信息到商品索引 + * + * @param promotions 促销实体 + */ + @Override + public void updateEsGoodsIndex(Pintuan promotions) { + Pintuan pintuan = JSONUtil.parse(promotions).toBean(Pintuan.class); + super.updateEsGoodsIndex(pintuan); + } + + /** + * 当前促销类型 + * + * @return 当前促销类型 + */ + @Override + public PromotionTypeEnum getPromotionType() { + return PromotionTypeEnum.PINTUAN; + } + /** * 根据订单信息,从中提取出拼团信息,设置拼团信息 * @@ -349,139 +215,32 @@ public class PintuanServiceImpl extends ServiceImpl impl for (Order order : orders) { Member member = memberService.getById(order.getMemberId()); PintuanMemberVO memberVO = new PintuanMemberVO(member); - if (order.getParentOrderSn().equals("")) { + if (CharSequenceUtil.isEmpty(order.getParentOrderSn())) { memberVO.setOrderSn(""); - PromotionGoods promotionGoods = promotionGoodsService.getPromotionGoods(PromotionTypeEnum.PINTUAN, order.getPromotionId(), skuId); + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionStatus(PromotionsStatusEnum.START.name()); + searchParams.setPromotionId(order.getPromotionId()); + searchParams.setSkuId(skuId); + PromotionGoods promotionGoods = promotionGoodsService.getPromotionsGoods(searchParams); if (promotionGoods == null) { - throw new ServiceException("当前拼团商品不存在!"); + throw new ServiceException(ResultCode.PINTUAN_GOODS_NOT_EXIST_ERROR); } pintuanShareVO.setPromotionGoods(promotionGoods); - Pintuan pintuanById = this.getPintuanById(order.getPromotionId()); - LambdaQueryWrapper countQueryWrapper = new LambdaQueryWrapper<>(); - countQueryWrapper.eq(Order::getPayStatus, PayStatusEnum.PAID.name()); - countQueryWrapper.and(i -> i.eq(Order::getSn, order.getSn()).or(j -> j.eq(Order::getParentOrderSn, order.getSn()))); - // 获取已参团人数 - int count = orderService.count(countQueryWrapper); - // 获取待参团人数 - int toBoGrouped = pintuanById.getRequiredNum() - count; - memberVO.setGroupNum(pintuanById.getRequiredNum()); - memberVO.setGroupedNum(count); - memberVO.setToBeGroupedNum(toBoGrouped); + Pintuan pintuanById = this.getById(order.getPromotionId()); + //获取已参团人数 + this.setMemberVONum(memberVO, pintuanById.getRequiredNum(), order.getSn()); } pintuanShareVO.getPintuanMemberVOS().add(memberVO); } } - private void checkSamePromotion(Date startTime, Date endTime, String storeId, String pintuanId) { - QueryWrapper queryWrapper = PromotionTools.checkActiveTime(startTime, endTime, PromotionTypeEnum.PINTUAN, storeId, pintuanId); - List list = this.list(queryWrapper); - if (!list.isEmpty()) { - throw new ServiceException("当前时间段已存在相同活动!"); - } - } - - private void addPintuanStartTask(PintuanVO pintuan) { - PromotionMessage promotionMessage = new PromotionMessage(pintuan.getId(), PromotionTypeEnum.PINTUAN.name(), PromotionStatusEnum.START.name(), pintuan.getStartTime(), pintuan.getEndTime()); - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, - pintuan.getStartTime().getTime(), - promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - rocketmqCustomProperties.getPromotionTopic()); - // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(pintuan.getStartTime().getTime())); - } - - /** - * 从es商品索引中中移除拼团活动 - * - * @param id 拼团活动ID - * @param originStartTime 活动开始时间 - */ - private void removePintuanGoodsFromEs(String id, Long originStartTime) { - this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, - originStartTime, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)), - rocketmqCustomProperties.getPromotionTopic()); - } - - /** - * 从指定订单列表中检查是否开始虚拟成团 - * - * @param pintuan 拼团活动信息 - * @param collect 检查的订单列表 - */ - private void isOpenFictitiousPintuan(PintuanVO pintuan, Map> collect) { - // 成团人数 - Integer requiredNum = pintuan.getRequiredNum(); - - for (Map.Entry> entry : collect.entrySet()) { - // 是否开启虚拟成团 - if (Boolean.FALSE.equals(pintuan.getFictitious()) && entry.getValue().size() < requiredNum) { - // 如果未开启虚拟成团且已参团人数小于成团人数,则自动取消订单 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()); - updateWrapper.eq(Order::getPromotionId, pintuan.getId()); - updateWrapper.eq(Order::getParentOrderSn, entry.getKey()); - updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.CANCELLED.name()); - updateWrapper.set(Order::getCancelReason, "拼团活动结束订单未付款,系统自动取消订单"); - orderService.update(updateWrapper); - } else if (Boolean.TRUE.equals(pintuan.getFictitious())) { - this.fictitiousPintuan(entry, requiredNum); - } - } - } - - /** - * 虚拟成团 - * - * @param entry 订单列表 - * @param requiredNum 必须参团人数 - */ - private void fictitiousPintuan(Map.Entry> entry, Integer requiredNum) { - Map> listMap = entry.getValue().stream().collect(Collectors.groupingBy(Order::getPayStatus)); - // 未付款订单 - List unpaidOrders = listMap.get(PayStatusEnum.UNPAID.name()); - // 未付款订单自动取消 - if (unpaidOrders != null && !unpaidOrders.isEmpty()) { - for (Order unpaidOrder : unpaidOrders) { - unpaidOrder.setOrderStatus(OrderStatusEnum.CANCELLED.name()); - unpaidOrder.setCancelReason("拼团活动结束订单未付款,系统自动取消订单"); - } - orderService.updateBatchById(unpaidOrders); - } - List paidOrders = listMap.get(PayStatusEnum.PAID.name()); - // 如待参团人数大于0,并已开启虚拟成团 - if (!paidOrders.isEmpty()) { - // 待参团人数 - int waitNum = requiredNum - paidOrders.size(); - // 添加虚拟成团 - for (int i = 0; i < waitNum; i++) { - Order order = new Order(); - BeanUtil.copyProperties(paidOrders.get(0), order); - order.setMemberId("-1"); - order.setMemberName("参团人员"); - orderService.save(order); - paidOrders.add(order); - } - for (Order paidOrder : paidOrders) { - paidOrder.setOrderStatus(OrderStatusEnum.UNDELIVERED.name()); - } - orderService.updateBatchById(paidOrders); - } - } - - /** - * 检查当前拼团活动是否存在 - * - * @param pintuanId 拼团id - * @return 拼团活动 - */ - private PintuanVO checkExist(String pintuanId) { - PintuanVO pintuan = mongoTemplate.findById(pintuanId, PintuanVO.class); - if (pintuan == null) { - throw new ServiceException("当前拼团活动不存在!"); - } - return pintuan; + private void setMemberVONum(PintuanMemberVO memberVO, Integer requiredNum, String orderSn) { + long count = this.orderService.queryCountByPromotion(PromotionTypeEnum.PINTUAN.name(), PayStatusEnum.PAID.name(), orderSn, orderSn); + //获取待参团人数 + long toBoGrouped = requiredNum - count; + memberVO.setGroupNum(requiredNum); + memberVO.setGroupedNum(count); + memberVO.setToBeGroupedNum(toBoGrouped); } /** @@ -494,28 +253,25 @@ public class PintuanServiceImpl extends ServiceImpl impl if (pintuan.getPromotionGoodsList() != null && !pintuan.getPromotionGoodsList().isEmpty()) { List promotionGoods = PromotionTools.promotionGoodsInit(pintuan.getPromotionGoodsList(), pintuan, PromotionTypeEnum.PINTUAN); for (PromotionGoods promotionGood : promotionGoods) { - if (goodsSkuService.getGoodsSkuByIdFromCache(promotionGood.getSkuId()) == null) { + if (goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(promotionGood.getSkuId()) == null) { log.error("商品[" + promotionGood.getGoodsName() + "]不存在或处于不可售卖状态!"); - throw new ServiceException(); + throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]不存在或处于不可售卖状态!"); } - // 查询是否在同一时间段参与了拼团活动 - Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime()); - // 查询是否在同一时间段参与了限时抢购活动 - count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime()); + //查询是否在同一时间段参与了拼团活动 + Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getId()); + //查询是否在同一时间段参与了限时抢购活动 + count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getId()); if (count > 0) { - log.error("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动"); - throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动"); + log.error("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动或拼团活动,不能参加拼团活动"); + throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动或拼团活动,不能参加拼团活动"); } } - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PromotionGoods::getPromotionId, pintuan.getId()).eq(PromotionGoods::getPromotionType, PromotionTypeEnum.PINTUAN.name()); - promotionGoodsService.remove(queryWrapper); + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionId(pintuan.getId()); + searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name()); + promotionGoodsService.deletePromotionGoods(searchParams); promotionGoodsService.saveOrUpdateBatch(promotionGoods); } } - @Autowired - public void setOrderService(OrderService orderService) { - this.orderService = orderService; - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsCategoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsCategoryServiceImpl.java index a2ac3b08..9ea4b03f 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsCategoryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsCategoryServiceImpl.java @@ -1,29 +1,25 @@ package cn.lili.modules.promotion.serviceimpl; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory; import cn.lili.modules.promotion.mapper.PointsGoodsCategoryMapper; import cn.lili.modules.promotion.service.PointsGoodsCategoryService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * 积分商品分类业务层实现 * * @author paulG - * @date 2020/8/21 + * @since 2020/8/21 **/ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PointsGoodsCategoryServiceImpl extends ServiceImpl implements PointsGoodsCategoryService { /** @@ -72,7 +68,7 @@ public class PointsGoodsCategoryServiceImpl extends ServiceImpl getCategoryByPage(String name, PageVO page) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (StrUtil.isNotEmpty(name)) { + if (CharSequenceUtil.isNotEmpty(name)) { queryWrapper.like(PointsGoodsCategory::getName, name); } page.setOrder("ASC"); @@ -99,7 +95,7 @@ public class PointsGoodsCategoryServiceImpl extends ServiceImpl implements PointsGoodsService { +@Slf4j +public class PointsGoodsServiceImpl extends AbstractPromotionsServiceImpl implements PointsGoodsService { - //延时任务 - private final TimeTrigger timeTrigger; - //Mongo - private final MongoTemplate mongoTemplate; - //Rocketmq - private final RocketmqCustomProperties rocketmqCustomProperties; - //规格商品 - private final GoodsSkuService goodsSkuService; - //Es商品 + /** + * 促销商品 + */ @Autowired - private EsGoodsIndexService goodsIndexService; + private PromotionGoodsService promotionGoodsService; + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; /** - * 批量添加积分商品 - * - * @param pointsGoodsList 积分商品列表 - * @return 是否添加成功 + * rocketMq配置 */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Override - public boolean addPointsGoods(List pointsGoodsList) { - List pointsGoodsList1 = new ArrayList<>(); - for (PointsGoodsVO pointsGoods : pointsGoodsList) { - GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); - this.checkParam(pointsGoods, goodsSku); - pointsGoods.setGoodsSku(goodsSku); - PromotionTools.checkPromotionTime(pointsGoods.getStartTime().getTime(), pointsGoods.getEndTime().getTime()); + @Transactional(rollbackFor = Exception.class) + public boolean savePointsGoodsBatch(List promotionsList) { + List promotionGoodsList = new ArrayList<>(); + for (PointsGoods pointsGoods : promotionsList) { + this.initPromotion(pointsGoods); + this.checkPromotions(pointsGoods); if (this.checkSkuDuplicate(pointsGoods.getSkuId(), null) == null) { - pointsGoods.setPromotionStatus(PromotionStatusEnum.NEW.name()); pointsGoods.setPromotionName("积分商品活动"); - pointsGoodsList1.add(pointsGoods); } else { - throw new ServiceException("商品id为" + pointsGoods.getSkuId() + "的商品已参加积分商品活动!"); + throw new ServiceException(ResultCode.PROMOTION_LOG_EXIST, "商品id为" + pointsGoods.getSkuId() + + "的商品已参加积分商品活动!"); } + GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); + pointsGoods.setStoreId(goodsSku.getStoreId()); + pointsGoods.setStoreName(goodsSku.getStoreName()); + } - this.saveBatch(pointsGoodsList1); - for (PointsGoodsVO pointsGoods : pointsGoodsList) { - this.mongoTemplate.save(pointsGoods); - this.addPointsGoodsPromotionTask(pointsGoods); + boolean saveBatch = this.saveBatch(promotionsList); + if (saveBatch) { + for (PointsGoods pointsGoods : promotionsList) { + GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); + PromotionGoods promotionGoods = new PromotionGoods(pointsGoods, goodsSku); + promotionGoods.setPromotionType(PromotionTypeEnum.POINTS_GOODS.name()); + promotionGoods.setScopeId(pointsGoods.getSkuId()); + promotionGoodsList.add(promotionGoods); + } + boolean saveOrUpdateBatch = this.promotionGoodsService.saveOrUpdateBatch(promotionGoodsList); + if (saveOrUpdateBatch) { + for (PointsGoods pointsGoods : promotionsList) { + this.updateEsGoodsIndex(pointsGoods); + } + } + } - return true; + return saveBatch; } /** - * 更新一个积分商品 + * 积分商品更新 * - * @param pointsGoods 编辑的积分商品信息 + * @param promotions 促销信息 * @return 是否更新成功 */ @Override - public boolean updatePointsGoods(PointsGoodsVO pointsGoods) { + @Transactional(rollbackFor = Exception.class) + public boolean updatePromotions(PointsGoods promotions) { boolean result = false; - PointsGoodsVO pointsGoodsVO = this.checkExist(pointsGoods.getId()); - GoodsSku goodsSku = this.checkSkuExist(pointsGoods.getSkuId()); - this.checkParam(pointsGoods, goodsSku); - pointsGoods.setGoodsSku(goodsSku); - if (this.checkSkuDuplicate(pointsGoods.getSkuId(), pointsGoods.getId()) == null) { - if (PromotionStatusEnum.START.name().equals(pointsGoods.getPromotionStatus()) || PromotionStatusEnum.END.name().equals(pointsGoods.getPromotionStatus())) { - throw new ServiceException("当前活动已开始/结束,无法编辑!"); + this.checkStatus(promotions); + this.checkPromotions(promotions); + if (this.checkSkuDuplicate(promotions.getSkuId(), promotions.getId()) == null) { + result = this.updateById(promotions); + if (this.updatePromotionsGoods(promotions)) { + this.updateEsGoodsIndex(promotions); } - PromotionTools.checkPromotionTime(pointsGoods.getStartTime().getTime(), pointsGoods.getEndTime().getTime()); - result = this.updateById(pointsGoods); - this.mongoTemplate.save(pointsGoods); - if (pointsGoods.getStartTime().getTime() != pointsGoodsVO.getStartTime().getTime()) { - PromotionMessage promotionMessage = new PromotionMessage(pointsGoods.getId(), PromotionTypeEnum.POINTS_GOODS.name(), PromotionStatusEnum.START.name(), pointsGoods.getStartTime(), pointsGoods.getEndTime()); - // 更新延时任务 - this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, - promotionMessage, - pointsGoodsVO.getStartTime().getTime(), - pointsGoods.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - DateUtil.getDelayTime(pointsGoods.getStartTime().getTime()), - rocketmqCustomProperties.getPromotionTopic()); - } - } return result; } /** - * 批量更新积分商品状态 + * 移除促销活动 * - * @param ids 积分商品id集合 - * @param promotionStatus 更新的状态 - * @return 是否更新成功 + * @param ids 促销活动id集合 + * @return 是否移除成功 */ @Override - public boolean updatePointsGoodsPromotionStatus(List ids, String promotionStatus) { + @Transactional(rollbackFor = Exception.class) + public boolean removePromotions(List ids) { for (String id : ids) { - PointsGoodsVO pointsGoodsVO = this.checkExist(id); - pointsGoodsVO.setPromotionStatus(PromotionStatusEnum.valueOf(promotionStatus).name()); - this.updateById(pointsGoodsVO); - this.mongoTemplate.save(pointsGoodsVO); - if (promotionStatus.equals(PromotionStatusEnum.START.name())) { - this.addPointsGoodsPromotionTask(pointsGoodsVO); - } else { - this.goodsIndexService.deleteEsGoodsPromotionIndexByList(Collections.singletonList(pointsGoodsVO.getSkuId()), PromotionTypeEnum.POINTS_GOODS); - this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, - pointsGoodsVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())), - rocketmqCustomProperties.getPromotionTopic()); + PointsGoods pointsGoods = this.getById(id); + if (pointsGoods == null) { + log.error(ResultCode.POINT_GOODS_NOT_EXIST.message()); + ids.remove(id); } } - return true; - } - - /** - * 批量删除积分商品 - * - * @param ids 积分商品id集合 - * @return 是否删除成功 - */ - @Override - public boolean deletePointsGoods(List ids) { - List skuIds = new ArrayList<>(); - for (String id : ids) { - PointsGoodsVO pointsGoodsVO = this.checkExist(id); - this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, - pointsGoodsVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())), - rocketmqCustomProperties.getPromotionTopic()); - skuIds.add(pointsGoodsVO.getSkuId()); - } - boolean result = this.removeByIds(ids); - this.goodsIndexService.deleteEsGoodsPromotionIndexByList(skuIds, PromotionTypeEnum.POINTS_GOODS); - Query query = new Query(); - query.addCriteria(new Criteria("id").in(ids)); - this.mongoTemplate.remove(query, PointsGoodsVO.class); - return result; + this.promotionGoodsService.deletePromotionGoods(ids); + return this.removeByIds(ids); } /** @@ -187,77 +151,106 @@ public class PointsGoodsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PointsGoods::getSkuId, skuId).eq(PointsGoods::getPromotionStatus, PromotionStatusEnum.START.name()); - List list = this.list(queryWrapper); - if (list.size() == 1) { - return list.get(0); + public PointsGoodsVO getPointsGoodsDetailBySkuId(String skuId) { + QueryWrapper queryWrapper = new QueryWrapper().eq("sku_id", skuId); + queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)); + PointsGoods pointsGoods = this.getOne(queryWrapper, false); + if (pointsGoods == null) { + log.error("skuId为" + skuId + "的积分商品不存在!"); + throw new ServiceException(); } - return null; + PointsGoodsVO pointsGoodsVO = new PointsGoodsVO(); + BeanUtils.copyProperties(pointsGoods, pointsGoodsVO); + pointsGoodsVO.setGoodsSku(this.checkSkuExist(pointsGoods.getSkuId())); + return pointsGoodsVO; } /** - * 根据条件查询积分商品 + * 检查促销参数 * - * @param searchParams 积分商品查询参数 - * @param page 分页参数 - * @return 积分商品查询结果 + * @param promotions 促销实体 */ @Override - public IPage getPointsGoodsByPage(PointsGoodsSearchParams searchParams, PageVO page) { - IPage pointsGoodsPage = new Page<>(); - Query query = searchParams.mongoQuery(); - if (page != null) { - PromotionTools.mongoQueryPageParam(query, page); - pointsGoodsPage.setSize(page.getPageSize()); - pointsGoodsPage.setCurrent(page.getPageNumber()); + public void checkPromotions(PointsGoods promotions) { + super.checkPromotions(promotions); + GoodsSku goodsSku = this.checkSkuExist(promotions.getSkuId()); + if (promotions.getActiveStock() > goodsSku.getQuantity()) { + throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_ERROR); } - List pointsGoodsVOS = this.mongoTemplate.find(query, PointsGoodsVO.class); - pointsGoodsPage.setRecords(pointsGoodsVOS); - pointsGoodsPage.setTotal(this.mongoTemplate.count(searchParams.mongoQuery(), PointsGoodsVO.class)); - return pointsGoodsPage; } - /** - * 添加积分商品mq任务 + * 检查促销状态 * - * @param pointsGoods 积分商品信息 + * @param promotions 促销实体 */ - private void addPointsGoodsPromotionTask(PointsGoodsVO pointsGoods) { - PromotionMessage promotionMessage = new PromotionMessage(pointsGoods.getId(), PromotionTypeEnum.POINTS_GOODS.name(), PromotionStatusEnum.START.name(), pointsGoods.getStartTime(), pointsGoods.getEndTime()); - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, - promotionMessage.getStartTime().getTime(), - promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - rocketmqCustomProperties.getPromotionTopic()); - // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(promotionMessage.getStartTime().getTime())); + @Override + public void checkStatus(PointsGoods promotions) { + super.checkStatus(promotions); } /** - * 检查mongo中积分商品存在 + * 更新促销商品信息 + * + * @param promotions 促销实体 + * @return 是否更新成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updatePromotionsGoods(PointsGoods promotions) { + this.promotionGoodsService.deletePromotionGoods(Collections.singletonList(promotions.getId())); + return this.promotionGoodsService.save(new PromotionGoods(promotions, this.checkSkuExist(promotions.getSkuId()))); + } + + /** + * 更新促销信息到商品索引 + * + * @param promotions 促销实体 + */ + @Override + public void updateEsGoodsIndex(PointsGoods promotions) { + super.updateEsGoodsIndex(promotions); + Map query = MapUtil.builder(new HashMap()).put("id", promotions.getSkuId()).build(); + Map update = MapUtil.builder(new HashMap()).put("points", promotions.getPoints()).build(); + //修改规格索引,发送mq消息 + Map updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(query, update); + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name(); + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback()); + } + + + @Override + public PromotionTypeEnum getPromotionType() { + return PromotionTypeEnum.POINTS_GOODS; + } + + /** + * 检查积分商品存在 * * @param id 积分商品id * @return 积分商品信息 */ - private PointsGoodsVO checkExist(String id) { - PointsGoodsVO pointsGoodsVO = this.mongoTemplate.findById(id, PointsGoodsVO.class); - if (pointsGoodsVO == null) { + private PointsGoods checkExist(String id) { + PointsGoods pointsGoods = this.getById(id); + if (pointsGoods == null) { log.error("id为" + id + "的积分商品不存在!"); throw new ServiceException(); } - return pointsGoodsVO; + return pointsGoods; } /** @@ -268,13 +261,15 @@ public class PointsGoodsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PointsGoods::getSkuId, skuId); - if (StrUtil.isNotEmpty(id)) { - queryWrapper.ne(PointsGoods::getId, id); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("sku_id", skuId); + if (CharSequenceUtil.isNotEmpty(id)) { + queryWrapper.ne("id", id); } - queryWrapper.ne(PointsGoods::getPromotionStatus, PromotionStatusEnum.END.name()); - return this.getOne(queryWrapper); + queryWrapper.and(i -> i + .or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)) + .or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW))); + return this.getOne(queryWrapper, false); } /** @@ -284,7 +279,7 @@ public class PointsGoodsServiceImpl extends ServiceImpl goodsSku.getQuantity()) { - throw new ServiceException("活动库存数量不能高于商品库存"); - } - } } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java index 22522cbf..03f36a30 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java @@ -1,249 +1,185 @@ package cn.lili.modules.promotion.serviceimpl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.BeanUtil; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.PageUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.vo.PageVO; -import cn.lili.modules.distribution.entity.dos.DistributionGoods; -import cn.lili.modules.distribution.service.DistributionGoodsService; import cn.lili.modules.goods.entity.dos.GoodsSku; -import cn.lili.modules.goods.entity.dto.GoodsSearchParams; -import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; -import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.entity.dto.GoodsSkuDTO; +import cn.lili.modules.goods.entity.vos.GoodsVO; +import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.goods.service.GoodsSkuService; -import cn.lili.modules.order.cart.entity.vo.CartSkuVO; -import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; -import cn.lili.modules.promotion.entity.dos.PointsGoods; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.SeckillApply; -import cn.lili.modules.promotion.entity.dto.BasePromotion; -import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; -import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.CouponVO; -import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; -import cn.lili.modules.promotion.entity.vos.SeckillVO; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.mapper.PromotionGoodsMapper; -import cn.lili.modules.promotion.service.PointsGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.SeckillApplyService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.modules.search.entity.dos.EsGoodsIndex; +import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.mybatis.util.PageUtil; 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 lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 促销商品业务层实现 * * @author Chopper - * @date 2021/3/18 9:22 上午 + * @since 2021/3/18 9:22 上午 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PromotionGoodsServiceImpl extends ServiceImpl implements PromotionGoodsService { - //Mongo - private final MongoTemplate mongoTemplate; - //Redis - private final StringRedisTemplate stringRedisTemplate; - //限时抢购申请 - private SeckillApplyService seckillApplyService; - //规格商品 - private GoodsSkuService goodsSkuService; - //积分商品 - private PointsGoodsService pointsGoodsService; - //分销商品 + private static final String SKU_ID_COLUMN = "sku_id"; + + /** + * Redis + */ @Autowired - private DistributionGoodsService distributionGoodsService; + private StringRedisTemplate stringRedisTemplate; + /** + * 秒杀活动申请 + */ + @Autowired + private SeckillApplyService seckillApplyService; + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; + + @Autowired + private GoodsService goodsService; + + @Autowired + private EsGoodsIndexService goodsIndexService; + + @Autowired + private Cache cache; @Override - public PromotionGoods findByPromotion(String promotionId, String skuId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId); - return new PromotionGoods(); + public List findSkuValidPromotion(String skuId, String storeIds) { + + GoodsSku sku = goodsSkuService.getGoodsSkuByIdFromCache(skuId); + if (sku == null) { + return new ArrayList<>(); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper.and(i -> i.or(j -> j.eq(SKU_ID_COLUMN, skuId)) + .or(n -> n.eq("scope_type", PromotionsScopeTypeEnum.ALL.name())) + .or(n -> n.and(k -> k.eq("scope_type", PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) + .and(l -> l.like("scope_id", sku.getCategoryPath()))))); + queryWrapper.and(i -> i.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)).or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW))); + queryWrapper.in("store_id", Arrays.asList(storeIds.split(","))); + return this.list(queryWrapper); } @Override - public void removePromotionGoods(List promotionGoodsList, PromotionTypeEnum promotionType) { - for (PromotionGoods promotionGoods : promotionGoodsList) { - promotionGoods.setDeleteFlag(true); - } - updateBatchById(promotionGoodsList); + public List findSkuValidPromotions(List skus) { + List categories = skus.stream().map(GoodsSku::getCategoryPath).collect(Collectors.toList()); + List skuIds = skus.stream().map(GoodsSku::getId).collect(Collectors.toList()); + List categoriesPath = new ArrayList<>(); + categories.forEach(i -> { + if (CharSequenceUtil.isNotEmpty(i)) { + categoriesPath.addAll(Arrays.asList(i.split(","))); + } + } + ); + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper.and(i -> i.or(j -> j.in(SKU_ID_COLUMN, skuIds)) + .or(n -> n.eq("scope_type", PromotionsScopeTypeEnum.ALL.name())) + .or(n -> n.and(k -> k.eq("scope_type", PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) + .and(l -> l.in("scope_id", categoriesPath))))); + queryWrapper.and(i -> i.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)).or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW))); + return this.list(queryWrapper); } @Override - public List findNowSkuPromotion(String skuId) { - return this.list(new LambdaQueryWrapper() - .eq(PromotionGoods::getSkuId, skuId) - .eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name())); - } - - @Override - public void updatePromotion(CartSkuVO cartSkuVO) { - Date date = DateUtil.getCurrentDayEndTime(); - //如果商品的促销更新时间在当前时间之前,则更新促销 - if (cartSkuVO.getUpdatePromotionTime().before(date)) { - List promotionGoods = this.findNowSkuPromotion(cartSkuVO.getGoodsSku().getId()); - cartSkuVO.setPromotions(promotionGoods); - //下一次更新时间 - cartSkuVO.setUpdatePromotionTime(date); - } - PointsGoods pointsGoods = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId()); - if (pointsGoods != null) { - cartSkuVO.setPoint(pointsGoods.getPoints().intValue()); - } - DistributionGoods distributionGoods=distributionGoodsService.distributionGoodsVOBySkuId(cartSkuVO.getGoodsSku().getId()); - if (distributionGoods != null) { - cartSkuVO.setDistributionGoods(distributionGoods); - } + public Page pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo) { + return this.page(PageUtil.initPage(pageVo), searchParams.queryWrapper()); } /** - * 获取购物车商品的促销活动 + * 获取促销商品信息 * - * @param cartSkuVO 购物车中的产品 + * @param searchParams 查询参数 + * @return 促销商品列表 */ @Override - public void getCartSkuPromotion(CartSkuVO cartSkuVO) { - Date date = DateUtil.getCurrentDayEndTime(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PromotionGoods::getSkuId, cartSkuVO.getGoodsSku().getId()).eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()); - queryWrapper.le(PromotionGoods::getStartTime, date); - // 获取有效的促销活动 - List promotionGoods = this.list(queryWrapper); - // 同步查询缓存中的促销活动商品的库存 - for (PromotionGoods promotionGood : promotionGoods) { - Integer goodsStock = this.getPromotionGoodsStock(PromotionTypeEnum.valueOf(promotionGood.getPromotionType()), promotionGood.getPromotionId(), promotionGood.getSkuId()); - promotionGood.setQuantity(goodsStock); - } - // 单独检查,添加适用于全品类的满优惠活动 - Query query = new Query(); - query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); - query.addCriteria(Criteria.where("startTime").lte(date)); - List fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); - for (FullDiscountVO fullDiscountVO : fullDiscountVOS) { - if (fullDiscountVO.getPromotionGoodsList() == null && fullDiscountVO.getNumber() == -1 && - cartSkuVO.getStoreId().equals(fullDiscountVO.getStoreId())) { - PromotionGoods p = new PromotionGoods(cartSkuVO.getGoodsSku()); - p.setPromotionId(fullDiscountVO.getId()); - p.setPromotionStatus(fullDiscountVO.getPromotionStatus()); - p.setPromotionType(PromotionTypeEnum.FULL_DISCOUNT.name()); - p.setStartTime(fullDiscountVO.getStartTime()); - p.setEndTime(fullDiscountVO.getEndTime()); - promotionGoods.add(p); - } - } - // 单独检查,添加适用于全品类的全平台或属于当前店铺的满优惠活动 - List couponVOS = mongoTemplate.find(query, CouponVO.class); - for (CouponVO couponVO : couponVOS) { - if (couponVO.getPromotionGoodsList() == null && couponVO.getScopeType().equals(CouponScopeTypeEnum.ALL.name()) && - (couponVO.getStoreId().equals("0") || cartSkuVO.getStoreId().equals(couponVO.getStoreId()))) { - PromotionGoods p = new PromotionGoods(cartSkuVO.getGoodsSku()); - p.setPromotionId(couponVO.getId()); - p.setPromotionStatus(couponVO.getPromotionStatus()); - p.setPromotionType(PromotionTypeEnum.COUPON.name()); - p.setStartTime(couponVO.getStartTime()); - p.setEndTime(couponVO.getEndTime()); - promotionGoods.add(p); - } - } - cartSkuVO.setPromotions(promotionGoods); - //下一次更新时间 - cartSkuVO.setUpdatePromotionTime(date); + public List listFindAll(PromotionGoodsSearchParams searchParams) { + return this.list(searchParams.queryWrapper()); + } + + /** + * 获取促销商品信息 + * + * @param searchParams 查询参数 + * @return 促销商品信息 + */ + @Override + public PromotionGoods getPromotionsGoods(PromotionGoodsSearchParams searchParams) { + return this.getOne(searchParams.queryWrapper(), false); + } + + /** + * 获取当前有效时间特定促销类型的促销商品信息 + * + * @param skuId 查询参数 + * @param promotionTypes 特定促销类型 + * @return 促销商品信息 + */ + @Override + public PromotionGoods getValidPromotionsGoods(String skuId, List promotionTypes) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(SKU_ID_COLUMN, skuId); + queryWrapper.in("promotion_type", promotionTypes); + queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)); + return this.getOne(queryWrapper, false); + } + + /** + * 获取当前有效时间特定促销类型的促销商品价格 + * + * @param skuId skuId + * @param promotionTypes 特定促销类型 + * @return 促销商品价格 + */ + @Override + public Double getValidPromotionsGoodsPrice(String skuId, List promotionTypes) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(SKU_ID_COLUMN, skuId); + queryWrapper.in("promotion_type", promotionTypes); + queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)); + return this.baseMapper.selectPromotionsGoodsPrice(queryWrapper); } @Override - public List getPromotionGoods(String skuId) { - long currTime = DateUtil.getDateline(); - String currDate = DateUtil.toString(currTime, DateUtil.STANDARD_DATE_NO_UNDERLINE_FORMAT); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(PromotionGoods::getSkuId, skuId) - .le(PromotionGoods::getStartTime, currTime) - .ge(PromotionGoods::getEndTime, currDate) - .ne(PromotionGoods::getPromotionType, PromotionTypeEnum.PINTUAN.name()) - .ne(PromotionGoods::getPromotionType, PromotionTypeEnum.SECKILL.name()); - return this.baseMapper.selectList(queryWrapper); - } - - @Override - public IPage getPromotionGoods(PromotionGoodsSearchParams searchParams, PageVO pageVo) { - IPage promotionGoodsPage = new Page<>(); - LambdaQueryWrapper queryChainWrapper = searchParams.queryWrapper(); - List promotionGoodsList = new ArrayList<>(); - Page page = this.page(PageUtil.initPage(pageVo), queryChainWrapper); - promotionGoodsPage.setSize(page.getSize()); - promotionGoodsPage.setTotal(page.getTotal()); - promotionGoodsPage.setPages(page.getPages()); - for (PromotionGoods record : page.getRecords()) { - PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(record); - promotionGoodsList.add(promotionGoodsDTO); + public Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime, String promotionId) { + if (promotionId != null) { + return this.baseMapper.selectInnerOverlapPromotionGoodsWithout(promotionType, skuId, startTime, endTime, promotionId); + } else { + return this.baseMapper.selectInnerOverlapPromotionGoods(promotionType, skuId, startTime, endTime); } - promotionGoodsPage.setRecords(promotionGoodsList); - return promotionGoodsPage; - } - - @Override - public IPage getCurrentPromotionGoods(String promotionType, PageVO pageVo) { - IPage promotionGoodsPage = new Page<>(); - promotionGoodsPage.setSize(pageVo.getPageSize()); - promotionGoodsPage.setCurrent(pageVo.getPageNumber()); - Date now = new Date(); - Query query = new Query(); - query.addCriteria(Criteria.where("startTime").lt(now)); - query.addCriteria(Criteria.where("endTime").gt(now)); - List promotionGoodsDTOList = new ArrayList<>(); - int total = 0; - // 根据促销活动类型的不同,将满足当前促销活动类型且正在进行的促销商品返回出去 - switch (PromotionTypeEnum.valueOf(promotionType)) { - case FULL_DISCOUNT: - List fullDiscountVOS = this.mongoTemplate.find(query, FullDiscountVO.class); - this.setFullDiscountPromotionGoods(promotionGoodsPage, fullDiscountVOS, pageVo); - break; - case COUPON: - List couponVOS = this.mongoTemplate.find(query, CouponVO.class); - for (CouponVO couponVO : couponVOS) { - if (couponVO != null && couponVO.getPromotionGoodsList() == null) { - IPage page = this.getAllGoodsSkuToPromotionGoodsByPage(couponVO.getStoreId(), couponVO, pageVo); - promotionGoodsDTOList.addAll(page.getRecords()); - total += page.getTotal(); - } - } - promotionGoodsPage.setRecords(promotionGoodsDTOList.subList(0, pageVo.getPageSize())); - promotionGoodsPage.setTotal(total); - break; - case SECKILL: - case POINTS_GOODS: - return promotionGoodsPage; - default: - break; - } - if (promotionGoodsPage.getRecords() == null || promotionGoodsPage.getRecords().isEmpty()) { - promotionGoodsPage = this.getGoodsSkuToPromotionGoodsByPage(promotionType, pageVo); - } - return promotionGoodsPage; - } - - - @Override - public Integer findInnerOverlapPromotionGoods(String promotionType, String skuId, Date startTime, Date endTime) { - return this.baseMapper.selectInnerOverlapPromotionGoods(promotionType, skuId, startTime, endTime); } /** @@ -259,192 +195,185 @@ public class PromotionGoodsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId); - return this.getOne(queryWrapper); + public List getPromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, List skuId) { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionType(typeEnum.name()); + searchParams.setPromotionId(promotionId); + searchParams.setSkuIds(skuId); + //获取促销商品,如果不存在促销商品,则返回0 + List promotionGoods = this.listFindAll(searchParams); + //接收数据 + List result = new ArrayList<>(skuId.size()); + for (String sid : skuId) { + Integer stock = null; + for (PromotionGoods pg : promotionGoods) { + if (sid.equals(pg.getSkuId())) { + stock = pg.getQuantity(); + } + } + //如果促销商品不存在,给一个默认值 + if (stock == null) { + stock = 0; + } + result.add(stock); + } + return result; } /** * 更新促销活动商品库存 * - * @param typeEnum 促销商品类型 - * @param promotionId 促销活动id - * @param skuId 商品skuId - * @param quantity 更新后的库存数量 + * @param promotionGoodsList 更新促销活动商品信息 */ @Override - public void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity) { - String promotionStockKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(typeEnum, promotionId, skuId); - if (typeEnum.equals(PromotionTypeEnum.SECKILL)) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId); - SeckillApply seckillApply = seckillApplyService.getOne(queryWrapper); - if (seckillApply == null) { - throw new ServiceException("当前限时抢购商品不存在!"); - } - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId); - updateWrapper.set(SeckillApply::getQuantity, quantity); - seckillApplyService.update(updateWrapper); - SeckillVO seckillVO = mongoTemplate.findById(promotionId, SeckillVO.class); - if (seckillVO != null && seckillApply.getPromotionApplyStatus() != null) { - for (SeckillApply apply : seckillVO.getSeckillApplyList()) { - if (apply.getSkuId().equals(skuId)) { - apply.setQuantity(quantity); - } + @Transactional(rollbackFor = Exception.class) + public void updatePromotionGoodsStock(List promotionGoodsList) { + for (PromotionGoods promotionGoods : promotionGoodsList) { + String promotionStockKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionGoods.getPromotionType()), promotionGoods.getPromotionId(), promotionGoods.getSkuId()); + if (promotionGoods.getPromotionType().equals(PromotionTypeEnum.SECKILL.name())) { + SeckillSearchParams searchParams = new SeckillSearchParams(); + searchParams.setSeckillId(promotionGoods.getPromotionId()); + searchParams.setSkuId(promotionGoods.getSkuId()); + SeckillApply seckillApply = this.seckillApplyService.getSeckillApply(searchParams); + if (seckillApply != null) { + seckillApplyService.updateSeckillApplySaleNum(promotionGoods.getPromotionId(), promotionGoods.getSkuId(), promotionGoods.getNum()); } - this.mongoTemplate.save(seckillVO); } - } else { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId); - updateWrapper.set(PromotionGoods::getQuantity, quantity); - this.update(updateWrapper); - } - stringRedisTemplate.opsForValue().set(promotionStockKey, quantity.toString()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(PromotionGoods::getPromotionType, promotionGoods.getPromotionType()).eq(PromotionGoods::getPromotionId, promotionGoods.getPromotionId()).eq(PromotionGoods::getSkuId, promotionGoods.getSkuId()); + updateWrapper.set(PromotionGoods::getQuantity, promotionGoods.getQuantity()).set(PromotionGoods::getNum, promotionGoods.getNum()); + + this.update(updateWrapper); + stringRedisTemplate.opsForValue().set(promotionStockKey, promotionGoods.getQuantity().toString()); + } + } + + @Override + public void updatePromotionGoodsStock(String skuId, Integer quantity) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PromotionGoods::getSkuId, skuId); + this.list(queryWrapper).forEach(promotionGoods -> { + String promotionStockKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionGoods.getPromotionType()), promotionGoods.getPromotionId(), promotionGoods.getSkuId()); + cache.remove(promotionStockKey); + }); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(PromotionGoods::getSkuId, skuId); + updateWrapper.set(PromotionGoods::getQuantity, quantity); + this.update(updateWrapper); } /** - * 分页获取根据条件获取促销商品 + * 更新促销活动商品库存 * - * @param goodsName 商品名称 - * @param categoryPath 商品分类 - * @param promotionType 促销类型 - * @param pageVo 分页参数 - * @return 促销商品信息 + * @param promotionGoods 促销信息 */ @Override - public IPage getPromotionGoodsPage(String goodsName, String categoryPath, String promotionType, PageVO pageVo) { + public void updatePromotionGoodsByPromotions(PromotionGoods promotionGoods) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (CharSequenceUtil.isNotEmpty(goodsName)) { - queryWrapper.like(PromotionGoods::getGoodsName, goodsName); - } - if (CharSequenceUtil.isNotEmpty(categoryPath)) { - queryWrapper.like(PromotionGoods::getCategoryPath, categoryPath); - } - if (CharSequenceUtil.isNotEmpty(promotionType)) { - queryWrapper.eq(PromotionGoods::getPromotionType, promotionType); - } - return this.page(PageUtil.initPage(pageVo), queryWrapper); + queryWrapper.eq(PromotionGoods::getPromotionId, promotionGoods.getPromotionId()); + this.remove(queryWrapper); + this.save(promotionGoods); } - private void setFullDiscountPromotionGoods(IPage promotionGoodsPage, List fullDiscountVOS, PageVO pageVo) { - List promotionGoodsDTOList = new ArrayList<>(); - int total = 0; - for (FullDiscountVO fullDiscountVO : fullDiscountVOS) { - if (fullDiscountVO != null && fullDiscountVO.getPromotionGoodsList() == null) { - IPage page = this.getAllGoodsSkuToPromotionGoodsByPage(fullDiscountVO.getStoreId(), fullDiscountVO, pageVo); - promotionGoodsDTOList.addAll(page.getRecords()); - total += page.getTotal(); + /** + * 删除促销商品 + * + * @param promotionId 促销活动id + * @param skuIds skuId + */ + @Override + public void deletePromotionGoods(String promotionId, List skuIds) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(PromotionGoods::getPromotionId, promotionId).in(PromotionGoods::getSkuId, skuIds); + this.remove(queryWrapper); + } + + /** + * 删除促销促销商品 + * + * @param promotionIds 促销活动id + */ + @Override + public void deletePromotionGoods(List promotionIds) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().in(PromotionGoods::getPromotionId, promotionIds); + this.remove(queryWrapper); + } + + @Override + public void deletePromotionGoodsByGoods(List goodsIds) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().in(PromotionGoods::getGoodsId, goodsIds); + this.remove(queryWrapper); + } + + + /** + * 根据参数删除促销商品 + * + * @param searchParams 查询参数 + */ + @Override + public void deletePromotionGoods(PromotionGoodsSearchParams searchParams) { + this.remove(searchParams.queryWrapper()); + } + + @Override + public Map getCurrentGoodsPromotion(GoodsSku dataSku, String cartType) { + Map promotionMap; + EsGoodsIndex goodsIndex = goodsIndexService.findById(dataSku.getId()); + if (goodsIndex == null) { + GoodsVO goodsVO = this.goodsService.getGoodsVO(dataSku.getGoodsId()); + goodsIndex = goodsIndexService.getResetEsGoodsIndex(dataSku, goodsVO.getGoodsParamsDTOList()); + } + if (goodsIndex.getPromotionMap() != null && !goodsIndex.getPromotionMap().isEmpty()) { + if (goodsIndex.getPromotionMap().keySet().stream().anyMatch(i -> i.contains(PromotionTypeEnum.SECKILL.name())) || (goodsIndex.getPromotionMap().keySet().stream().anyMatch(i -> i.contains(PromotionTypeEnum.PINTUAN.name())) && CartTypeEnum.PINTUAN.name().equals(cartType))) { + Optional> containsPromotion = goodsIndex.getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.SECKILL.name()) || i.getKey().contains(PromotionTypeEnum.PINTUAN.name())).findFirst(); + containsPromotion.ifPresent(stringObjectEntry -> this.setGoodsPromotionInfo(dataSku, stringObjectEntry)); } + promotionMap = goodsIndex.getPromotionMap(); + } else { + promotionMap = null; + dataSku.setPromotionFlag(false); + dataSku.setPromotionPrice(null); } - if (!fullDiscountVOS.isEmpty() && !promotionGoodsDTOList.isEmpty()) { - promotionGoodsPage.setRecords(promotionGoodsDTOList.subList(0, pageVo.getPageSize())); - promotionGoodsPage.setTotal(total); + return promotionMap; + } + + private void setGoodsPromotionInfo(GoodsSku dataSku, Map.Entry promotionInfo) { + JSONObject promotionsObj = JSONUtil.parseObj(promotionInfo.getValue()); + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setSkuId(dataSku.getId()); + searchParams.setPromotionId(promotionsObj.get("id").toString()); + PromotionGoods promotionsGoods = this.getPromotionsGoods(searchParams); + if (promotionsGoods != null && promotionsGoods.getPrice() != null) { + dataSku.setPromotionFlag(true); + dataSku.setPromotionPrice(promotionsGoods.getPrice()); + } else { + dataSku.setPromotionFlag(false); + dataSku.setPromotionPrice(null); } } - private IPage getGoodsSkuToPromotionGoodsByPage(String promotionType, PageVO pageVo) { - Date date = new Date(); - IPage promotionGoodsPage = new Page<>(); - LambdaQueryWrapper queryChainWrapper = new LambdaQueryWrapper() - .eq(PromotionGoods::getPromotionType, PromotionTypeEnum.valueOf(promotionType).name()) - .le(PromotionGoods::getStartTime, date).ge(PromotionGoods::getEndTime, date); - List promotionGoodsList = new ArrayList<>(); - Page page = this.page(PageUtil.initPage(pageVo), queryChainWrapper); - promotionGoodsPage.setTotal(page.getTotal()); - promotionGoodsPage.setPages(page.getPages()); - List records = page.getRecords(); - for (PromotionGoods record : records) { - PromotionGoodsDTO promotionGoodsDTO = this.wrapperPromotionGoodsDTO(record); - promotionGoodsList.add(promotionGoodsDTO); - } - promotionGoodsPage.setRecords(promotionGoodsList); - return promotionGoodsPage; - } - - private PromotionGoodsDTO wrapperPromotionGoodsDTO(PromotionGoods promotionGoods) { - PromotionGoodsDTO promotionGoodsDTO = new PromotionGoodsDTO(); - GoodsSku goodsSku = goodsSkuService.getById(promotionGoods.getSkuId()); - BeanUtil.copyProperties(promotionGoods, promotionGoodsDTO); - if (goodsSku != null) { - promotionGoodsDTO.setGoodsId(goodsSku.getGoodsId()); - promotionGoodsDTO.setGoodsImage(goodsSku.getThumbnail()); - promotionGoodsDTO.setGoodsName(goodsSku.getGoodsName()); - promotionGoodsDTO.setOriginPrice(goodsSku.getPrice()); - } - return promotionGoodsDTO; - } - - private IPage getAllGoodsSkuToPromotionGoodsByPage(String storeId, BasePromotion promotion, PageVO pageVo) { - IPage promotionGoodsPage = new Page<>(); - List promotionGoodsList = new ArrayList<>(); - GoodsSearchParams searchParams = new GoodsSearchParams(); - searchParams.setStoreId(storeId); - searchParams.setMarketEnable(GoodsStatusEnum.UPPER.name()); - searchParams.setIsAuth(GoodsAuthEnum.PASS.name()); - searchParams.setPageNumber(pageVo.getPageNumber()); - searchParams.setPageSize(pageVo.getPageSize()); - searchParams.setSort(pageVo.getSort()); - searchParams.setOrder(pageVo.getOrder()); - IPage goodsSkuByPage = goodsSkuService.getGoodsSkuByPage(searchParams); - // 将查询到的商品sku转换为促销商品 - for (GoodsSku record : goodsSkuByPage.getRecords()) { - PromotionGoodsDTO promotionGoods = new PromotionGoodsDTO(record); - promotionGoods.setGoodsImage(record.getThumbnail()); - promotionGoods.setStartTime(promotion.getStartTime()); - promotionGoods.setEndTime(promotion.getEndTime()); - promotionGoods.setTitle(promotion.getPromotionName()); - promotionGoodsList.add(promotionGoods); - } - promotionGoodsPage.setSize(goodsSkuByPage.getSize()); - promotionGoodsPage.setTotal(goodsSkuByPage.getTotal()); - promotionGoodsPage.setPages(goodsSkuByPage.getPages()); - promotionGoodsPage.setRecords(promotionGoodsList); - return promotionGoodsPage; - } - - @Autowired - public void setGoodsSkuService(GoodsSkuService goodsSkuService) { - this.goodsSkuService = goodsSkuService; - } - - @Autowired - public void setPointsGoodsService(PointsGoodsService pointsGoodsService) { - this.pointsGoodsService = pointsGoodsService; - } - - @Autowired - public void setSeckillApplyService(SeckillApplyService seckillApplyService) { - this.seckillApplyService = seckillApplyService; - } - - @Autowired - public void setDistributionGoodsService(DistributionGoodsService distributionGoodsService) { - this.distributionGoodsService = distributionGoodsService; - } - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java deleted file mode 100644 index 335fc184..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java +++ /dev/null @@ -1,513 +0,0 @@ -package cn.lili.modules.promotion.serviceimpl; - -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.utils.CurrencyUtil; -import cn.lili.modules.goods.entity.dos.GoodsSku; -import cn.lili.modules.goods.service.GoodsSkuService; -import cn.lili.modules.promotion.entity.dos.*; -import cn.lili.modules.promotion.entity.dto.*; -import cn.lili.modules.promotion.entity.enums.*; -import cn.lili.modules.promotion.service.PromotionGoodsService; -import cn.lili.modules.promotion.service.PromotionPriceService; -import cn.lili.modules.promotion.service.SeckillApplyService; -import cn.lili.modules.search.entity.dos.EsGoodsIndex; -import cn.lili.modules.search.service.EsGoodsSearchService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 促销价格计算业务层实现 - * - * @author paulG - * @date 2020/8/21 - **/ -@Service -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class PromotionPriceServiceImpl implements PromotionPriceService { - - //ES商品 - private final EsGoodsSearchService goodsSearchService; - //限时抢购申请 - private final SeckillApplyService seckillApplyService; - //促销商品 - private final PromotionGoodsService promotionGoodsService; - //规格商品 - private final GoodsSkuService goodsSkuService; - - @Override - public PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList) { - PromotionPriceDTO promotionPrice = new PromotionPriceDTO(); - if (!tradeSkuList.isEmpty()) { - // 拆分出SkuId列表 - List skuIds = tradeSkuList.parallelStream().map(PromotionPriceParamDTO::getSkuId).collect(Collectors.toList()); - // 参与计算的ES商品SKU及其促销信息列表 - List esGoodsSkus = goodsSearchService.getEsGoodsBySkuIds(skuIds); - // 参与计算的缓存中的商品SKU列表 - List goodsSkus = goodsSkuService.getGoodsSkuByIdFromCache(skuIds); - // 计算价格 - promotionPrice = this.calculationPromotionPrice(tradeSkuList, memberCouponList, esGoodsSkus, goodsSkus); - } - return promotionPrice; - } - - /** - * 促销计算 - * - * @param tradeSkuList 促销计算参数列表 - * @param memberCouponList 参与促销计算的优惠券列表 - * @param esGoodsSkus 参与计算的ES商品SKU及其促销信息列表 - * @param goodsSkus 参与计算的缓存中的商品SKU列表 - * @return 促销计算结果 - */ - private PromotionPriceDTO calculationPromotionPrice(List tradeSkuList, List memberCouponList, List esGoodsSkus, List goodsSkus) { - PromotionPriceDTO promotionPrice = new PromotionPriceDTO(); - - // 单品商品SKU促销计算结果列表 - List priceDTOList = this.packageGoodsSkuPromotionPrice(tradeSkuList, esGoodsSkus, goodsSkus); - - // 将使用的优惠券根据店铺分类 - Map> couponCollect = memberCouponList.parallelStream().collect(Collectors.groupingBy(MemberCoupon::getStoreId)); - - double couponTotalPrice = 0; - - // 根据卖家分组商品信息 - Map> storeCollect = priceDTOList.parallelStream().collect(Collectors.groupingBy(GoodsSkuPromotionPriceDTO::getStoreId)); - List storePromotionPriceList = new ArrayList<>(); - for (Map.Entry> entry : storeCollect.entrySet()) { - StorePromotionPriceDTO storePromotionPrice = new StorePromotionPriceDTO(); - storePromotionPrice.setStoreId(entry.getKey()); - storePromotionPrice.setGoodsSkuPromotionPriceList(entry.getValue()); - Optional firstFullDiscount = entry.getValue().parallelStream().filter(i -> i.getPromotionId() != null && i.getPromotionType().equals(PromotionTypeEnum.FULL_DISCOUNT.name())).findFirst(); - if (firstFullDiscount.isPresent()) { - String promotionId = firstFullDiscount.get().getPromotionId(); - // 是否存在满优惠促销活动 - String esPromotionFullDiscountKey = PromotionTypeEnum.FULL_DISCOUNT + "-" + promotionId; - if (CharSequenceUtil.isNotEmpty(promotionId)) { - FullDiscount fullDiscount = null; - for (EsGoodsIndex skus : esGoodsSkus) { - // 检查是否为正在进行的满优惠活动 - if (skus.getPromotionMap() != null && skus.getPromotionMap().containsKey(esPromotionFullDiscountKey)) { - fullDiscount = (FullDiscount) skus.getPromotionMap().get(esPromotionFullDiscountKey); - break; - } - } - if (fullDiscount != null) { - // 计算满优惠活动 - this.calculationFullDiscount(fullDiscount, storePromotionPrice); - } - } - } - - // 获取店铺优惠券 - List storeCoupons = couponCollect.get(entry.getKey()); - if (storeCoupons != null && !storeCoupons.isEmpty()) { - // 计算店铺优惠券活动 - couponTotalPrice = this.calculationCoupon(storeCoupons, entry.getValue()); - storePromotionPrice.setTotalCouponPrice(couponTotalPrice); - storePromotionPrice.setTotalFinalePrice(storePromotionPrice.getGoodsSkuPromotionPriceList().parallelStream().mapToDouble(GoodsSkuPromotionPriceDTO::getTotalFinalePrice).sum()); - } - - // 累加除商品促销信息之外的信息 - this.accumulationGoodsSkuPromotionOther(entry.getValue(), storePromotionPrice); - - storePromotionPriceList.add(storePromotionPrice); - } - // 获取平台优惠券 - List platformCoupons = couponCollect.get("platform"); - if (platformCoupons != null && !platformCoupons.isEmpty()) { - // 计算平台优惠券活动 - couponTotalPrice = CurrencyUtil.add(couponTotalPrice, this.calculationCoupon(platformCoupons, priceDTOList)); - } - promotionPrice.setStorePromotionPriceList(storePromotionPriceList); - promotionPrice.setTotalCouponPrice(couponTotalPrice); - promotionPrice.setTotalOriginPrice(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalOriginPrice).sum()); - promotionPrice.setTotalPoints(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalPoints).sum()); - promotionPrice.setTotalDiscountPrice(storePromotionPriceList.parallelStream().mapToDouble(StorePromotionPriceDTO::getTotalDiscountPrice).sum()); - // 最终结算金额 = 商品原价格合计 - 总优惠价格合计 - 优惠券合计 - double totalFinalePrice = CurrencyUtil.sub(CurrencyUtil.sub(promotionPrice.getTotalOriginPrice(), promotionPrice.getTotalDiscountPrice()), promotionPrice.getTotalCouponPrice()); - promotionPrice.setTotalFinalePrice(totalFinalePrice); - return promotionPrice; - } - - - /** - * 单品SKU的促销计算 - * - * @param tradeSkuList 交易商品信息列表 - * @param esGoodsSkus 参与计算的ES商品SKU及其促销信息列表 - * @param goodsSkus 参与计算的缓存中的商品SKU列表 - * @return 单品SKU促销计算结果列表 - */ - private List packageGoodsSkuPromotionPrice(List tradeSkuList, List esGoodsSkus, List goodsSkus) { - List priceDTOList = new ArrayList<>(); - for (GoodsSku skus : goodsSkus) { - List collect = esGoodsSkus.parallelStream().filter(i -> i != null && i.getId().equals(skus.getId())).collect(Collectors.toList()); - if (!collect.isEmpty()) { - EsGoodsIndex esGoodsIndex = collect.get(0); - // 找出当前商品相应的结算参数 - PromotionPriceParamDTO tradeSku = tradeSkuList.parallelStream().filter(i -> i.getSkuId().equals(skus.getId())).findFirst().orElse(new PromotionPriceParamDTO()); - GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice = new GoodsSkuPromotionPriceDTO(skus, tradeSku.getNum()); - // 商品原价总价 = 商品原价 * 数量 - goodsSkuPromotionPrice.setTotalOriginalPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getOriginalPrice(), tradeSku.getNum())); - // 获取当前商品所有参加的促销活动 - Map promotionMap = esGoodsIndex.getPromotionMap(); - // 是否计算拼团促销 - String pintuanId = tradeSku.getPintuanId() != null ? tradeSku.getPintuanId() : null; - // 如果商品促销列表存在促销活动 - this.calculationPromotionMap(promotionMap, goodsSkuPromotionPrice, esGoodsIndex, pintuanId); - - goodsSkuPromotionPrice.setTotalOriginalPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getOriginalPrice(), goodsSkuPromotionPrice.getNumber())); - goodsSkuPromotionPrice.setTotalPoints(CurrencyUtil.mul(goodsSkuPromotionPrice.getPoints(), goodsSkuPromotionPrice.getNumber())); - goodsSkuPromotionPrice.setTotalDiscountPrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getDiscountPrice(), goodsSkuPromotionPrice.getNumber())); - goodsSkuPromotionPrice.setTotalFinalePrice(CurrencyUtil.mul(goodsSkuPromotionPrice.getFinalePrice(), goodsSkuPromotionPrice.getNumber())); - priceDTOList.add(goodsSkuPromotionPrice); - } - } - return priceDTOList; - } - - /** - * 促销计算(限时抢购,拼团) - * - * @param promotionMap 当前商品所有参加的促销活动 - * @param goodsSkuPromotionPrice 商品SKU促销计算信息 - * @param esGoodsIndex ES商品信息 - * @param pintuanId 拼团id,标示是否计算拼团活动 - */ - private void calculationPromotionMap(Map promotionMap, GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice, EsGoodsIndex esGoodsIndex, String pintuanId) { - if (promotionMap != null && !promotionMap.isEmpty()) { - // 检查当前商品是否存在限时抢购活动 - Optional existSeckill = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.SECKILL.name())).findFirst(); - if (existSeckill.isPresent()) { - Seckill seckill = (Seckill) promotionMap.get(existSeckill.get()); - // 计算限时抢购促销 - this.calculationSeckill(seckill, goodsSkuPromotionPrice); - seckill.setPromotionName(PromotionTypeEnum.SECKILL.name()); - goodsSkuPromotionPrice.getJoinPromotion().add(seckill); - } - - // 检查当前商品是否存在拼团活动 - Optional existPintuan = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.PINTUAN.name())).findFirst(); - if (existPintuan.isPresent() && pintuanId != null) { - Pintuan pintuan = (Pintuan) promotionMap.get(existPintuan.get()); - // 优惠的总价格 = 原商品总价 - 优惠后的商品总价 - double discountPrice = CurrencyUtil.sub(goodsSkuPromotionPrice.getOriginalPrice(), esGoodsIndex.getPromotionPrice()); - goodsSkuPromotionPrice.setDiscountPrice(discountPrice); - goodsSkuPromotionPrice.setFinalePrice(esGoodsIndex.getPromotionPrice()); - pintuan.setPromotionName(PromotionTypeEnum.PINTUAN.name()); - goodsSkuPromotionPrice.getJoinPromotion().add(pintuan); - } - - // 检查当前商品是否存在满优惠活动 - Optional existFullDiscount = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.FULL_DISCOUNT.name())).findFirst(); - if (existFullDiscount.isPresent()) { - FullDiscount discount = (FullDiscount) promotionMap.get(existFullDiscount.get()); - goodsSkuPromotionPrice.setPromotionId(discount.getId()); - goodsSkuPromotionPrice.setPromotionType(PromotionTypeEnum.FULL_DISCOUNT.name()); - } - - - Optional existPointsGoods = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.POINTS_GOODS.name())).findFirst(); - if (existPointsGoods.isPresent()) { - PointsGoods pointsGoods = (PointsGoods) promotionMap.get(existPointsGoods.get()); - goodsSkuPromotionPrice.setPoints(pointsGoods.getPoints().doubleValue()); - } - } - } - - /** - * 优惠券计算 - * - * @param coupons 使用的优惠券列表 - * @param list 商品促销价格信息列表 - * @return 优惠券总金额 - */ - private double calculationCoupon(List coupons, List list) { - double couponTotalPrice = 0; - for (MemberCoupon coupon : coupons) { - if (CouponScopeTypeEnum.PORTION_GOODS.name().equals(coupon.getScopeType())) { - String[] scopeSkuIds = coupon.getScopeId().split(","); - List conformCollect = list.parallelStream().filter(i -> Arrays.asList(scopeSkuIds).contains(i.getSkuId())).collect(Collectors.toList()); - // 单个优惠券计算 - couponTotalPrice = this.calculationSingleCoupon(coupon, conformCollect); - } else if (CouponScopeTypeEnum.ALL.name().equals(coupon.getScopeType())) { - // 单个优惠券计算 - couponTotalPrice = this.calculationSingleCoupon(coupon, list); - } else if (CouponScopeTypeEnum.PORTION_GOODS_CATEGORY.name().equals(coupon.getScopeType()) || CouponScopeTypeEnum.PORTION_SHOP_CATEGORY.name().equals(coupon.getScopeType())) { - List collect = this.filterCoupon(coupon, list); - // 单个优惠券计算 - couponTotalPrice = this.calculationSingleCoupon(coupon, collect); - } - } - return couponTotalPrice; - } - - /** - * 过滤优惠券范围内分类 商品sku促销价格信息列表 - * - * @param coupon 会员优惠券信息 - * @param list 过滤的列表 - * @return 过滤后的商品价格信息列表 - */ - private List filterCoupon(MemberCoupon coupon, List list) { - String[] scopeCategories = coupon.getScopeId().split(","); - - // 过滤优惠券范围内分类 商品sku促销价格信息列表 - return list.parallelStream().filter(i -> { - String[] split; - if (CouponScopeTypeEnum.PORTION_GOODS_CATEGORY.name().equals(coupon.getScopeType())) { - split = i.getCategoryPath().split("\\|"); - } else { - split = i.getStoreCategoryPath().split("\\|"); - } - for (String s : split) { - if (Arrays.asList(scopeCategories).contains(s)) { - return true; - } - } - return false; - }).collect(Collectors.toList()); - } - - /** - * 单个优惠券计算 - * - * @param coupon 使用的优惠券信息 - * @param conformCollect 商品促销价格信息列表 - * @return 优惠券总金额 - */ - private double calculationSingleCoupon(MemberCoupon coupon, List conformCollect) { - double couponTotalPrice = 0; - // 合计优惠券范围内的所有商品的原价 - double totalPrice = conformCollect.parallelStream().mapToDouble(GoodsSkuPromotionPriceDTO::getOriginalPrice).sum(); - - double discountPrice = 0; - // 根据优惠券优惠类型,判断是否满足条件 - if (CouponTypeEnum.PRICE.name().equals(coupon.getCouponType()) && coupon.getConsumeThreshold() <= totalPrice) { - couponTotalPrice = CurrencyUtil.add(couponTotalPrice, coupon.getPrice()); - discountPrice = coupon.getPrice(); - } else if (CouponTypeEnum.DISCOUNT.name().equals(coupon.getCouponType())) { - double fullRate = coupon.getDiscount() >= 10 ? coupon.getDiscount() / 100 : coupon.getDiscount() / 10; - double discountRatePrice = CurrencyUtil.sub(totalPrice, CurrencyUtil.mul(totalPrice, fullRate)); - - couponTotalPrice = CurrencyUtil.add(couponTotalPrice, discountRatePrice); - discountPrice = discountRatePrice; - // 消费限额判断 -// if (coupon.getConsumeThreshold() >= discountRatePrice) { -// couponTotalPrice = CurrencyUtil.add(couponTotalPrice, discountRatePrice); -// discountPrice = discountRatePrice; -// } else { -// couponTotalPrice = CurrencyUtil.add(couponTotalPrice, coupon.getConsumeThreshold()); -// discountPrice = coupon.getConsumeThreshold(); -// } - } - - // 分配到每个商品的优惠券金额 - double distributePrice = CurrencyUtil.div(discountPrice, conformCollect.size()); - for (GoodsSkuPromotionPriceDTO goodsSkuPromotionPriceDTO : conformCollect) { - if (goodsSkuPromotionPriceDTO.getFinalePrice() != null) { - goodsSkuPromotionPriceDTO.setFinalePrice(CurrencyUtil.sub(goodsSkuPromotionPriceDTO.getFinalePrice(), distributePrice)); - } else { - goodsSkuPromotionPriceDTO.setFinalePrice(CurrencyUtil.sub(goodsSkuPromotionPriceDTO.getOriginalPrice(), distributePrice)); - } - goodsSkuPromotionPriceDTO.setCouponPrice(distributePrice); - goodsSkuPromotionPriceDTO.setTotalFinalePrice(CurrencyUtil.mul(goodsSkuPromotionPriceDTO.getFinalePrice(), goodsSkuPromotionPriceDTO.getNumber())); - BasePromotion basePromotion = new BasePromotion(); - basePromotion.setId(coupon.getId()); - if (coupon.getIsPlatform() != null && Boolean.TRUE.equals(coupon.getIsPlatform())) { - basePromotion.setPromotionName("platformCoupon"); - } else { - basePromotion.setPromotionName("storeCoupon"); - } - basePromotion.setStartTime(coupon.getStartTime()); - basePromotion.setEndTime(coupon.getEndTime()); - goodsSkuPromotionPriceDTO.getJoinPromotion().add(basePromotion); - } - return couponTotalPrice; - } - - /** - * 计算限时抢购 - * - * @param seckill 限时抢购信息 - * @param promotionPrice 商品SKU的计算促销信息 - */ - private void calculationSeckill(Seckill seckill, GoodsSkuPromotionPriceDTO promotionPrice) { - // 检查 活动有效时间 及 活动有效状态 - if (checkPromotionValidTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL.name(), seckill.getId()) && seckill.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SeckillApply::getSkuId, promotionPrice.getSkuId()).eq(SeckillApply::getSeckillId, seckill.getId()); - SeckillApply seckillApply = seckillApplyService.getOne(queryWrapper); - if (seckillApply.getPromotionApplyStatus().equals(PromotionApplyStatusEnum.PASS.name())) { - Integer quantity = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.SECKILL, seckill.getId(), seckillApply.getSkuId()); - int seckillTotalSaleNum = seckillApply.getSalesNum() + promotionPrice.getNumber(); - if (quantity >= seckillTotalSaleNum) { - // 优惠的价格 = 原商品价 - 优惠后的商品价 - double discountPrice = CurrencyUtil.sub(promotionPrice.getOriginalPrice(), seckillApply.getPrice()); - promotionPrice.setDiscountPrice(discountPrice); - promotionPrice.setFinalePrice(seckillApply.getPrice()); - } else { - log.error("购买数量超出限时抢购剩余数量"); - } - } - } - } - - /** - * 计算满优惠促销 - * - * @param fullDiscount 满优惠信息 - * @param storePromotionPriceDTO 店铺促销计算信息 - */ - private void calculationFullDiscount(FullDiscount fullDiscount, StorePromotionPriceDTO storePromotionPriceDTO) { - // 检查 活动有效时间 及 活动有效状态 - if (checkPromotionValidTime(fullDiscount.getStartTime(), fullDiscount.getEndTime(), PromotionTypeEnum.FULL_DISCOUNT.name(), fullDiscount.getId()) && fullDiscount.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { - // 是否免运费 - if (Boolean.TRUE.equals(fullDiscount.getIsFreeFreight())) { - storePromotionPriceDTO.setIsFreeFreight(true); - } - List goodsSkuPromotionPriceList = storePromotionPriceDTO.getGoodsSkuPromotionPriceList(); - - // 参与活动的商品总数量 - this.accumulationGoodsSkuPromotionPrice(goodsSkuPromotionPriceList, storePromotionPriceDTO); - - // 参与优惠商品的成交金额是否满足满优惠条件 - if (fullDiscount.getFullMoney() <= storePromotionPriceDTO.getTotalJoinDiscountPrice()) { - // 判断是否为满减,反之则为满折扣 - if (Boolean.TRUE.equals(fullDiscount.getIsFullMinus())) { - // 优惠总金额 = 原优惠总金额 + 满优惠减免的金额 - storePromotionPriceDTO.setTotalDiscountPrice(CurrencyUtil.add(storePromotionPriceDTO.getTotalDiscountPrice(), fullDiscount.getFullMinus())); - } else if (Boolean.TRUE.equals(fullDiscount.getIsFullRate())) { - double fullRate = fullDiscount.getFullRate() >= 10 ? fullDiscount.getFullRate() / 100 : fullDiscount.getFullRate() / 10; - // 满优惠减免的金额 = 原参与优惠的总金额 * 满优惠折扣(百分比) - double discountPrice = CurrencyUtil.sub(storePromotionPriceDTO.getTotalJoinDiscountPrice(), CurrencyUtil.mul(storePromotionPriceDTO.getTotalJoinDiscountPrice(), fullRate)); - // 优惠总金额 = 原优惠总金额 + 满优惠减免的金额 - storePromotionPriceDTO.setTotalDiscountPrice(CurrencyUtil.add(storePromotionPriceDTO.getTotalDiscountPrice(), discountPrice)); - } - } - - // 将计算完的促销价格,平均分配到参与促销的每个商品上去 - this.distributeStoreFullDiscountPromotionPrice(storePromotionPriceDTO, fullDiscount); - } - } - - - /** - * 计算累加促销活动商品价格 - * - * @param goodsSkuPromotionPriceList 商品促销价格信息列表 - * @param storePromotionPriceDTO 店铺促销计算信息 - */ - private void accumulationGoodsSkuPromotionPrice(List goodsSkuPromotionPriceList, StorePromotionPriceDTO storePromotionPriceDTO) { - // 数据累加 - double totalNotJoinDiscountPrice = 0; - double totalJoinDiscountPrice = 0; - double totalDiscountPrice = 0; - - for (GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice : goodsSkuPromotionPriceList) { - if (goodsSkuPromotionPrice.getPromotionId() != null && goodsSkuPromotionPrice.getPromotionType().equals(PromotionTypeEnum.FULL_DISCOUNT.name())) { - totalJoinDiscountPrice = CurrencyUtil.add(totalJoinDiscountPrice, goodsSkuPromotionPrice.getTotalFinalePrice()); - totalDiscountPrice = CurrencyUtil.add(totalDiscountPrice, goodsSkuPromotionPrice.getDiscountPrice()); - } else { - totalNotJoinDiscountPrice = CurrencyUtil.add(totalNotJoinDiscountPrice, goodsSkuPromotionPrice.getFinalePrice()); - } - } - storePromotionPriceDTO.setTotalDiscountPrice(totalDiscountPrice); - storePromotionPriceDTO.setTotalJoinDiscountPrice(totalJoinDiscountPrice); - storePromotionPriceDTO.setTotalNotJoinDiscountPrice(totalNotJoinDiscountPrice); - - for (GoodsSkuPromotionPriceDTO goodsSkuPromotionPriceDTO : goodsSkuPromotionPriceList) { - double fullDiscountRate = CurrencyUtil.div(goodsSkuPromotionPriceDTO.getTotalFinalePrice(), totalJoinDiscountPrice); - goodsSkuPromotionPriceDTO.setDiscountPriceRate(fullDiscountRate); - } - - } - - /** - * 计算累加促销活动商品价格其他信息 - * - * @param goodsSkuPromotionPriceList 商品促销价格信息列表 - * @param storePromotionPriceDTO 店铺促销计算信息 - */ - private void accumulationGoodsSkuPromotionOther(List goodsSkuPromotionPriceList, StorePromotionPriceDTO storePromotionPriceDTO) { - double totalWeight = 0; - double totalNum = 0D; - double totalOriginPrice = 0; - double totalDiscountPrice = 0; - double totalPoints = 0; - for (GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice : goodsSkuPromotionPriceList) { - totalWeight = CurrencyUtil.add(totalWeight, goodsSkuPromotionPrice.getWeight()); - totalNum = CurrencyUtil.add(totalNum, goodsSkuPromotionPrice.getNumber()); - totalPoints = CurrencyUtil.add(totalPoints, goodsSkuPromotionPrice.getTotalPoints()); - totalOriginPrice = CurrencyUtil.add(totalOriginPrice, (goodsSkuPromotionPrice.getOriginalPrice() * goodsSkuPromotionPrice.getNumber())); - if (goodsSkuPromotionPrice.getTotalDiscountPrice() != null && goodsSkuPromotionPrice.getTotalDiscountPrice() > 0) { - totalDiscountPrice = CurrencyUtil.add(totalDiscountPrice, goodsSkuPromotionPrice.getTotalDiscountPrice()); - } - } - if (storePromotionPriceDTO.getTotalDiscountPrice() == null && totalDiscountPrice > 0) { - storePromotionPriceDTO.setTotalDiscountPrice(totalDiscountPrice); - } else if (storePromotionPriceDTO.getTotalDiscountPrice() == null) { - storePromotionPriceDTO.setTotalDiscountPrice(0d); - } - storePromotionPriceDTO.setTotalPoints(totalPoints); - storePromotionPriceDTO.setTotalNum((int) totalNum); - storePromotionPriceDTO.setTotalWeight(totalWeight); - storePromotionPriceDTO.setTotalOriginPrice(totalOriginPrice); - } - - - /** - * 将相应促销活动的店铺促销计算信息中的促销价格和最终成交金额平均分配到每个商品促销信息中去 - * - * @param storePromotionPriceDTO 店铺促销计算信息 - */ - private void distributeStoreFullDiscountPromotionPrice(StorePromotionPriceDTO storePromotionPriceDTO, FullDiscount fullDiscount) { - // 分配的促销总金额 = 促销总金额 / 分配的数量 - for (GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice : storePromotionPriceDTO.getGoodsSkuPromotionPriceList()) { - // 属于相应的促销活动的商品金额均分 - if (goodsSkuPromotionPrice.getDiscountPriceRate() != null - && goodsSkuPromotionPrice.getPromotionType() != null - && goodsSkuPromotionPrice.getPromotionType().equals(PromotionTypeEnum.FULL_DISCOUNT.name())) { - double distributeDiscountTotalPrice = CurrencyUtil.mul(storePromotionPriceDTO.getTotalDiscountPrice(), goodsSkuPromotionPrice.getDiscountPriceRate()); - goodsSkuPromotionPrice.setDiscountPrice(distributeDiscountTotalPrice); - goodsSkuPromotionPrice.setTotalDiscountPrice(distributeDiscountTotalPrice); - // 单品成交价 - double finalPrice = CurrencyUtil.sub(goodsSkuPromotionPrice.getTotalOriginalPrice(), distributeDiscountTotalPrice); - goodsSkuPromotionPrice.setFinalePrice(finalPrice); - goodsSkuPromotionPrice.setTotalFinalePrice(CurrencyUtil.mul(finalPrice, goodsSkuPromotionPrice.getNumber())); - fullDiscount.setPromotionName(PromotionTypeEnum.FULL_DISCOUNT.name()); - goodsSkuPromotionPrice.getJoinPromotion().add(fullDiscount); - - } - } - } - - /** - * 检查活动有效时间 - * - * @param startTime 活动开始时间 - * @param endTime 活动结束时间 - * @param promotionType 活动类型 - * @param promotionId 活动ID - * @return 是否有效 - */ - private boolean checkPromotionValidTime(Date startTime, Date endTime, String promotionType, String promotionId) { - long now = System.currentTimeMillis(); - if (startTime.getTime() > now) { - log.error("商品ID为{}的{}活动开始时间小于当时时间,活动未开始!", promotionId, promotionType); - return false; - } - if (endTime.getTime() < now) { - log.error("活动ID为{}的{}活动结束时间大于当时时间,活动已结束!", promotionId, promotionType); - return false; - } - return true; - } -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java index 3ba9289a..87b8ab6b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java @@ -1,152 +1,71 @@ package cn.lili.modules.promotion.serviceimpl; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; -import cn.lili.common.delayqueue.PromotionMessage; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.DateUtil; -import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.modules.promotion.entity.dos.*; -import cn.lili.modules.promotion.entity.enums.*; -import cn.lili.modules.promotion.entity.vos.CouponVO; -import cn.lili.modules.promotion.entity.vos.PintuanVO; -import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; -import cn.lili.modules.promotion.entity.vos.SeckillVO; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.service.*; -import cn.lili.modules.search.entity.dos.EsGoodsIndex; -import cn.lili.modules.search.service.EsGoodsIndexService; -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 lombok.RequiredArgsConstructor; +import cn.lili.modules.promotion.tools.PromotionTools; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 促销业务层实现 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ @Slf4j @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PromotionServiceImpl implements PromotionService { - //会员优惠券 - private MemberCouponService memberCouponService; - //秒杀 + /** + * 秒杀 + */ + @Autowired private SeckillService seckillService; - //秒杀申请 + /** + * 秒杀申请 + */ + @Autowired private SeckillApplyService seckillApplyService; - //满额活动 + /** + * 满额活动 + */ + @Autowired private FullDiscountService fullDiscountService; - //拼团 + /** + * 拼团 + */ + @Autowired private PintuanService pintuanService; - //优惠券 + /** + * 优惠券 + */ + @Autowired private CouponService couponService; - //促销商品 + /** + * 促销商品 + */ + @Autowired private PromotionGoodsService promotionGoodsService; - //积分商品 + /** + * 积分商品 + */ + @Autowired private PointsGoodsService pointsGoodsService; - //ES商品 - private EsGoodsIndexService goodsIndexService; - //Mongo - private MongoTemplate mongoTemplate; + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; - @Override - public boolean updatePromotionStatus(PromotionMessage promotionMessage) { - PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(promotionMessage.getPromotionType()); - String esPromotionKey = promotionTypeEnum + "-" + promotionMessage.getPromotionId(); - log.info("更新促销活动状态:{}", promotionMessage); - boolean result = false; - switch (promotionTypeEnum) { - case FULL_DISCOUNT: - result = this.updateFullDiscount(promotionMessage, esPromotionKey, promotionTypeEnum); - break; - case SECKILL: - SeckillVO seckill = this.mongoTemplate.findById(promotionMessage.getPromotionId(), SeckillVO.class); - if (seckill == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - } - seckill.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.seckillService.update(promotionMessage.updateWrapper()); - for (SeckillApply seckillApply : seckill.getSeckillApplyList()) { - if (seckillApply.getPromotionApplyStatus().equals(PromotionApplyStatusEnum.PASS.name())) { - // 下一个时间,默认为当天结束时间 - int nextHour = 23; - String[] split = seckill.getHours().split(","); - int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); - // 排序时间段 - Arrays.sort(hoursSored); - for (int i : hoursSored) { - // 如果当前时间段大于排序后的时间段的某个,当前时间段的下个时间段即为排序后的时间段的某个 - if (seckillApply.getTimeLine() < i) { - nextHour = i; - break; - } - } - Seckill seckill1 = JSONUtil.toBean(JSONUtil.toJsonStr(seckill), Seckill.class); - String format = cn.hutool.core.date.DateUtil.format(seckill.getStartTime(), DateUtil.STANDARD_DATE_FORMAT); - DateTime parseStartTime = cn.hutool.core.date.DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH"); - DateTime parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH"); - // 如果是当天最后的时间段则设置到当天结束时间的59分59秒 - if (nextHour == seckillApply.getTimeLine()) { - parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour + ":59:59"), DateUtil.STANDARD_FORMAT); - } - seckill1.setStartTime(parseStartTime); - // 当时商品的限时抢购活动结束时间为下个时间段的开始 - seckill1.setEndTime(parseEndTime); - this.goodsIndexService.updateEsGoodsIndex(seckillApply.getSkuId(), seckill1, promotionTypeEnum.name() + "-" + seckillApply.getTimeLine(), seckillApply.getPrice()); - } - } - this.mongoTemplate.save(seckill); - break; - case PINTUAN: - PintuanVO pintuanVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PintuanVO.class); - if (pintuanVO == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - } - pintuanVO.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.pintuanService.update(promotionMessage.updateWrapper()); - this.promotionGoodsService.updateBatchById(pintuanVO.getPromotionGoodsList()); - List promotionGoodsList = pintuanVO.getPromotionGoodsList(); - // 更新促销商品索引 - for (PromotionGoods promotionGoods : promotionGoodsList) { - Pintuan pintuan1 = JSONUtil.toBean(JSONUtil.toJsonStr(pintuanVO), Pintuan.class); - this.goodsIndexService.updateEsGoodsIndex(promotionGoods.getSkuId(), pintuan1, esPromotionKey, promotionGoods.getPrice()); - } - this.mongoTemplate.save(pintuanVO); - break; - case COUPON: - result = this.updateCoupon(promotionMessage, esPromotionKey, promotionTypeEnum); - break; - case POINTS_GOODS: - PointsGoodsVO pointsGoodsVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PointsGoodsVO.class); - if (pointsGoodsVO == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - } - pointsGoodsVO.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.pointsGoodsService.update(promotionMessage.updateWrapper()); - PointsGoods pointsGoods = JSONUtil.toBean(JSONUtil.toJsonStr(pointsGoodsVO), PointsGoods.class); - this.goodsIndexService.updateEsGoodsIndex(pointsGoodsVO.getSkuId(), pointsGoods, esPromotionKey, null); - this.mongoTemplate.save(pointsGoodsVO); - break; - default: - break; - } - this.updatePromotionGoods(promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - return result; - } /** * 获取当前进行的所有促销活动信息 @@ -154,74 +73,36 @@ public class PromotionServiceImpl implements PromotionService { * @return 当前促销活动集合 */ @Override - public Map getCurrentPromotion() { - Map resultMap = new HashMap<>(); - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("promotion_status", PromotionStatusEnum.START.name()); - queryWrapper.gt("start_time", new Date()); - queryWrapper.lt("end_time", new Date()); - // 获取当前进行的限时抢购活动 - List seckillList = seckillService.list(queryWrapper); - if (seckillList != null && !seckillList.isEmpty()) { - for (Seckill seckill : seckillList) { - resultMap.put(PromotionTypeEnum.SECKILL.name(), seckill); - } - } - // 获取当前进行的满优惠活动 - List fullDiscountList = fullDiscountService.list(queryWrapper); - if (fullDiscountList != null && !fullDiscountList.isEmpty()) { - for (FullDiscount fullDiscount : fullDiscountList) { - resultMap.put(PromotionTypeEnum.FULL_DISCOUNT.name(), fullDiscount); - } - } - // 获取当前进行的拼团活动 - List pintuanList = pintuanService.list(queryWrapper); - if (pintuanList != null && !pintuanList.isEmpty()) { - for (Pintuan pintuan : pintuanList) { - resultMap.put(PromotionTypeEnum.PINTUAN.name(), pintuan); - } - } - return resultMap; + public Map> getCurrentPromotion() { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionStatus(PromotionsStatusEnum.START.name()); + List promotionGoods = promotionGoodsService.listFindAll(searchParams); + return promotionGoods.stream().collect(Collectors.groupingBy(PromotionGoods::getPromotionType)); } /** * 根据商品索引获取当前商品索引的所有促销活动信息 * - * @param index 商品索引 + * @param storeId 店铺id + * @param goodsSkuId 商品skuId * @return 当前促销活动集合 */ + public Map getGoodsSkuPromotionMap(String storeId, String goodsSkuId) { + String storeIds = storeId + "," + PromotionTools.PLATFORM_ID; + List promotionGoodsList = promotionGoodsService.findSkuValidPromotion(goodsSkuId, storeIds); + return wrapperPromotionMapList(promotionGoodsList); + } + @Override - public Map getGoodsCurrentPromotionMap(EsGoodsIndex index) { + public void removeByGoodsIds(String goodsIdsJsonStr) { + List goodsIds = JSONUtil.toList(goodsIdsJsonStr, String.class); + promotionGoodsService.deletePromotionGoodsByGoods(goodsIds); + kanjiaActivityGoodsService.deleteByGoodsIds(goodsIds); + } + + public Map wrapperPromotionMapList(List promotionGoodsList) { Map promotionMap = new HashMap<>(); - Query query = new Query(); - query.addCriteria(Criteria.where("deleteFlag").is(false)); - query.addCriteria(Criteria.where("promotionStatus").is(PromotionStatusEnum.START.name())); - query.addCriteria(Criteria.where("endTime").gt(new Date())); - List fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); - for (FullDiscountVO fullDiscountVO : fullDiscountVOS) { - if (fullDiscountVO.getPromotionGoodsList() == null && fullDiscountVO.getNumber() == -1) { - if (index.getStoreId().equals(fullDiscountVO.getStoreId())) { - String fullDiscountKey = PromotionTypeEnum.FULL_DISCOUNT.name() + "-" + fullDiscountVO.getId(); - promotionMap.put(fullDiscountKey, fullDiscountVO); - } - } - } - List couponVOS = mongoTemplate.find(query, CouponVO.class); - for (CouponVO couponVO : couponVOS) { - if (couponVO.getPromotionGoodsList() == null && couponVO.getScopeType().equals(CouponScopeTypeEnum.ALL.name())) { - if (couponVO.getStoreId().equals("platform") || index.getStoreId().equals(couponVO.getStoreId())) { - String couponKey = PromotionTypeEnum.COUPON.name() + "-" + couponVO.getId(); - promotionMap.put(couponKey, couponVO); - } - } - } - LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); - queryWrapper1.eq(PromotionGoods::getDeleteFlag, false); - queryWrapper1.eq(PromotionGoods::getPromotionStatus, PromotionStatusEnum.START.name()); - queryWrapper1.gt(PromotionGoods::getEndTime, new Date()); - queryWrapper1.eq(PromotionGoods::getSkuId, index.getId()); - List list1 = promotionGoodsService.list(queryWrapper1); - for (PromotionGoods promotionGoods : list1) { + for (PromotionGoods promotionGoods : promotionGoodsList) { String esPromotionKey = promotionGoods.getPromotionType() + "-" + promotionGoods.getPromotionId(); switch (PromotionTypeEnum.valueOf(promotionGoods.getPromotionType())) { case COUPON: @@ -231,32 +112,13 @@ public class PromotionServiceImpl implements PromotionService { case PINTUAN: Pintuan pintuan = pintuanService.getById(promotionGoods.getPromotionId()); promotionMap.put(esPromotionKey, pintuan); - index.setPromotionPrice(promotionGoods.getPrice()); break; case FULL_DISCOUNT: FullDiscount fullDiscount = fullDiscountService.getById(promotionGoods.getPromotionId()); promotionMap.put(esPromotionKey, fullDiscount); break; case SECKILL: - Seckill seckill = seckillService.getById(promotionGoods.getPromotionId()); - LambdaQueryWrapper seckillApplyLambdaQueryWrapper = new LambdaQueryWrapper<>(); - seckillApplyLambdaQueryWrapper.eq(SeckillApply::getSeckillId, promotionGoods.getPromotionId()); - seckillApplyLambdaQueryWrapper.eq(SeckillApply::getSkuId, promotionGoods.getSkuId()); - SeckillApply seckillApply = seckillApplyService.getOne(seckillApplyLambdaQueryWrapper); - int nextHour = 23; - String[] split = seckill.getHours().split(","); - int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); - Arrays.sort(hoursSored); - for (int i : hoursSored) { - if (seckillApply.getTimeLine() < i) { - nextHour = i; - } - } - String seckillKey = promotionGoods.getPromotionType() + "-" + nextHour; - seckill.setStartTime(promotionGoods.getStartTime()); - seckill.setEndTime(promotionGoods.getEndTime()); - promotionMap.put(seckillKey, seckill); - index.setPromotionPrice(promotionGoods.getPrice()); + this.getGoodsCurrentSeckill(esPromotionKey, promotionGoods, promotionMap); break; case POINTS_GOODS: PointsGoods pointsGoods = pointsGoodsService.getById(promotionGoods.getPromotionId()); @@ -269,131 +131,20 @@ public class PromotionServiceImpl implements PromotionService { return promotionMap; } - private boolean updateFullDiscount(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) { - boolean result; - FullDiscountVO fullDiscountVO = mongoTemplate.findById(promotionMessage.getPromotionId(), FullDiscountVO.class); - if (fullDiscountVO == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); + private void getGoodsCurrentSeckill(String esPromotionKey, PromotionGoods promotionGoods, Map promotionMap) { + Seckill seckill = seckillService.getById(promotionGoods.getPromotionId()); + SeckillSearchParams searchParams = new SeckillSearchParams(); + searchParams.setSeckillId(promotionGoods.getPromotionId()); + searchParams.setSkuId(promotionGoods.getSkuId()); + List seckillApplyList = seckillApplyService.getSeckillApplyList(searchParams); + if (seckillApplyList != null && !seckillApplyList.isEmpty()) { + String[] split = seckill.getHours().split(","); + int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); + Arrays.sort(hoursSored); + seckill.setStartTime(promotionGoods.getStartTime()); + seckill.setEndTime(promotionGoods.getEndTime()); + promotionMap.put(esPromotionKey, seckill); } - fullDiscountVO.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.fullDiscountService.update(promotionMessage.updateWrapper()); - // clone一个活动信息,用于存放与索引中 - FullDiscountVO clone = ObjectUtil.clone(fullDiscountVO); - clone.setPromotionGoodsList(null); - if (fullDiscountVO.getPromotionGoodsList() == null && fullDiscountVO.getNumber() == -1) { - // 如果为全品类则更新全部索引 - this.goodsIndexService.updateEsGoodsIndexAllByList(clone, esPromotionKey); - } else { - // 如不为全品类,更新指定索引 - for (PromotionGoods promotionGoods : fullDiscountVO.getPromotionGoodsList()) { - promotionGoods.setPromotionStatus(promotionMessage.getPromotionStatus()); - } - this.promotionGoodsService.updateBatchById(fullDiscountVO.getPromotionGoodsList()); - this.goodsIndexService.updateEsGoodsIndexByList(fullDiscountVO.getPromotionGoodsList(), clone, esPromotionKey); - } - this.mongoTemplate.save(fullDiscountVO); - return result; } - private boolean updateCoupon(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) { - boolean result; - CouponVO couponVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), CouponVO.class); - if (couponVO == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - } - couponVO.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.couponService.update(promotionMessage.updateWrapper()); - - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper().eq(MemberCoupon::getCouponId, couponVO.getId()).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); - this.memberCouponService.update(updateWrapper); - // clone一个活动信息,用于存放与索引中 - CouponVO clone = ObjectUtil.clone(couponVO); - clone.setPromotionGoodsList(null); - if (CouponScopeTypeEnum.PORTION_GOODS.name().equals(couponVO.getScopeType())) { - // 如为部分商品,则更新部分商品索引 - this.promotionGoodsService.updateBatchById(couponVO.getPromotionGoodsList()); - this.goodsIndexService.updateEsGoodsIndexByList(couponVO.getPromotionGoodsList(), clone, esPromotionKey); - } else if (CouponScopeTypeEnum.ALL.name().equals(couponVO.getScopeType())) { - // 如为全部,则更新全部商品索引 - this.goodsIndexService.updateEsGoodsIndexAllByList(clone, esPromotionKey); - } - this.mongoTemplate.save(couponVO); - return result; - } - - /** - * 更新促销商品信息 - * - * @param promotionId - * @param promotionStatus - */ - private void updatePromotionGoods(String promotionId, String promotionStatus) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(PromotionGoods::getPromotionId, promotionId).set(PromotionGoods::getPromotionStatus, promotionStatus); - this.promotionGoodsService.update(updateWrapper); - } - - - /** - * 抛出促销异常 - * - * @param type 促销类型 - * @param id 促销编号 - * @param status 促销状态 - */ - private void throwPromotionException(PromotionTypeEnum type, String id, String status) { - log.error("当前" + type.name() + "活动ID为[" + id + "] 不存在,更改活动状态至[ " + status + " ]失败!"); - throw new ServiceException("当前活动已停止"); - } - - - @Autowired - public void setPintuanService(PintuanService pintuanService) { - this.pintuanService = pintuanService; - } - - @Autowired - public void setMemberCouponService(MemberCouponService memberCouponService) { - this.memberCouponService = memberCouponService; - } - - @Autowired - public void setSeckillService(SeckillService seckillService) { - this.seckillService = seckillService; - } - - @Autowired - public void setSeckillApplyService(SeckillApplyService seckillApplyService) { - this.seckillApplyService = seckillApplyService; - } - - @Autowired - public void setFullDiscountService(FullDiscountService fullDiscountService) { - this.fullDiscountService = fullDiscountService; - } - - @Autowired - public void setCouponService(CouponService couponService) { - this.couponService = couponService; - } - - @Autowired - public void setPromotionGoodsService(PromotionGoodsService promotionGoodsService) { - this.promotionGoodsService = promotionGoodsService; - } - - @Autowired - public void setPointsGoodsService(PointsGoodsService pointsGoodsService) { - this.pointsGoodsService = pointsGoodsService; - } - - @Autowired - public void setGoodsIndexService(EsGoodsIndexService goodsIndexService) { - this.goodsIndexService = goodsIndexService; - } - - @Autowired - public void setMongoTemplate(MongoTemplate mongoTemplate) { - this.mongoTemplate = mongoTemplate; - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java index e3402bd9..728b3e74 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java @@ -1,41 +1,39 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateTime; -import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.cache.Cache; +import cn.hutool.core.date.DateUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.promotion.entity.dos.BasePromotions; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; -import cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.*; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum; +import cn.lili.modules.promotion.entity.vos.SeckillApplyVO; +import cn.lili.modules.promotion.entity.vos.SeckillGoodsVO; +import cn.lili.modules.promotion.entity.vos.SeckillTimelineVO; import cn.lili.modules.promotion.mapper.SeckillApplyMapper; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillService; -import cn.lili.modules.promotion.tools.PromotionCacheKeys; import cn.lili.modules.promotion.tools.PromotionTools; -import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.mybatis.util.PageUtil; 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 lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,361 +45,281 @@ import java.util.stream.Collectors; * 秒杀申请业务层实现 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Slf4j public class SeckillApplyServiceImpl extends ServiceImpl implements SeckillApplyService { - //缓存 - private final Cache cache; - //Mongo - private final MongoTemplate mongoTemplate; - //规格商品 + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 规格商品 + */ + @Autowired private GoodsSkuService goodsSkuService; - //ES商品 - private EsGoodsIndexService esGoodsIndexService; - //促销商品 + /** + * 促销商品 + */ + @Autowired private PromotionGoodsService promotionGoodsService; - //秒杀 + /** + * 秒杀 + */ + @Autowired private SeckillService seckillService; @Override public List getSeckillTimeline() { - List timelineVoS = new ArrayList<>(); - // 限时抢购缓存key - String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.toString(DateUtil.startOfTodDay(), DateUtil.STANDARD_DATE_NO_UNDERLINE_FORMAT)); - Map cacheSeckill = cache.getHash(seckillCacheKey); - if (cacheSeckill == null || cacheSeckill.isEmpty()) { - // 如缓存中不存在,则单独获取 - try { - timelineVoS = getSeckillTimelineToCache(seckillCacheKey); - } catch (Exception e) { - log.error("获取限时抢购信息发生错误!", e); - } - } else { - // 如缓存中存在,则取缓存中转为展示的信息 - for (Object value : cacheSeckill.values()) { - SeckillTimelineVO seckillTimelineVO = (SeckillTimelineVO) value; - timelineVoS.add(seckillTimelineVO); - } + try { + //秒杀活动缓存key + return getSeckillTimelineInfo(); + } catch (Exception e) { + log.error("获取秒杀时间轴失败", e); + return new ArrayList<>(); } - return timelineVoS; } @Override public List getSeckillGoods(Integer timeline) { - List seckillGoodsVoS = new ArrayList<>(); - // 限时抢购缓存key - String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.toString(DateUtil.startOfTodDay(), DateUtil.STANDARD_DATE_NO_UNDERLINE_FORMAT)); - Map cacheSeckill = cache.getHash(seckillCacheKey); - if (cacheSeckill == null || cacheSeckill.isEmpty()) { - // 如缓存中不存在,则单独获取 - seckillGoodsVoS = wrapperSeckillGoods(timeline); - } else { - // 如缓存中存在,则取缓存中转为展示的信息 - for (Map.Entry entry : cacheSeckill.entrySet()) { - Integer timelineKey = Integer.parseInt(entry.getKey().toString()); - if (timelineKey.equals(timeline)) { - seckillGoodsVoS = (List) entry.getValue(); + try { + List seckillGoodsVoS = new ArrayList<>(); + //获取 + List seckillTimelineToCache = getSeckillTimelineInfo(); + Optional first = seckillTimelineToCache.stream().filter(i -> i.getTimeLine().equals(timeline)).findFirst(); + if (first.isPresent()) { + seckillGoodsVoS = first.get().getSeckillGoodsList(); + } + return seckillGoodsVoS; + } catch (Exception e) { + log.error("获取秒杀商品失败", e); + return new ArrayList<>(); + } + } + + @Override + public IPage getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo) { + IPage seckillApplyPage = this.page(PageUtil.initPage(pageVo), queryParam.queryWrapper()); + if (seckillApplyPage != null && !seckillApplyPage.getRecords().isEmpty()) { + + //获取skuId + List skuIds = seckillApplyPage.getRecords().stream() + .map(SeckillApply::getSkuId).collect(Collectors.toList()); + + //循环获取 店铺/全平台 参与的促销商品库存进行填充 + if (!skuIds.isEmpty()) { + List skuStock = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.SECKILL, queryParam.getSeckillId(), skuIds); + for (int i = 0; i < skuIds.size(); i++) { + seckillApplyPage.getRecords().get(i).setQuantity(skuStock.get(i)); } } } - return seckillGoodsVoS; - } - - @Override - public void auditBatchApply(String[] ids, String seckillId, String applyStatus, String failReason) { - if (ids == null || ids.length <= 0) { - throw new ServiceException("请提供要审核的商品"); - } - if (StringUtils.isEmpty(applyStatus) || PromotionApplyStatusEnum.valueOf(applyStatus).name().isEmpty()) { - throw new ServiceException("提供的审批状态值不正确"); - } - if (PromotionApplyStatusEnum.REFUSE.name().equals(applyStatus)) { - boolean isEmpty = StringUtils.isEmpty(failReason); - if (isEmpty) { - throw new ServiceException("在驳回状态下驳回原因必填"); - } - } - - SeckillVO seckillVO = this.mongoTemplate.findById(seckillId, SeckillVO.class); - if (seckillVO == null) { - log.error("编号为【" + seckillId + "】限时抢购请不存在"); - throw new ServiceException(); - } - List seckillApplyList = seckillVO.getSeckillApplyList(); - - for (String id : ids) { - - Optional seckillApplyOptional = seckillApplyList.stream().filter(i -> i.getId().equals(id)).findFirst(); - SeckillApply seckillApply; - if (seckillApplyOptional.isPresent()) { - seckillApply = seckillApplyOptional.get(); - } else { - log.error("编号为【" + id + "】限时抢购的申请不存在"); - throw new ServiceException(); - } - - seckillApply.setPromotionApplyStatus(PromotionApplyStatusEnum.valueOf(applyStatus).name()); - seckillApply.setFailReason(failReason); - this.updateById(seckillApply); - if (PromotionApplyStatusEnum.PASS.name().equals(applyStatus)) { - //检查缓存中是否存在相同商品参与的限时抢购活动 - checkCache(seckillVO.getStartTime().getTime()); - } - } - seckillVO.setSeckillApplyList(seckillApplyList); - mongoTemplate.save(seckillVO); - } - - @Override - public IPage getSeckillApplyFromMysql(SeckillSearchParams queryParam, PageVO pageVo) { - QueryWrapper queryWrapper = queryParam.wrapper(); - return page(PageUtil.initPage(pageVo), queryWrapper); - } - - @Override - public IPage getSeckillApplyFromMongo(SeckillSearchParams queryParam, PageVO pageVo) { - IPage seckillApplyIPage = new Page<>(); - Query query = queryParam.mongoQuery(); - - SeckillVO seckillVO = this.mongoTemplate.findOne(query, SeckillVO.class); - if (seckillVO != null && pageVo != null) { - seckillApplyIPage.setCurrent(pageVo.getMongoPageNumber()); - seckillApplyIPage.setSize(pageVo.getPageSize()); - List seckillApplyList = seckillVO.getSeckillApplyList() != null ? seckillVO.getSeckillApplyList() : new ArrayList<>(); - for (SeckillApply seckillApply : seckillApplyList) { - if (CharSequenceUtil.isNotEmpty(queryParam.getStoreId()) && !seckillApply.getStoreId().equals(queryParam.getStoreId())) { - seckillApplyList.remove(seckillApply); - } - try { - Integer goodsStock = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.SECKILL, seckillApply.getSeckillId(), seckillApply.getSkuId()); - seckillApply.setQuantity(goodsStock); - } catch (Exception e) { - log.error("获取促销商品促销失败!", e); - } - } - seckillApplyIPage.setTotal(seckillApplyList.size()); - List page = CollUtil.page(pageVo.getMongoPageNumber(), pageVo.getPageSize(), seckillApplyList); - seckillApplyIPage.setRecords(page); - return seckillApplyIPage; - } else { - return null; - } + return seckillApplyPage; + } + + /** + * 分页查询限时请购申请列表 + * + * @param queryParam 秒杀活动申请查询参数 + * @return 限时请购申请列表 + */ + @Override + public List getSeckillApplyList(SeckillSearchParams queryParam) { + return this.list(queryParam.queryWrapper()); + } + + /** + * 查询限时请购申请列表总数 + * + * @param queryParam 查询条件 + * @return 限时请购申请列表总数 + */ + @Override + public long getSeckillApplyCount(SeckillSearchParams queryParam) { + return this.count(queryParam.queryWrapper()); + } + + /** + * 查询限时请购申请 + * + * @param queryParam 秒杀活动申请查询参数 + * @return 限时请购申请 + */ + @Override + public SeckillApply getSeckillApply(SeckillSearchParams queryParam) { + return this.getOne(queryParam.queryWrapper(), false); } @Override + @Transactional(rollbackFor = Exception.class) public void addSeckillApply(String seckillId, String storeId, List seckillApplyList) { - SeckillVO seckill = mongoTemplate.findById(seckillId, SeckillVO.class); + Seckill seckill = this.seckillService.getById(seckillId); if (seckill == null) { - throw new ServiceException("当前参与的限时抢购不存在!"); + throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR); } - seckill.checkTime(); - // 检查限时抢购申请是否合法 - checkSeckillApplyList(seckill.getApplyEndTime().getTime(), seckill.getHours(), seckillApplyList, storeId); - String storeIds = seckill.getStoreIds() != null ? seckill.getStoreIds() : ""; - boolean containsStore = false; - List storeIdList = Arrays.asList(storeIds.split(",")); - // 检查是否为已参加活动的店铺 - if (CharSequenceUtil.isNotEmpty(seckillId) && !storeIdList.contains(storeId)) { - if (!CharSequenceUtil.isEmpty(storeIds)) { - String[] storeIdSplit = storeIds.split(","); - for (String s : storeIdSplit) { - if (s.equals(seckillId)) { - containsStore = true; - break; - } - } - storeIds = seckill.getStoreIds() + storeId + ","; - } else { - storeIds = storeId + ","; - } - seckill.setStoreIds(storeIds); + if (seckillApplyList == null || seckillApplyList.isEmpty()) { + return; } - - List originList = seckill.getSeckillApplyList(); + //检查秒杀活动申请是否合法 + checkSeckillApplyList(seckill.getHours(), seckillApplyList); + //获取已参与活动的秒杀活动活动申请列表 + List skuIds = seckillApplyList.stream().map(SeckillApply::getSkuId).collect(Collectors.toList()); + List originList = new ArrayList<>(); List promotionGoodsList = new ArrayList<>(); - if (originList == null) { - originList = new ArrayList<>(); - } for (SeckillApplyVO seckillApply : seckillApplyList) { - GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId()); - if (goodsSku.getQuantity() < seckillApply.getQuantity()) { - throw new ServiceException(seckillApply.getGoodsName() + ",此商品库存不足"); - } - - /* - *************两种情况:****************** - 团购时间段: |________________| - 秒杀时间段: |_____| |_______| - - ************第三种情况:****************** - 团购时间段: |______| - 秒杀时间段: |________________| - - ************第四种情况:****************** - 团购时间段: |________________| - 秒杀时间段: |______| - - 这个商品的开始时间计算要用他参与的时间段来计算,结束时间是当天晚上23:59:59 - */ - String startTimeStr = DateUtil.toString(seckill.getStartTime(), DateUtil.STANDARD_DATE_FORMAT) + " " + (seckillApply.getTimeLine() > 10 ? ("0" + seckillApply.getTimeLine()) : seckillApply.getTimeLine()) + ":00:00"; - String endTimeStr = DateUtil.toString(seckill.getStartTime(), "yyyy-MM-dd") + " 23:59:59"; - - // 查询是否在同一时间段参与了拼团活动 - Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT)); - // 查询是否在同一时间段参与了限时抢购活动 - count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT)); - if (count > 0) { - throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了团购或限时抢购活动,不能参加限时抢购活动"); - } - seckillApply.setOriginalPrice(goodsSku.getPrice()); - seckillApply.setPromotionApplyStatus(PromotionApplyStatusEnum.APPLY.name()); - seckillApply.setSalesNum(0); - - Optional first = originList.stream().filter(i -> i.getSkuId().equals(seckillApply.getSkuId())).findFirst(); - if (first.isPresent() && (first.get().getPromotionApplyStatus().equals(PromotionApplyStatusEnum.REFUSE.name()) || first.get().getPromotionApplyStatus().equals(PromotionApplyStatusEnum.APPLY.name()))) { - originList = originList.stream().filter(i -> !i.getSkuId().equals(seckillApply.getSkuId())).collect(Collectors.toList()); - } else if (first.isPresent() && first.get().getPromotionApplyStatus().equals(PromotionApplyStatusEnum.PASS.name())) { + //获取参与活动的商品信息 + GoodsSku goodsSku = goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(seckillApply.getSkuId()); + if (!goodsSku.getStoreId().equals(storeId)) { continue; } + //获取秒杀活动时间段 + DateTime startTime = DateUtil.offsetHour(seckill.getStartTime(), seckillApply.getTimeLine()); + //检测是否可以发布促销商品 + checkSeckillGoodsSku(seckill, seckillApply, goodsSku, startTime); + //设置秒杀申请默认内容 + seckillApply.setOriginalPrice(goodsSku.getPrice()); + seckillApply.setPromotionApplyStatus(PromotionsApplyStatusEnum.PASS.name()); + seckillApply.setSalesNum(0); originList.add(seckillApply); - PromotionGoods promotionGoods = new PromotionGoods(goodsSku); - promotionGoods.setPrice(seckillApply.getPrice()); - promotionGoods.setQuantity(seckillApply.getQuantity()); - // 设置单独每个促销商品的结束时间 - int nextHour = 23; - String[] split = seckill.getHours().split(","); - int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); - Arrays.sort(hoursSored); - for (int i : hoursSored) { - if (seckillApply.getTimeLine() < i) { - nextHour = i; - break; - } - } - String format = cn.hutool.core.date.DateUtil.format(seckill.getStartTime(), DateUtil.STANDARD_DATE_FORMAT); - DateTime parseStartTime = cn.hutool.core.date.DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH"); - DateTime parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH"); - // 如果是当天最后的时间段则设置到当天结束时间的59分59秒 - if (nextHour == seckillApply.getTimeLine()) { - parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour + ":59:59"), DateUtil.STANDARD_FORMAT); - } - promotionGoods.setStartTime(parseStartTime); - promotionGoods.setEndTime(parseEndTime); + //获取促销商品 + PromotionGoods promotionGoods = this.setSeckillGoods(goodsSku, seckillApply, seckill); promotionGoodsList.add(promotionGoods); } - this.saveOrUpdateBatch(originList); - seckill.setSeckillApplyList(originList); - this.mongoTemplate.save(seckill); + boolean result = true; + this.remove(new LambdaQueryWrapper().eq(SeckillApply::getSeckillId, seckillId).in(SeckillApply::getSkuId, skuIds)); + this.saveBatch(originList); + //保存促销活动商品信息 if (!promotionGoodsList.isEmpty()) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(PromotionGoods::getSkuId, promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())).eq(PromotionGoods::getStoreId, storeId); - promotionGoodsService.remove(queryWrapper); + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionId(seckillId); + searchParams.setStoreId(storeId); + searchParams.setPromotionType(PromotionTypeEnum.SECKILL.name()); + searchParams.setSkuIds(promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())); + promotionGoodsService.deletePromotionGoods(searchParams); + //初始化促销商品 PromotionTools.promotionGoodsInit(promotionGoodsList, seckill, PromotionTypeEnum.SECKILL); - promotionGoodsService.saveBatch(promotionGoodsList); + result = promotionGoodsService.saveBatch(promotionGoodsList); } - - if (Boolean.FALSE.equals(containsStore)) { - seckillService.storeApply(storeId, seckill.getId()); + //设置秒杀活动的商品数量、店铺数量 + seckillService.updateSeckillGoodsNum(seckillId); + cache.vagueDel(CachePrefix.STORE_ID_SECKILL); + if (result) { + this.seckillService.updateEsGoodsSeckill(seckill, originList); } } + /** - * 批量删除限时抢购申请 + * 批量删除秒杀活动申请 * - * @param seckillId 限时抢购活动id - * @param ids 限时抢购申请id集合 + * @param seckillId 秒杀活动活动id + * @param id id */ @Override - public void removeSeckillApplyByIds(String seckillId, List ids) { - SeckillVO seckillVO = this.mongoTemplate.findById(seckillId, SeckillVO.class); - if (seckillVO == null) { - throw new ServiceException("当前限时抢购活动不存在!"); + @Transactional(rollbackFor = Exception.class) + public void removeSeckillApply(String seckillId, String id) { + Seckill seckill = this.seckillService.getById(seckillId); + if (seckill == null) { + throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR); } - if (seckillVO.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { - throw new ServiceException("当前限时抢购活动已经开始,无法修改!"); + SeckillApply seckillApply = this.getById(id); + if (seckillApply == null) { + throw new ServiceException(ResultCode.SECKILL_APPLY_NOT_EXIST_ERROR); } - seckillVO.getSeckillApplyList().removeIf(seckillApply -> ids.contains(seckillApply.getId())); - this.mongoTemplate.save(seckillVO); - this.removeByIds(ids); + + + //清除秒杀活动中的商品 + this.remove(new LambdaQueryWrapper() + .eq(SeckillApply::getSeckillId, seckillId) + .in(SeckillApply::getId, id)); + + this.seckillService.deleteEsGoodsSeckill(seckill, Collections.singletonList(seckillApply.getSkuId())); + //删除促销商品 + this.promotionGoodsService.deletePromotionGoods(seckillId, Collections.singletonList(seckillApply.getSkuId())); } /** - * 更新限时抢购库存数量 + * 更新秒杀商品出售数量 * - * @param id 限时抢购申请(限时抢购商品)id - * @param num 数量 - * @return 是否成功 + * @param seckillId 秒杀活动id + * @param skuId 商品skuId + * @param saleNum 库存 */ @Override - public boolean updateSeckillStock(String id, Integer num) { - List promotionIds = this.esGoodsIndexService.getPromotionIdByPromotionType(id, PromotionTypeEnum.SECKILL); - for (String promotionId : promotionIds) { - SeckillVO seckillVO = this.mongoTemplate.findById(promotionId, SeckillVO.class); - if (seckillVO == null) { - log.error("限时抢购活动id为" + promotionId + "的限时抢购活动不存在!"); - break; - } - if (seckillVO.getSeckillApplyList() != null && !seckillVO.getSeckillApplyList().isEmpty()) { - Optional seckillApplyOptional = seckillVO.getSeckillApplyList().stream().filter(i -> i.getSkuId().equals(id)).findFirst(); - if (seckillApplyOptional.isPresent()) { - SeckillApply seckillApply = seckillApplyOptional.get(); - // 设置售卖数量 - Integer countNum = seckillApply.getSalesNum() + num; - seckillApply.setSalesNum(countNum); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(SeckillApply::getId, seckillApply.getId()); - updateWrapper.set(SeckillApply::getQuantity, seckillApply.getQuantity() - num); - updateWrapper.set(SeckillApply::getSalesNum, countNum); - this.update(updateWrapper); - this.mongoTemplate.save(seckillVO); - } - } - } - return true; + public void updateSeckillApplySaleNum(String seckillId, String skuId, Integer saleNum) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(SeckillApply::getSeckillId, seckillId).eq(SeckillApply::getSkuId, skuId); + updateWrapper.set(SeckillApply::getSalesNum, saleNum); + this.update(updateWrapper); } /** - * 更新限时抢购库存数量 + * 更新秒杀活动时间 * - * @param map key 为 限时抢购申请(限时抢购商品)id, value 为数量 - * @return 是否成功 + * @param seckill 秒杀活动 + * @return 是否更新成功 */ @Override - public boolean updateSeckillStock(Map map) { + @Transactional(rollbackFor = Exception.class) + public boolean updateSeckillApplyTime(Seckill seckill) { boolean result = false; - for (Map.Entry entry : map.entrySet()) { - result = this.updateSeckillStock(entry.getKey(), entry.getValue()); + List promotionGoodsList = new ArrayList<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SeckillApply::getSeckillId, seckill.getId()); + + List list = this.list(queryWrapper).stream().filter(i -> i.getTimeLine() != null && seckill.getHours().contains(i.getTimeLine().toString())).collect(Collectors.toList()); + + for (SeckillApply seckillApply : list) { + //获取参与活动的商品信息 + GoodsSku goodsSku = goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(seckillApply.getSkuId()); + //获取促销商品 + PromotionGoods promotionGoods = this.setSeckillGoods(goodsSku, seckillApply, seckill); + promotionGoodsList.add(promotionGoods); } + //保存促销活动商品信息 + if (!promotionGoodsList.isEmpty()) { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionType(PromotionTypeEnum.SECKILL.name()); + searchParams.setPromotionId(seckill.getId()); + promotionGoodsService.deletePromotionGoods(searchParams); + //初始化促销商品 + List promotionGoods = PromotionTools.promotionGoodsInit(promotionGoodsList, seckill, PromotionTypeEnum.SECKILL); + result = promotionGoodsService.saveBatch(promotionGoods); + this.seckillService.updateEsGoodsSeckill(seckill, list); + + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(SeckillApply::getSeckillId, seckill.getId()); + deleteWrapper.notIn(SeckillApply::getSkuId, promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())); + this.remove(deleteWrapper); + } + + seckillService.updateSeckillGoodsNum(seckill.getId()); + return result; } /** - * 检查限时抢购申请列表参数信息 + * 检查秒杀活动申请列表参数信息 * - * @param applyEndTime 申请结束时间 - * @param hours 限时抢购时间段 - * @param seckillApplyList 限时抢购申请列表 - * @param storeId 当前申请商家编号 + * @param hours 秒杀活动时间段 + * @param seckillApplyList 秒杀活动申请列表 */ - private void checkSeckillApplyList(Long applyEndTime, String hours, List seckillApplyList, String storeId) { + private void checkSeckillApplyList(String hours, List seckillApplyList) { List existSku = new ArrayList<>(); for (SeckillApplyVO seckillApply : seckillApplyList) { - seckillApply.setStoreId(storeId); if (seckillApply.getPrice() > seckillApply.getOriginalPrice()) { - throw new ServiceException("活动价格不能大于商品原价"); + throw new ServiceException(ResultCode.SECKILL_PRICE_ERROR); } - - // 检查限时抢购申请的时刻,是否存在在限时抢购的时间段内 + //检查秒杀活动申请的时刻,是否存在在秒杀活动的时间段内 String[] rangeHours = hours.split(","); boolean containsSame = Arrays.stream(rangeHours).anyMatch(i -> i.equals(seckillApply.getTimeLine().toString())); if (!containsSame) { - throw new ServiceException("时刻参数异常"); + throw new ServiceException(ResultCode.SECKILL_TIME_ERROR); } - + //检查商品是否参加多个时间段的活动 if (existSku.contains(seckillApply.getSkuId())) { throw new ServiceException(seckillApply.getGoodsName() + "该商品不能同时参加多个时间段的活动"); } else { @@ -412,146 +330,128 @@ public class SeckillApplyServiceImpl extends ServiceImpl hash = cache.getHash(seckillCacheKey); - //如果缓存中存在当前审核商品参与的限时抢购活动商品信息,清除 - if (hash != null && !hash.isEmpty()) { - cache.remove(seckillCacheKey); - } - } - - /** - * 从缓存中获取限时抢购信息 - * - * @param seckillCacheKey 限时抢购缓存键 - * @return 限时抢购信息 - */ - private List getSeckillTimelineToCache(String seckillCacheKey) { + private List getSeckillTimelineInfo() { List timelineList = new ArrayList<>(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - // 查询当天时间段内的且状态不为结束或关闭的限时抢购活动 - queryWrapper.gt(Seckill::getStartTime, new Date(DateUtil.startOfTodDay() * 1000)).lt(Seckill::getEndTime, DateUtil.endOfDate()) - .and(i -> i.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()) - .or(j -> j.eq(Seckill::getPromotionStatus, PromotionStatusEnum.START.name()))); - List seckillList = seckillService.list(queryWrapper); - if (!seckillList.isEmpty()) { - for (Seckill seckill : seckillList) { - //读取系统时间的时刻 - Calendar c = Calendar.getInstance(); - int hour = c.get(Calendar.HOUR_OF_DAY); - String[] split = seckill.getHours().split(","); - int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); - Arrays.sort(hoursSored); - for (int i = 0; i < hoursSored.length; i++) { - SeckillTimelineVO tempTimeline = new SeckillTimelineVO(); - if (hoursSored[i] >= hour || ((i + 1) < hoursSored.length && hoursSored[i + 1] > hour)) { - SimpleDateFormat format = new SimpleDateFormat(DateUtil.STANDARD_DATE_FORMAT); - String date = format.format(new Date()); - //当前时间的秒数 - long currentTime = DateUtil.getDateline(); - //限时抢购的时刻 - long timeLine = DateUtil.getDateline(date + " " + hoursSored[i], "yyyy-MM-dd HH"); - if ((i + 1) < hoursSored.length && hour > hoursSored[i] && hour <= hoursSored[i + 1]) { - timeLine = DateUtil.getDateline(date + " " + hoursSored[i + 1], "yyyy-MM-dd HH"); - } - Long distanceTime = timeLine - currentTime < 0 ? 0 : timeLine - currentTime; - tempTimeline.setDistanceStartTime(distanceTime); - tempTimeline.setStartTime(timeLine); - tempTimeline.setTimeLine(hoursSored[i]); - tempTimeline.setSeckillGoodsList(wrapperSeckillGoods(hoursSored[i])); - timelineList.add(tempTimeline); - } + //查询当天时间段内的秒杀活动活动 + Date now = new Date(); + queryWrapper.between(BasePromotions::getStartTime, DateUtil.beginOfDay(now), DateUtil.endOfDay(now)); + queryWrapper.ge(BasePromotions::getEndTime, DateUtil.endOfDay(now)); + List seckillList = this.seckillService.list(queryWrapper); + for (Seckill seckill : seckillList) { + //读取系统时间的时刻 + Calendar c = Calendar.getInstance(); + int hour = c.get(Calendar.HOUR_OF_DAY); + String[] split = seckill.getHours().split(","); + int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); + Arrays.sort(hoursSored); + for (int i = 0; i < hoursSored.length; i++) { + SeckillTimelineVO tempTimeline = new SeckillTimelineVO(); + boolean hoursSoredHour = (hoursSored[i] >= hour || ((i + 1) < hoursSored.length && hoursSored[i + 1] > hour)); + boolean lastHour = i == hoursSored.length - 1 && hoursSored[i] < hour; + if (hoursSoredHour || lastHour) { + SimpleDateFormat format = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN); + String date = format.format(new Date()); + //当前时间的秒数 + long currentTime = DateUtil.currentSeconds(); + //秒杀活动的时刻 + long timeLine = cn.lili.common.utils.DateUtil.getDateline(date + " " + hoursSored[i], "yyyy-MM-dd HH"); + + Long distanceTime = timeLine - currentTime < 0 ? 0 : timeLine - currentTime; + tempTimeline.setDistanceStartTime(distanceTime); + tempTimeline.setStartTime(timeLine); + tempTimeline.setTimeLine(hoursSored[i]); + tempTimeline.setSeckillGoodsList(wrapperSeckillGoods(hoursSored[i], seckill.getId())); + timelineList.add(tempTimeline); } } } - return timelineList; } /** - * 组装当时间限时抢购的商品数据 + * 组装当时间秒杀活动的商品数据 * w * - * @param startTimeline 限时抢购开始时刻 - * @return 当时间限时抢购的商品数据 + * @param startTimeline 秒杀活动开始时刻 + * @return 当时间秒杀活动的商品数据 */ - private List wrapperSeckillGoods(Integer startTimeline) { + private List wrapperSeckillGoods(Integer startTimeline, String seckillId) { List seckillGoodsVoS = new ArrayList<>(); - LambdaQueryWrapper seckillLambdaQueryWrapper = new LambdaQueryWrapper<>(); - seckillLambdaQueryWrapper.gt(Seckill::getStartTime, new Date(DateUtil.startOfTodDay() * 1000)).lt(Seckill::getEndTime, DateUtil.endOfDate()) - .and(i -> i.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()) - .or(j -> j.eq(Seckill::getPromotionStatus, PromotionStatusEnum.START.name()))); - List seckillList = this.seckillService.list(seckillLambdaQueryWrapper); - if (!seckillList.isEmpty()) { - for (Seckill seckill : seckillList) { - LambdaQueryWrapper seckillApplyLambdaQueryWrapper = new LambdaQueryWrapper().eq(SeckillApply::getTimeLine, startTimeline).eq(SeckillApply::getSeckillId, seckill.getId()).eq(SeckillApply::getPromotionApplyStatus, PromotionApplyStatusEnum.PASS.name()); - List list = this.list(seckillApplyLambdaQueryWrapper); - for (SeckillApply seckillApply : list) { - GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId()); - if (goodsSku != null) { - SeckillGoodsVO goodsVO = new SeckillGoodsVO(); - BeanUtil.copyProperties(seckillApply, goodsVO); - goodsVO.setGoodsImage(goodsSku.getThumbnail()); - goodsVO.setGoodsId(goodsSku.getGoodsId()); - goodsVO.setGoodsName(goodsSku.getGoodsName()); - seckillGoodsVoS.add(goodsVO); + List seckillApplyList = this.list(new LambdaQueryWrapper().eq(SeckillApply::getSeckillId, seckillId)); + if (!seckillApplyList.isEmpty()) { + List collect = seckillApplyList.stream().filter(i -> i.getTimeLine().equals(startTimeline) && i.getPromotionApplyStatus().equals(PromotionsApplyStatusEnum.PASS.name())).collect(Collectors.toList()); + for (SeckillApply seckillApply : collect) { + GoodsSku goodsSku = goodsSkuService.getCanPromotionGoodsSkuByIdFromCache(seckillApply.getSkuId()); + if (goodsSku != null) { + SeckillGoodsVO goodsVO = new SeckillGoodsVO(); + BeanUtil.copyProperties(seckillApply, goodsVO); + goodsVO.setGoodsImage(goodsSku.getThumbnail()); + goodsVO.setGoodsId(goodsSku.getGoodsId()); + goodsVO.setGoodsName(goodsSku.getGoodsName()); + String promotionGoodsStockCacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey( + PromotionTypeEnum.SECKILL, + seckillId, seckillApply.getSkuId()); + Object quantity = cache.get(promotionGoodsStockCacheKey); + if (quantity != null) { + goodsVO.setQuantity((Integer) quantity); } + seckillGoodsVoS.add(goodsVO); } } } return seckillGoodsVoS; } - @Autowired - public void setSeckillService(SeckillService seckillService) { - this.seckillService = seckillService; + /** + * 检测秒杀申请的商品 + * + * @param seckill 秒杀活动 + * @param seckillApply 秒杀活动申请 + * @param goodsSku 商品SKU + * @param startTime 秒杀时段开启时间 + */ + private void checkSeckillGoodsSku(Seckill seckill, SeckillApplyVO seckillApply, GoodsSku goodsSku, DateTime startTime) { + //活动库存不能大于商品库存 + if (goodsSku.getQuantity() < seckillApply.getQuantity()) { + throw new ServiceException(seckillApply.getGoodsName() + ",此商品库存不足"); + } + //查询是否在同一时间段参与了拼团活动 + if (promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), goodsSku.getId(), startTime, seckill.getEndTime(), seckill.getId()) > 0) { + throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了拼团活动,不能参加秒杀活动"); + } + //查询是否在同一时间段参与了秒杀活动活动 + if (promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), goodsSku.getId(), startTime, seckill.getEndTime(), seckill.getId()) > 0) { + throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动,不能参加秒杀活动活动"); + } } - @Autowired - public void setPromotionGoodsService(PromotionGoodsService promotionGoodsService) { - this.promotionGoodsService = promotionGoodsService; + /** + * 获取秒杀活动促销商品 + * + * @param goodsSku 商品SKU + * @param seckillApply 秒杀活动申请 + * @param seckill 秒杀活动 + * @return 秒杀活动促销商品 + */ + private PromotionGoods setSeckillGoods(GoodsSku goodsSku, SeckillApply seckillApply, Seckill seckill) { + //设置促销商品默认内容 + PromotionGoods promotionGoods = new PromotionGoods(goodsSku); + promotionGoods.setPrice(seckillApply.getPrice()); + promotionGoods.setQuantity(seckillApply.getQuantity()); + //设置单独每个促销商品的结束时间 + DateTime startTime = DateUtil.offsetHour(DateUtil.beginOfDay(seckill.getStartTime()), seckillApply.getTimeLine()); + promotionGoods.setStartTime(startTime); + if (seckill.getEndTime() == null) { + promotionGoods.setEndTime(DateUtil.endOfDay(startTime)); + } else { + promotionGoods.setEndTime(seckill.getEndTime()); + } + return promotionGoods; } - @Autowired - public void setGoodsSkuService(GoodsSkuService goodsSkuService) { - this.goodsSkuService = goodsSkuService; - } - - @Autowired - public void setEsGoodsIndexService(EsGoodsIndexService esGoodsIndexService) { - this.esGoodsIndexService = esGoodsIndexService; - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java index 3d44ecd1..a747c377 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java @@ -1,296 +1,276 @@ package cn.lili.modules.promotion.serviceimpl; -import cn.lili.common.delayqueue.DelayQueueTools; -import cn.lili.common.delayqueue.DelayQueueType; -import cn.lili.common.delayqueue.PromotionMessage; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapBuilder; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import cn.lili.common.trigger.model.TimeExecuteConstant; -import cn.lili.common.trigger.model.TimeTriggerMsg; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; +import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum; import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.mapper.SeckillMapper; -import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillService; import cn.lili.modules.promotion.tools.PromotionTools; -import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SeckillSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; 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.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.google.gson.Gson; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Arrays; +import java.util.Date; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; /** - * 限时抢购业务层实现 + * 秒杀活动业务层实现 * * @author Chopper - * @date 2020/8/21 + * @since 2020/8/21 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SeckillServiceImpl extends ServiceImpl implements SeckillService { +@Slf4j +public class SeckillServiceImpl extends AbstractPromotionsServiceImpl implements SeckillService { - //延时任务 - private final TimeTrigger timeTrigger; - //Mongo - private final MongoTemplate mongoTemplate; - //Rocketmq - private final RocketmqCustomProperties rocketmqCustomProperties; - //商品索引 - private EsGoodsIndexService goodsIndexService; - //促销商品 - private PromotionGoodsService promotionGoodsService; - //秒杀申请 + /** + * 设置 + */ + @Autowired + private SettingService settingService; + + @Autowired private SeckillApplyService seckillApplyService; - @Override - public IPage getSeckillByPageFromMysql(SeckillSearchParams queryParam, PageVO pageVo) { - QueryWrapper queryWrapper = queryParam.wrapper(); - return page(PageUtil.initPage(pageVo), queryWrapper); - } + /** + * rocketMq配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; /** - * 从mongo中根据条件获取限时抢购分页列表 - * - * @param queryParam 查询参数 - * @param pageVo 分页参数 - * @return 限时抢购分页列表 + * rocketMq */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Override - public IPage getSeckillByPageFromMongo(SeckillSearchParams queryParam, PageVO pageVo) { - IPage seckill = new Page<>(pageVo.getPageNumber(), pageVo.getPageSize()); - if (queryParam == null) { - queryParam = new SeckillSearchParams(); + public SeckillVO getSeckillDetail(String id) { + Seckill seckill = this.checkSeckillExist(id); + SeckillVO seckillVO = new SeckillVO(); + BeanUtils.copyProperties(seckill, seckillVO); + SeckillSearchParams searchParams = new SeckillSearchParams(); + searchParams.setSeckillId(id); + seckillVO.setSeckillApplyList(this.seckillApplyService.getSeckillApplyList(searchParams)); + return seckillVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void init() { + //清除演示数据 + + List seckillList = this.list(); + for (Seckill seckill : seckillList) { + seckill.setStartTime(null); + seckill.setEndTime(null); + this.updateEsGoodsIndex(seckill); } - Query query = queryParam.mongoQuery(); - pageVo.setNotConvert(true); - PromotionTools.mongoQueryPageParam(query, pageVo); - seckill.setCurrent(pageVo.getPageNumber()); - seckill.setSize(pageVo.getPageSize()); - List seckillVOS = this.mongoTemplate.find(query, SeckillVO.class); - seckill.setRecords(seckillVOS); - seckill.setTotal(this.mongoTemplate.count(queryParam.mongoQuery(), SeckillVO.class)); - return seckill; - } + this.remove(new QueryWrapper<>()); - /** - * 从mongo中获取限时抢购信息 - * - * @param id 限时抢购id - * @return 限时抢购信息 - */ - @Override - public SeckillVO getSeckillByIdFromMongo(String id) { - return this.checkSeckillExist(id); - } + Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); + SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); - @Override - public boolean saveSeckill(SeckillVO seckill) { - // 检查限时抢购参数 - checkSeckillParam(seckill, seckill.getStoreId()); - seckill.setPromotionStatus(PromotionStatusEnum.NEW.name()); - // 保存到MYSQL中 - boolean result = this.save(seckill); - // 保存到MONGO中 - this.mongoTemplate.save(seckill); - this.addSeckillStartTask(seckill); - return result; - } - - @Override - public void storeApply(String storeId, String seckillId) { - Seckill seckill = this.getById(seckillId); - String storeIds; - if (!StringUtils.isEmpty(seckill.getStoreIds())) { - storeIds = seckill.getStoreIds() + storeId + ","; - } else { - storeIds = storeId + ","; - } - seckill.setStoreIds(storeIds); - this.updateById(seckill); - } - - @Override - public boolean modifySeckill(SeckillVO seckillVO) { - // 检查该限时抢购是否存在 - SeckillVO seckill = checkSeckillExist(seckillVO.getId()); - if (PromotionStatusEnum.START.name().equals(seckillVO.getPromotionStatus())) { - throw new ServiceException("活动已经开始,不能进行编辑删除操作"); - } - // 检查限时抢购参数 - this.checkSeckillParam(seckillVO, seckillVO.getStoreId()); - - // 更新到MYSQL中 - boolean result = this.updateById(seckillVO); - // 保存到MONGO中 - this.mongoTemplate.save(seckillVO); - if (seckill.getStartTime().getTime() != seckillVO.getStartTime().getTime()) { - PromotionMessage promotionMessage = new PromotionMessage(seckillVO.getId(), PromotionTypeEnum.SECKILL.name(), PromotionStatusEnum.START.name(), seckillVO.getStartTime(), seckillVO.getEndTime()); - // 更新延时任务 - this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, - promotionMessage, - seckill.getStartTime().getTime(), - seckillVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - DateUtil.getDelayTime(seckillVO.getStartTime().getTime()), - rocketmqCustomProperties.getPromotionTopic()); - } - return result; - } - - @Override - public void deleteSeckill(String id) { - Seckill seckill = checkSeckillExist(id); - if (PromotionStatusEnum.CLOSE.name().equals(seckill.getPromotionStatus()) || PromotionStatusEnum.END.name().equals(seckill.getPromotionStatus())) { - // 更新限时抢购状态为关闭,标示删除标志 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper().eq(Seckill::getId, id).set(Seckill::getDeleteFlag, true).set(Seckill::getPromotionStatus, PromotionStatusEnum.CLOSE.name()); - this.update(updateWrapper); - LambdaUpdateWrapper seckillApplyLambdaUpdateWrapper = new LambdaUpdateWrapper().eq(SeckillApply::getSeckillId, id).set(SeckillApply::getDeleteFlag, true); - this.seckillApplyService.update(seckillApplyLambdaUpdateWrapper); - this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), SeckillVO.class); - LambdaUpdateWrapper promotionGoodsQueryWrapper = new LambdaUpdateWrapper().eq(PromotionGoods::getPromotionId, id).set(PromotionGoods::getDeleteFlag, true); - this.promotionGoodsService.update(promotionGoodsQueryWrapper); - this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, - seckill.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())), - rocketmqCustomProperties.getPromotionTopic()); - } else { - throw new ServiceException("该限时抢购活动的状态不能删除"); - } - } - - /** - * 开启一个限时抢购 - * - * @param id 限时抢购编号 - */ - @Override - public void openSeckill(String id) { - SeckillVO seckillVO = checkSeckillExist(id); - PromotionTools.checkPromotionTime(seckillVO.getStartTime().getTime(), seckillVO.getEndTime().getTime()); - if (PromotionStatusEnum.NEW.name().equals(seckillVO.getPromotionStatus()) || PromotionStatusEnum.CLOSE.name().equals(seckillVO.getPromotionStatus())) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper().eq(Seckill::getId, id).set(Seckill::getPromotionStatus, PromotionStatusEnum.START.name()); - this.update(updateWrapper); - seckillVO.setPromotionStatus(PromotionStatusEnum.START.name()); - this.mongoTemplate.save(seckillVO); - this.addSeckillStartTask(seckillVO); + for (int i = 1; i <= PRE_CREATION; i++) { + Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule()); + this.savePromotions(seckill); } } @Override - public void closeSeckill(String id) { - SeckillVO seckillVO = checkSeckillExist(id); - if (PromotionStatusEnum.NEW.name().equals(seckillVO.getPromotionStatus()) || PromotionStatusEnum.START.name().equals(seckillVO.getPromotionStatus())) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper().eq(Seckill::getId, id).set(Seckill::getPromotionStatus, PromotionStatusEnum.CLOSE.name()); - this.update(updateWrapper); - seckillVO.setPromotionStatus(PromotionStatusEnum.CLOSE.name()); - this.mongoTemplate.save(seckillVO); - if (PromotionStatusEnum.CLOSE.name().equals(seckillVO.getPromotionStatus())) { - LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); - deleteWrapper.eq(PromotionGoods::getPromotionId, seckillVO.getId()); - promotionGoodsService.remove(deleteWrapper); - if (seckillVO.getSeckillApplyList() != null) { - List skuIds = seckillVO.getSeckillApplyList().stream().map(SeckillApply::getSkuId).collect(Collectors.toList()); - this.goodsIndexService.deleteEsGoodsPromotionIndexByList(skuIds, PromotionTypeEnum.SECKILL); - } - this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, - seckillVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())), - rocketmqCustomProperties.getPromotionTopic()); - } - } else { - throw new ServiceException("该限时抢购活动的状态不能关闭"); - } - } - - @Override - public Integer getApplyNum() { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - //秒杀申请时间未超过当前时间 - queryWrapper.le(Seckill::getApplyEndTime, cn.hutool.core.date.DateUtil.date()); - queryWrapper.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()); + public long getApplyNum() { + DateTime now = DateUtil.date(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.ge(Seckill::getApplyEndTime, now); + queryWrapper.le(Seckill::getStartTime, now); + queryWrapper.ge(Seckill::getEndTime, now); return this.count(queryWrapper); } - private void addSeckillStartTask(SeckillVO seckill) { - PromotionMessage promotionMessage = new PromotionMessage(seckill.getId(), PromotionTypeEnum.SECKILL.name(), PromotionStatusEnum.START.name(), seckill.getStartTime(), seckill.getEndTime()); - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, - seckill.getStartTime().getTime(), - promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - rocketmqCustomProperties.getPromotionTopic()); - // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(seckill.getStartTime().getTime())); + @Override + public void updateSeckillGoodsNum(String seckillId) { + Seckill seckill = this.getById(seckillId); + if (seckill != null) { + SeckillSearchParams searchParams = new SeckillSearchParams(); + searchParams.setSeckillId(seckillId); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Seckill::getId, seckillId); + updateWrapper.set(Seckill::getGoodsNum, + this.seckillApplyService.getSeckillApplyCount(searchParams)); + this.update(updateWrapper); + + } } /** - * 检查该限时抢购是否存在 + * 通用促销更新 + * 调用顺序: + * 1. checkStatus 检查促销状态 + * 2. checkPromotions 检查促销参数 + * 3. saveOrUpdate 保存促销信息 + * 4. updatePromotionGoods 更新促销商品信息 + * 5. updateEsGoodsIndex 更新商品索引促销信息 * - * @param id 限时抢购编号 - * @return 限时抢购信息 + * @param promotions 促销信息 + * @return 是否更新成功 */ - private SeckillVO checkSeckillExist(String id) { - SeckillVO seckill = this.mongoTemplate.findById(id, SeckillVO.class); + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updatePromotions(Seckill promotions) { + this.checkStatus(promotions); + this.checkPromotions(promotions); + //如果申请结束时间在当前时间之前 + if (promotions.getApplyEndTime().before(new Date()) || promotions.getApplyEndTime().after(promotions.getStartTime())) { + throw new ServiceException(ResultCode.STORE_NAME_EXIST_ERROR); + } + boolean result = this.updateById(promotions); + seckillApplyService.updateSeckillApplyTime(promotions); + return result; + } + + + /** + * 更新商品索引限时抢购信息 + * + * @param seckill 限时抢购信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateEsGoodsSeckill(Seckill seckill, List seckillApplies) { + if (seckillApplies != null && !seckillApplies.isEmpty()) { + // 更新促销范围 + seckill.setScopeId(ArrayUtil.join(seckillApplies.stream().map(SeckillApply::getSkuId).toArray(), ",")); + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", seckill.getId()); + updateWrapper.set("scope_id", seckill.getScopeId()); + this.update(updateWrapper); + //循环秒杀商品数据,将数据按照时间段进行存储 + for (SeckillApply seckillApply : seckillApplies) { + if (seckillApply.getPromotionApplyStatus().equals(PromotionsApplyStatusEnum.PASS.name())) { + this.setSeckillApplyTime(seckill, seckillApply); + } + } + if (!seckillApplies.isEmpty()) { + this.updateEsGoodsIndex(seckill); + } + } + } + + /** + * 删除商品索引限时抢购信息 + * + * @param seckill 限时抢购信息 + * @param skuIds 商品skuId列表 + */ + @Override + public void deleteEsGoodsSeckill(Seckill seckill, List skuIds) { + Map build = MapBuilder.create().put("promotionKey", this.getPromotionType() + "-" + seckill.getId()).put("scopeId", ArrayUtil.join(skuIds.toArray(), ",")).build(); + //删除商品促销消息 + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.DELETE_GOODS_INDEX_PROMOTIONS.name(); + //发送mq消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(build), RocketmqSendCallbackBuilder.commonCallback()); + } + + @Override + public void setSeckillApplyTime(Seckill seckill, SeckillApply seckillApply) { + //下一个时间,默认为当天结束时间 + int nextHour = PromotionTools.nextHour(seckill.getHours().split(","), seckillApply.getTimeLine()); + + String format = DateUtil.format(seckill.getStartTime(), DatePattern.NORM_DATE_PATTERN); + DateTime parseStartTime = DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH"); + DateTime parseEndTime = DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH"); + //如果是当天最后的时间段则设置到当天结束时间的59分59秒 + if (nextHour == seckillApply.getTimeLine()) { + parseEndTime = DateUtil.parse((format + " " + nextHour + ":59:59"), DatePattern.NORM_DATETIME_PATTERN); + } + seckill.setStartTime(parseStartTime); + //当时商品的秒杀活动活动结束时间为下个时间段的开始 + seckill.setEndTime(parseEndTime); + } + + /** + * 检查该秒杀活动是否存在 + * + * @param id 秒杀活动编号 + * @return 秒杀活动信息 + */ + private Seckill checkSeckillExist(String id) { + Seckill seckill = this.getById(id); if (seckill == null) { - throw new ServiceException("当前限时抢购活动不存在"); + throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR); } return seckill; } /** - * 检查限时抢购参数 + * 初始化促销字段 * - * @param seckill 限时抢购信息 - * @param storeId 卖家编号 + * @param promotions 促销实体 */ - private void checkSeckillParam(SeckillVO seckill, String storeId) { - seckill.checkTime(); - // 同一时间段内相同的活动 - QueryWrapper queryWrapper = PromotionTools.checkActiveTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL, storeId, seckill.getId()); - int sameNum = this.count(queryWrapper); - // 当前时间段是否存在同类活动 - if (sameNum > 0) { - throw new ServiceException("当前时间内已存在同类活动"); + @Override + public void initPromotion(Seckill promotions) { + super.initPromotion(promotions); + if (promotions.getStartTime() != null && promotions.getEndTime() == null) { + promotions.setEndTime(DateUtil.endOfDay(promotions.getStartTime())); } } - @Autowired - public void setEsGoodsIndexService(EsGoodsIndexService goodsIndexService) { - this.goodsIndexService = goodsIndexService; + /** + * 检查促销状态 + * + * @param promotions 促销实体 + */ + @Override + public void checkStatus(Seckill promotions) { + super.checkStatus(promotions); + if (promotions.getStartTime() != null && CharSequenceUtil.isNotEmpty(promotions.getHours())) { + Integer[] split = Convert.toIntArray(promotions.getHours().split(",")); + Arrays.sort(split); + String startTimeStr = DateUtil.format(promotions.getStartTime(), DatePattern.NORM_DATE_PATTERN) + " " + split[0] + ":00"; + promotions.setStartTime(DateUtil.parse(startTimeStr, DatePattern.NORM_DATETIME_MINUTE_PATTERN)); + promotions.setEndTime(DateUtil.endOfDay(promotions.getStartTime())); + } } - @Autowired - public void setPromotionGoodsService(PromotionGoodsService promotionGoodsService) { - this.promotionGoodsService = promotionGoodsService; + /** + * 当前促销类型 + * + * @return 当前促销类型 + */ + @Override + public PromotionTypeEnum getPromotionType() { + return PromotionTypeEnum.SECKILL; } - - @Autowired - public void setSeckillApplyService(SeckillApplyService seckillApplyService) { - this.seckillApplyService = seckillApplyService; - } - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionCacheKeys.java b/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionCacheKeys.java deleted file mode 100644 index e2f4be21..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionCacheKeys.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.lili.modules.promotion.tools; - -import cn.lili.common.cache.CachePrefix; - -/** - * 满额活动缓存Key - * @author paulG - * @date 2020/10/12 - **/ -public class PromotionCacheKeys { - - /** - * 读取满优惠redis key - * @param activityId 活动ID - * @return 满优惠redis key - */ - public static String getFullDiscountKey(String activityId){ - return CachePrefix.STORE_ID_FULL_DISCOUNT + "::" + activityId; - } - - /** - * 读取满优惠redis key - * @param id id - * @return 满优惠redis key - */ - public static String getPromotionGoodsKey(String id){ - return CachePrefix.PROMOTION_GOODS + "::" + id; - } - - /** - * 读取满优惠redis key - * @param timeStr 时间字符串(格式为 yyyyMMdd) - * @return 满优惠redis key - */ - public static String getSeckillTimelineKey(String timeStr){ - return CachePrefix.STORE_ID_SECKILL + "::" + timeStr; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java b/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java index 84ea7853..6dc91f2f 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java +++ b/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionTools.java @@ -1,48 +1,41 @@ package cn.lili.modules.promotion.tools; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.BasePromotions; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.dto.BasePromotion; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.data.mongodb.core.query.Query; +import lombok.extern.slf4j.Slf4j; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; /** * 优惠活动通用验证类 * * @author paulG - * @date 2020/8/18 + * @since 2020/8/18 **/ +@Slf4j public class PromotionTools { - /** - * 参数验证 - * 1、活动起始时间必须大于当前时间 - * 2、验证活动开始时间是否大于活动结束时间 - * - * @param startTime 活动开始时间 - * @param endTime 活动结束时间 - * @param num 参与活动商品数量 - * @param goodsList 选择的商品 - */ - public static void paramValid(Long startTime, Long endTime, int num, List goodsList) { + public static final String START_TIME_COLUMN = "start_time"; + public static final String END_TIME_COLUMN = "end_time"; + public static final String PLATFORM_ID = "0"; + public static final String PLATFORM_NAME = "platform"; - checkPromotionTime(startTime, endTime); - - // 如果促销活动选择的是部分商品参加活动 - if (num != -1 && goodsList == null) { - throw new ServiceException("请选择要参与活动的商品"); - } + private PromotionTools() { + throw new IllegalStateException("Utility class"); } /** @@ -53,18 +46,26 @@ public class PromotionTools { * @param startTime 活动开始时间 * @param endTime 活动结束时间 */ - public static void checkPromotionTime(Long startTime, Long endTime) { + public static void checkPromotionTime(Date startTime, Date endTime) { - long nowTime = DateUtil.getDateline() * 1000; - - //如果活动起始时间小于现在时间 - if (startTime < nowTime) { - throw new ServiceException("活动起始时间必须大于当前时间"); + if (startTime == null) { + throw new ServiceException(ResultCode.PROMOTION_TIME_NOT_EXIST); } - // 开始时间不能大于结束时间 - if (startTime > endTime) { - throw new ServiceException("活动起始时间不能大于活动结束时间"); + DateTime now = DateUtil.date(); + + //如果活动起始时间小于现在时间 + if (now.after(startTime)) { + throw new ServiceException(ResultCode.PROMOTION_START_TIME_ERROR); + } + //如果活动结束时间小于现在时间 + if (endTime != null && now.after(endTime)) { + throw new ServiceException(ResultCode.PROMOTION_END_TIME_ERROR); + } + + //开始时间不能大于结束时间 + if (endTime != null && startTime.after(endTime)) { + throw new ServiceException(ResultCode.PROMOTION_TIME_ERROR); } } @@ -75,24 +76,20 @@ public class PromotionTools { * @param endTime 结束时间 * @param typeEnum 促销类型 * @param storeId 店铺id - * @param activityId 促销活动id - * @param 促销类型 + * @param activityId 排除的促销活动id * @return mybatis plus query wrapper对象 */ - public static QueryWrapper checkActiveTime(Date startTime, Date endTime, PromotionTypeEnum typeEnum, String storeId, String activityId) { + public static QueryWrapper checkActiveTime(Date startTime, Date endTime, PromotionTypeEnum typeEnum, String storeId, String activityId) { QueryWrapper queryWrapper = new QueryWrapper<>(); - String startTimeColumn = "start_time"; - String endTimeColumn = "end_time"; if (PromotionTypeEnum.SECKILL != typeEnum) { queryWrapper.nested(i -> { - // 新活动起始时间 大于 之前活动的起始时间 小于 之前活动的截止时间 - i.nested(i2 -> i2.le(startTimeColumn, startTime).ge(endTimeColumn, startTime)); - // 新活动结束时间 大于 之前活动的起始时间 小于 之前活动的截止时间 - i.or(i1 -> i1.le(startTimeColumn, endTime).ge(endTimeColumn, endTime)); + //新活动起始时间 大于 之前活动的起始时间 小于 之前活动的截止时间 + i.nested(i2 -> i2.le(START_TIME_COLUMN, startTime).ge(END_TIME_COLUMN, startTime)); + //新活动结束时间 大于 之前活动的起始时间 小于 之前活动的截止时间 + i.or(i1 -> i1.le(START_TIME_COLUMN, endTime).ge(END_TIME_COLUMN, endTime)); }); } else { - // queryWrapper.le(startTimeColumn, startTime).ge(endTimeColumn, startTime); - queryWrapper.ge(startTimeColumn, cn.hutool.core.date.DateUtil.beginOfDay(startTime)).le(endTimeColumn, cn.hutool.core.date.DateUtil.endOfDay(endTime)); + queryWrapper.ge(START_TIME_COLUMN, DateUtil.beginOfDay(startTime)).le(END_TIME_COLUMN, DateUtil.endOfDay(endTime)); } if (storeId != null) { queryWrapper.eq("store_id", storeId); @@ -100,13 +97,53 @@ public class PromotionTools { if (activityId != null) { queryWrapper.ne("id", activityId); } - // 忽略已作废和已关闭的活动 - queryWrapper.ne("promotion_status", PromotionStatusEnum.END.name()); - queryWrapper.ne("promotion_status", PromotionStatusEnum.CLOSE.name()); + queryWrapper.and(i -> i.or(queryPromotionStatus(PromotionsStatusEnum.NEW)).or(queryPromotionStatus(PromotionsStatusEnum.START))); queryWrapper.eq("delete_flag", false); return queryWrapper; } + /** + * 检查商品是否重复参加同类型活动 + * + * @param exceptType 排除的促销活动类型(可同时参加的活动类型) + * @param skuIds 商品skuId + * @param activityId 当前活动id + * @return mybatis plus query wrapper对象 + */ + public static QueryWrapper checkSkuDuplicate(List exceptType, List skuIds, String activityId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (skuIds != null && !skuIds.isEmpty()) { + queryWrapper.in("sku_id", skuIds); + } + if (CharSequenceUtil.isNotEmpty(activityId)) { + queryWrapper.ne("id", activityId); + } + queryWrapper.and(i -> i.or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)).or(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.NEW))); + + if (exceptType != null) { + queryWrapper.notIn(!exceptType.isEmpty(), "promotion_type", exceptType.stream().map(PromotionTypeEnum::name).collect(Collectors.toList())); + } + queryWrapper.eq("delete_flag", false); + + return queryWrapper; + } + + + public static Consumer> queryPromotionStatus(PromotionsStatusEnum promotionsStatusEnum) { + switch (promotionsStatusEnum) { + case NEW: + return (QueryWrapper t) -> t.nested(i -> i.gt(START_TIME_COLUMN, new Date()).gt(END_TIME_COLUMN, new Date())); + case START: + return (QueryWrapper t) -> t.nested(i -> i.le(START_TIME_COLUMN, new Date()).ge(END_TIME_COLUMN, new Date())); + case END: + return (QueryWrapper t) -> t.nested(i -> i.lt(START_TIME_COLUMN, new Date()).lt(END_TIME_COLUMN, new Date())); + case CLOSE: + return (QueryWrapper t) -> t.nested(i -> i.isNull(START_TIME_COLUMN).isNull(END_TIME_COLUMN)); + default: + return null; + } + } + /** * 促销商品入库前填充 * @@ -114,35 +151,84 @@ public class PromotionTools { * @param promotion 促销信息 * @return 促销商品列表 */ - public static List promotionGoodsInit(List originList, BasePromotion promotion, PromotionTypeEnum promotionTypeEnum) { - // 本次促销商品入库 - for (PromotionGoods promotionGoods : originList) { - promotionGoods.setPromotionId(promotion.getId()); - promotionGoods.setStoreName(promotion.getStoreName()); - promotionGoods.setTitle(promotion.getPromotionName()); - promotionGoods.setStartTime(promotion.getStartTime()); - if (promotion.getEndTime() == null) { - promotionGoods.setEndTime(promotion.getEndTime()); + public static List promotionGoodsInit(List originList, BasePromotions promotion, PromotionTypeEnum promotionTypeEnum) { + if (originList != null) { + //本次促销商品入库 + for (PromotionGoods promotionGoods : originList) { + promotionGoods.setPromotionId(promotion.getId()); + if (CharSequenceUtil.isEmpty(promotionGoods.getStoreId())) { + promotionGoods.setStoreId(promotion.getStoreId()); + } + if (CharSequenceUtil.isEmpty(promotionGoods.getStoreName())) { + promotionGoods.setStoreName(promotion.getStoreName()); + } + promotionGoods.setTitle(promotion.getPromotionName()); + // 如果是秒杀活动保留原时间 + if (promotionGoods.getStartTime() == null || !PromotionTypeEnum.SECKILL.equals(promotionTypeEnum)) { + promotionGoods.setStartTime(promotion.getStartTime()); + } + if (promotionGoods.getStartTime() == null || !PromotionTypeEnum.SECKILL.equals(promotionTypeEnum)) { + promotionGoods.setEndTime(promotion.getEndTime()); + } + promotionGoods.setPromotionType(promotionTypeEnum.name()); + promotionGoods.setNum(0); + promotionGoods.setDeleteFlag(promotion.getDeleteFlag()); } - promotionGoods.setPromotionType(promotionTypeEnum.name()); - promotionGoods.setPromotionStatus(promotion.getPromotionStatus()); - promotionGoods.setNum(0); } return originList; } + + public static int nextHour(String[] totalHours, Integer timeline) { + int nextHour = 23; + int[] hoursSored = Arrays.stream(totalHours).mapToInt(Integer::parseInt).toArray(); + Arrays.sort(hoursSored); + for (int i : hoursSored) { + if (timeline < i) { + nextHour = i; + break; + } + } + return nextHour; + } + /** - * 为mongoQuery组织分页排序参数 + * 过滤无效促销活动 * - * @param query 查询条件 - * @param page 分页排序参数 + * @param map 促销活动map + * @return 过滤后的促销活动map */ - public static void mongoQueryPageParam(Query query, PageVO page) { - page.setNotConvert(true); - query.with(PageRequest.of(page.getMongoPageNumber(), page.getPageSize())); - if (!CharSequenceUtil.isEmpty(page.getOrder()) && !CharSequenceUtil.isEmpty(page.getSort())) { - query.with(Sort.by(Sort.Direction.valueOf(page.getOrder().toUpperCase()), page.getSort())); + public static Map filterInvalidPromotionsMap(Map map) { + if (CollUtil.isEmpty(map)) { + return new HashMap<>(); + } + try { + //移除无效促销活动 + return map.entrySet().stream().filter(Objects::nonNull).filter(i -> { + JSONObject promotionsObj = JSONUtil.parseObj(i.getValue()); + BasePromotions basePromotions = promotionsObj.toBean(BasePromotions.class); + if (basePromotions != null && basePromotions.getStartTime() != null && basePromotions.getEndTime() != null) { + return basePromotions.getStartTime().getTime() <= System.currentTimeMillis() && basePromotions.getEndTime().getTime() >= System.currentTimeMillis(); + } + return i.getValue() != null; + }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue)); + } catch (Exception e) { + log.error("过滤无效促销活动出现异常。异常促销信息:{},异常信息 ", map, e); + return new HashMap<>(); } } + /** + * 是否为需要检查的促销活动类型(用于判定部分类型的商品不能参与活动的条件) + * 内容为不需要检查的促销活动类型 + * + * @param key 促销key + * @return 当前促销key是否存在 + */ + public static boolean isPromotionsTypeNeedsToChecked(String key) { + return !CharSequenceUtil.containsAny(key, + PromotionTypeEnum.COUPON.name(), + PromotionTypeEnum.FULL_DISCOUNT.name()); + } + } diff --git a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrder.java b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrder.java index 0eac781d..5ab54c6c 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrder.java +++ b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrder.java @@ -1,27 +1,23 @@ package cn.lili.modules.purchase.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** * 供求单 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @Data -@Entity @ApiModel(value = "供求单") @TableName("li_purchase_order") -@Table(name = "li_purchase_order") public class PurchaseOrder extends BaseEntity { @ApiModelProperty(value = "标题") diff --git a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrderItem.java b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrderItem.java index c0b5449e..159c749c 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrderItem.java +++ b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseOrderItem.java @@ -1,8 +1,8 @@ package cn.lili.modules.purchase.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -11,31 +11,18 @@ import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 采购单子内容 * * @author Bulbasaur - * @date 2020/11/26 19:32 + * @since 2020/11/26 19:32 */ @Data -@Entity -@Table(name = "li_purchase_order_item") @TableName("li_purchase_order_item") @ApiModel(value = "采购单子内容") -public class PurchaseOrderItem { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class PurchaseOrderItem extends BaseIdEntity { @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @@ -60,7 +47,6 @@ public class PurchaseOrderItem { private Double price; @ApiModelProperty(value = "规格") - @Column(columnDefinition = "TEXT") private String specs; @ApiModelProperty(value = "图片") diff --git a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuoted.java b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuoted.java index 5bfb2331..4a297b18 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuoted.java +++ b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuoted.java @@ -1,10 +1,8 @@ package cn.lili.modules.purchase.entity.dos; -import cn.lili.base.BaseEntity; -import cn.lili.common.utils.SnowFlake; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -13,31 +11,18 @@ import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 报价单 * * @author Chopper - * @date 2020/11/26 20:43 + * @since 2020/11/26 20:43 */ @Data -@Entity @ApiModel(value = "供求单报价") @TableName("li_purchase_quoted") -@Table(name = "li_purchase_quoted") -public class PurchaseQuoted { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class PurchaseQuoted extends BaseIdEntity { @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuotedItem.java b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuotedItem.java index 16e85fcc..f7a576ae 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuotedItem.java +++ b/framework/src/main/java/cn/lili/modules/purchase/entity/dos/PurchaseQuotedItem.java @@ -1,9 +1,8 @@ package cn.lili.modules.purchase.entity.dos; -import cn.lili.common.utils.SnowFlake; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -12,31 +11,18 @@ import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 报价单字内容 * * @author Bulbasaur - * @date 2020/11/26 20:43 + * @since 2020/11/26 20:43 */ @Data -@Entity @ApiModel(value = "供求单报价") @TableName("li_purchase_quoted_item") -@Table(name = "li_purchase_quoted_item") -public class PurchaseQuotedItem { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class PurchaseQuotedItem extends BaseIdEntity { @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @@ -52,7 +38,6 @@ public class PurchaseQuotedItem { private String goodsName; @ApiModelProperty(value = "规格") - @Column(columnDefinition = "TEXT") private String specs; @ApiModelProperty(value = "数量") diff --git a/framework/src/main/java/cn/lili/modules/purchase/entity/params/PurchaseOrderSearchParams.java b/framework/src/main/java/cn/lili/modules/purchase/entity/params/PurchaseOrderSearchParams.java index 0be43cd2..50446405 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/entity/params/PurchaseOrderSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/purchase/entity/params/PurchaseOrderSearchParams.java @@ -8,7 +8,7 @@ import lombok.Data; * 供求单查询参数 * * @author Bulbasaur - * @date 2020/11/27 11:29 + * @since 2020/11/27 11:29 */ @Data public class PurchaseOrderSearchParams extends PageVO { diff --git a/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseOrderVO.java b/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseOrderVO.java index 53e9f9f7..373b5bb5 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseOrderVO.java +++ b/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseOrderVO.java @@ -10,7 +10,7 @@ import java.util.List; * 采购单VO * * @author Bulbasaur - * @date 2020/11/26 19:54 + * @since 2020/11/26 19:54 */ @Data public class PurchaseOrderVO extends PurchaseOrder { diff --git a/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseQuotedVO.java b/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseQuotedVO.java index e0524fbd..57d4964f 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseQuotedVO.java +++ b/framework/src/main/java/cn/lili/modules/purchase/entity/vos/PurchaseQuotedVO.java @@ -10,7 +10,7 @@ import java.util.List; * 报价单VO * * @author Bulbasaur - * @date 2020/11/26 19:54 + * @since 2020/11/26 19:54 */ @Data public class PurchaseQuotedVO extends PurchaseQuoted { diff --git a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderItemMapper.java b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderItemMapper.java index 41547acc..cdd20032 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderItemMapper.java +++ b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderItemMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 采购单子内容数据处理层 * * @author Bulbasaur - * @date 2020/11/26 16:11 + * @since 2020/11/26 16:11 */ public interface PurchaseOrderItemMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderMapper.java b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderMapper.java index f7f6f1c1..7d508945 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderMapper.java +++ b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseOrderMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 采购单数据处理层 * * @author Bulbasaur - * @date 2020/11/26 16:11 + * @since 2020/11/26 16:11 */ public interface PurchaseOrderMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedItemMapper.java b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedItemMapper.java index 78ae523e..df857064 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedItemMapper.java +++ b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedItemMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 采购单子内容数据处理层 * * @author Bulbasaur - * @date 2020/11/26 16:11 + * @since 2020/11/26 16:11 */ public interface PurchaseQuotedItemMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedMapper.java b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedMapper.java index a6587903..0ca28701 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedMapper.java +++ b/framework/src/main/java/cn/lili/modules/purchase/mapper/PurchaseQuotedMapper.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 采购报价数据处理层 * * @author Bulbasaur - * @date 2020/11/26 16:11 + * @since 2020/11/26 16:11 */ public interface PurchaseQuotedMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderItemService.java b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderItemService.java index 2d289a1b..048845af 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderItemService.java +++ b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderItemService.java @@ -10,7 +10,7 @@ import java.util.List; * 采购单子内容业务层 * * @author Bulbasaur - * @date 2020/11/26 16:12 + * @since 2020/11/26 16:12 */ public interface PurchaseOrderItemService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderService.java b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderService.java index ba92322b..fc9780bb 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderService.java +++ b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseOrderService.java @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 采购单业务层 * * @author Bulbasaur - * @date 2020/11/26 16:12 + * @since 2020/11/26 16:12 */ public interface PurchaseOrderService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedItemService.java b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedItemService.java index 7ee68777..7536a63b 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedItemService.java +++ b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedItemService.java @@ -10,7 +10,7 @@ import java.util.List; * 采购单子内容业务层 * * @author Bulbasaur - * @date 2020/11/26 16:12 + * @since 2020/11/26 16:12 */ public interface PurchaseQuotedItemService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedService.java b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedService.java index b4a0646a..523ea6a8 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedService.java +++ b/framework/src/main/java/cn/lili/modules/purchase/service/PurchaseQuotedService.java @@ -11,7 +11,7 @@ import java.util.List; * 采购单报价业务层 * * @author Bulbasaur - * @date 2020/11/26 16:12 + * @since 2020/11/26 16:12 */ public interface PurchaseQuotedService extends IService { /** diff --git a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderItemServiceImpl.java b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderItemServiceImpl.java index 102d8062..b17b30c6 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderItemServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderItemServiceImpl.java @@ -4,8 +4,6 @@ import cn.lili.modules.purchase.entity.dos.PurchaseOrderItem; import cn.lili.modules.purchase.mapper.PurchaseOrderItemMapper; import cn.lili.modules.purchase.service.PurchaseOrderItemService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,13 +14,13 @@ import java.util.List; * 采购单子内容业务层实现 * * @author Bulbasaur - * @date 2020/11/26 16:13 + * @since 2020/11/26 16:13 */ @Service -@Transactional public class PurchaseOrderItemServiceImpl extends ServiceImpl implements PurchaseOrderItemService { @Override + @Transactional(rollbackFor = Exception.class) public boolean addPurchaseOrderItem(String purchaseOrderId, List purchaseOrderItemList) { //添加采购单子内容 for (PurchaseOrderItem purchaseOrderItem : purchaseOrderItemList) { diff --git a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderServiceImpl.java index 11cb57ea..bfb29b6b 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseOrderServiceImpl.java @@ -1,46 +1,44 @@ package cn.lili.modules.purchase.serviceimpl; +import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.BeanUtil; import cn.lili.modules.purchase.entity.dos.PurchaseOrder; -import cn.lili.modules.purchase.entity.vos.PurchaseOrderVO; +import cn.lili.modules.purchase.entity.dos.PurchaseOrderItem; import cn.lili.modules.purchase.entity.params.PurchaseOrderSearchParams; +import cn.lili.modules.purchase.entity.vos.PurchaseOrderVO; import cn.lili.modules.purchase.mapper.PurchaseOrderMapper; import cn.lili.modules.purchase.service.PurchaseOrderItemService; import cn.lili.modules.purchase.service.PurchaseOrderService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashMap; -import java.util.Map; - /** * 采购单业务层实现 * * @author Bulbasaur - * @date 2020/11/26 16:13 + * @since 2020/11/26 16:13 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PurchaseOrderServiceImpl extends ServiceImpl implements PurchaseOrderService { - - private final PurchaseOrderItemService purchaseOrderItemService; + @Autowired + private PurchaseOrderItemService purchaseOrderItemService; @Override + @Transactional(rollbackFor = Exception.class) public PurchaseOrderVO addPurchaseOrder(PurchaseOrderVO purchaseOrderVO) { PurchaseOrder purchaseOrder = new PurchaseOrder(); BeanUtil.copyProperties(purchaseOrderVO, purchaseOrder); //添加采购单 purchaseOrder.setStatus("OPEN"); + purchaseOrder.setMemberId(UserContext.getCurrentUser().getId()); this.save(purchaseOrder); //添加采购单子内容 purchaseOrderItemService.addPurchaseOrderItem(purchaseOrder.getId(), purchaseOrderVO.getPurchaseOrderItems()); @@ -55,9 +53,8 @@ public class PurchaseOrderServiceImpl extends ServiceImpl map = new HashMap<>(); - map.put("purchaseOrderId", id); - purchaseOrderVO.setPurchaseOrderItems(purchaseOrderItemService.listByMap(map)); + purchaseOrderVO.setPurchaseOrderItems(purchaseOrderItemService.list( + new LambdaQueryWrapper().eq(PurchaseOrderItem::getPurchaseOrderId,id))); return purchaseOrderVO; } @@ -65,24 +62,19 @@ public class PurchaseOrderServiceImpl extends ServiceImpl page(PurchaseOrderSearchParams purchaseOrderSearchParams) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - if (purchaseOrderSearchParams.getMemberId() != null) { - lambdaQueryWrapper.eq(PurchaseOrder::getMemberId, purchaseOrderSearchParams.getMemberId()); - } - if (purchaseOrderSearchParams.getCategoryId() != null) { - lambdaQueryWrapper.eq(PurchaseOrder::getCategoryId, purchaseOrderSearchParams.getCategoryId()); - } - if (purchaseOrderSearchParams.getStatus() != null) { - lambdaQueryWrapper.eq(PurchaseOrder::getStatus, purchaseOrderSearchParams.getStatus()); - } - Page page = new Page(); - page.setSize(purchaseOrderSearchParams.getPageSize()); - page.setPages(purchaseOrderSearchParams.getPageNumber()); - IPage purchaseOrders = this.page(page, lambdaQueryWrapper); - return purchaseOrders; + lambdaQueryWrapper.eq(purchaseOrderSearchParams.getMemberId() != null, + PurchaseOrder::getMemberId, purchaseOrderSearchParams.getMemberId()); + lambdaQueryWrapper.eq(purchaseOrderSearchParams.getCategoryId() != null, + PurchaseOrder::getCategoryId, purchaseOrderSearchParams.getCategoryId()); + lambdaQueryWrapper.eq(purchaseOrderSearchParams.getStatus() != null, + PurchaseOrder::getStatus, purchaseOrderSearchParams.getStatus()); + lambdaQueryWrapper.orderByDesc(PurchaseOrder::getCreateTime); + return this.page(PageUtil.initPage(purchaseOrderSearchParams), lambdaQueryWrapper); } @Override + @Transactional(rollbackFor = Exception.class) public boolean close(String id) { PurchaseOrder purchaseOrder = this.getById(id); purchaseOrder.setStatus("CLOSE"); diff --git a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedItemServiceImpl.java b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedItemServiceImpl.java index 6569c7b1..e712c2b4 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedItemServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedItemServiceImpl.java @@ -3,6 +3,7 @@ package cn.lili.modules.purchase.serviceimpl; import cn.lili.modules.purchase.entity.dos.PurchaseQuotedItem; import cn.lili.modules.purchase.mapper.PurchaseQuotedItemMapper; import cn.lili.modules.purchase.service.PurchaseQuotedItemService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,23 +15,23 @@ import java.util.List; * 采购单子内容业务层实现 * * @author Bulbasaur - * @date 2020/11/26 16:13 + * @since 2020/11/26 16:13 */ @Service -@Transactional public class PurchaseQuotedItemServiceImpl extends ServiceImpl implements PurchaseQuotedItemService { @Override + @Transactional(rollbackFor = Exception.class) public boolean addPurchaseQuotedItem(String purchaseQuotedId, List purchaseQuotedItemList) { for (PurchaseQuotedItem purchaseQuotedItem : purchaseQuotedItemList) { purchaseQuotedItem.setPurchaseQuotedId(purchaseQuotedId); - this.save(purchaseQuotedItem); } - return true; + + return this.saveBatch(purchaseQuotedItemList); } @Override public List purchaseQuotedItemList(String purchaseQuotedId) { - return null; + return this.list(new LambdaQueryWrapper().eq(PurchaseQuotedItem::getPurchaseQuotedId,purchaseQuotedId)); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java index 3d05a95f..a963215d 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java @@ -9,7 +9,6 @@ import cn.lili.modules.purchase.service.PurchaseQuotedService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,24 +20,23 @@ import java.util.List; * 采购单报价业务层实现 * * @author Bulbasaur - * @date 2020/11/26 16:13 + * @since 2020/11/26 16:13 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PurchaseQuotedServiceImpl extends ServiceImpl implements PurchaseQuotedService { - - private final PurchaseQuotedMapper purchaseQuotedMapper; - private final PurchaseQuotedItemService purchaseQuotedItemService; - + @Autowired + private PurchaseQuotedItemService purchaseQuotedItemService; @Override + @Transactional(rollbackFor = Exception.class) public PurchaseQuotedVO addPurchaseQuoted(PurchaseQuotedVO purchaseQuotedVO) { + + PurchaseQuoted purchaseQuoted = new PurchaseQuoted(); BeanUtil.copyProperties(purchaseQuotedVO, purchaseQuoted); //添加报价单 this.save(purchaseQuoted); //添加采购单子内容 - purchaseQuotedItemService.addPurchaseQuotedItem(purchaseQuotedVO.getId(), purchaseQuotedVO.getPurchaseQuotedItems()); + purchaseQuotedItemService.addPurchaseQuotedItem(purchaseQuoted.getId(), purchaseQuotedVO.getPurchaseQuotedItems()); return purchaseQuotedVO; } @@ -46,6 +44,7 @@ public class PurchaseQuotedServiceImpl extends ServiceImpl getByPurchaseOrderId(String purchaseOrderId) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(PurchaseQuoted::getPurchaseOrderId, purchaseOrderId); + lambdaQueryWrapper.orderByDesc(PurchaseQuoted::getCreateTime); return this.list(lambdaQueryWrapper); } @@ -53,7 +52,8 @@ public class PurchaseQuotedServiceImpl extends ServiceImpl promotionMap; + @Field(type = FieldType.Text) + @ApiModelProperty("商品促销活动集合JSON,key 为 促销活动类型,value 为 促销活动实体信息 ") + private String promotionMapJson; + public EsGoodsIndex(GoodsSku sku) { + if (sku != null) { + this.id = sku.getId(); + this.goodsId = sku.getGoodsId(); + this.goodsName = sku.getGoodsName(); + this.price = sku.getPrice(); + this.storeName = sku.getStoreName(); + this.storeId = sku.getStoreId(); + this.thumbnail = sku.getThumbnail(); + this.categoryPath = sku.getCategoryPath(); + this.goodsVideo = sku.getGoodsVideo(); + this.mobileIntro = sku.getMobileIntro(); + this.buyCount = sku.getBuyCount() != null ? sku.getBuyCount() : 0; + this.commentNum = sku.getCommentNum(); + this.small = sku.getSmall(); + this.brandId = sku.getBrandId(); + this.sn = sku.getSn(); + this.storeCategoryPath = sku.getStoreCategoryPath(); + this.sellingPoint = sku.getSellingPoint(); + this.selfOperated = sku.getSelfOperated(); + this.salesModel = sku.getSalesModel(); + this.marketEnable = sku.getMarketEnable(); + this.authFlag = sku.getAuthFlag(); + this.intro = sku.getIntro(); + this.grade = sku.getGrade(); + this.recommend = sku.getRecommend(); + this.goodsType = sku.getGoodsType(); + this.releaseTime = new Date().getTime(); + } + } + + /** + * 参数索引增加 + * + * @param sku 商品sku信息 + * @param goodsParamDTOS 商品参数信息 + */ + public EsGoodsIndex(GoodsSku sku, List goodsParamDTOS) { + this(sku); + //如果参数不为空 + if (goodsParamDTOS != null && !goodsParamDTOS.isEmpty()) { + //接受不了参数索引 + List attributes = new ArrayList<>(); + //循环参数分组 + goodsParamDTOS.forEach(goodsParamGroup -> { + //如果参数有配置,则增加索引 + if (goodsParamGroup.getGoodsParamsItemDTOList() != null && !goodsParamGroup.getGoodsParamsItemDTOList().isEmpty()) { + //循环分组的内容 + goodsParamGroup.getGoodsParamsItemDTOList().forEach(goodsParam -> { + //如果字段需要索引,则增加索引字段 + if (goodsParam.getIsIndex() != null && goodsParam.getIsIndex() == 1) { + EsGoodsAttribute attribute = new EsGoodsAttribute(); + attribute.setType(1); + attribute.setName(goodsParam.getParamName()); + attribute.setValue(goodsParam.getParamValue()); + attribute.setSort(goodsParam.getSort()); + attributes.add(attribute); + } + } + ); + } + + }); + this.attrList = attributes; + } + } + + public EsGoodsIndex(GoodsSku sku, Date createDate) { + this(sku); + this.releaseTime = createDate.getTime(); + } + public void setGoodsSku(GoodsSku sku) { if (sku != null) { this.id = sku.getId(); @@ -265,54 +377,18 @@ public class EsGoodsIndex implements Serializable { this.selfOperated = sku.getSelfOperated(); this.salesModel = sku.getSalesModel(); this.marketEnable = sku.getMarketEnable(); - this.isAuth = sku.getIsAuth(); + this.authFlag = sku.getAuthFlag(); this.intro = sku.getIntro(); this.grade = sku.getGrade(); - this.releaseTime = new Date(); + this.releaseTime = new Date().getTime(); } } - public EsGoodsIndex(GoodsSku sku) { - if (sku != null) { - this.id = sku.getId(); - this.goodsId = sku.getGoodsId(); - this.goodsName = sku.getGoodsName(); - this.price = sku.getPrice(); - this.storeName = sku.getStoreName(); - this.storeId = sku.getStoreId(); - this.thumbnail = sku.getThumbnail(); - this.categoryPath = sku.getCategoryPath(); - this.goodsVideo = sku.getGoodsVideo(); - this.mobileIntro = sku.getMobileIntro(); - this.buyCount = sku.getBuyCount(); - this.commentNum = sku.getCommentNum(); - this.small = sku.getSmall(); - this.brandId = sku.getBrandId(); - this.sn = sku.getSn(); - this.storeCategoryPath = sku.getStoreCategoryPath(); - this.sellingPoint = sku.getSellingPoint(); - this.selfOperated = sku.getSelfOperated(); - this.salesModel = sku.getSalesModel(); - this.marketEnable = sku.getMarketEnable(); - this.isAuth = sku.getIsAuth(); - this.intro = sku.getIntro(); - this.grade = sku.getGrade(); - this.releaseTime = new Date(); - if (StringUtils.isNotEmpty(sku.getSpecs())) { - List attributes = new ArrayList<>(); - JSONObject jsonObject = JSONUtil.parseObj(sku.getSpecs()); - for (Map.Entry entry : jsonObject.entrySet()) { - if (!entry.getKey().equals("images")) { - EsGoodsAttribute attribute = new EsGoodsAttribute(); - attribute.setType(0); - attribute.setName(entry.getKey()); - attribute.setValue(entry.getValue().toString()); - attributes.add(attribute); - } - } - this.attrList = attributes; - } - } + public Map getOriginPromotionMap() { + return JSONUtil.parseObj(this.promotionMapJson); + } + public Map getPromotionMap() { + return PromotionTools.filterInvalidPromotionsMap(JSONUtil.parseObj(this.promotionMapJson)); } } diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsRelatedInfo.java b/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsRelatedInfo.java index d45a8be1..a6b56e60 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsRelatedInfo.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsRelatedInfo.java @@ -10,7 +10,7 @@ import java.util.List; * 搜索相关商品品牌名称,分类名称及属性 * * @author paulG - * @date 2020/10/20 + * @since 2020/10/20 **/ @Data public class EsGoodsRelatedInfo { diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java b/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java new file mode 100644 index 00000000..a012fc33 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java @@ -0,0 +1,52 @@ +package cn.lili.modules.search.entity.dos; + +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * HotWordsHistory + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:39 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("li_hot_words_history") +public class HotWordsHistory extends BaseIdEntity implements Comparable, Serializable { + + /** + * 词 + */ + private String keywords; + + /** + * 分数 + */ + private Integer score; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + public HotWordsHistory(String keywords, Integer score) { + this.keywords = keywords; + this.score = score; + } + + @Override + public int compareTo(HotWordsHistory hotWordsHistory) { + return hotWordsHistory.getScore() - this.score; + } +} diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoods.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoods.java index e2c4da78..a1df7a71 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoods.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoods.java @@ -6,7 +6,7 @@ import lombok.Data; * 商品搜索结果实体 * * @author paulG - * @date 2020/10/16 + * @since 2020/10/16 **/ @Data public class EsGoods { diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoodsSearchDTO.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoodsSearchDTO.java index 7451615f..1eeb7710 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoodsSearchDTO.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/EsGoodsSearchDTO.java @@ -1,5 +1,7 @@ package cn.lili.modules.search.entity.dto; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.utils.RegularUtil; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,7 +11,7 @@ import java.util.Map; /** * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 **/ @Data public class EsGoodsSearchDTO { @@ -23,6 +25,9 @@ public class EsGoodsSearchDTO { @ApiModelProperty(value = "品牌,可以多选 品牌Id@品牌Id@品牌Id") private String brandId; + @ApiModelProperty("是否为推荐商品") + private Boolean recommend; + @ApiModelProperty(value = "价格", example = "10_30") private String price; @@ -41,4 +46,41 @@ public class EsGoodsSearchDTO { @ApiModelProperty(hidden = true) private Map> notShowCol = new HashMap<>(); + @ApiModelProperty("当前商品skuId,根据当前浏览的商品信息来给用户推荐可能喜欢的商品") + private String currentGoodsId; + + /** + * @see cn.lili.common.enums.PromotionTypeEnum + */ + @ApiModelProperty("促销活动类型") + private String promotionType; + + @ApiModelProperty(value = "促销活动id") + private String promotionsId; + + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型") + private String goodsType; + + @ApiModelProperty("销售模式") + private String salesModel; + + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "除了当前商品类型之外") + private String neGoodsType; + + @ApiModelProperty("除了销售模式当前销售模式之外") + private String neSalesModel; + + //过滤搜索关键字 + public String getKeyword() { + if (CharSequenceUtil.isNotEmpty(keyword)) { + RegularUtil.replace(this.keyword); + } + return keyword; + } } diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsDTO.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsDTO.java new file mode 100644 index 00000000..b05f330e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsDTO.java @@ -0,0 +1,26 @@ +package cn.lili.modules.search.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.*; + +/** + * 搜索热词 + * + * @author Chopper + * @version v1.0 + * 2021-07-26 15:46 + */ +@Data +public class HotWordsDTO { + + @NotBlank(message = "搜索热词不能为空") + @Size(max = 20, min = 1, message = "搜索热词长度限制在1-20") + private String keywords; + + @NotNull(message = "分数不能为空") + @Max(value = 9999999999L,message = "分数不能大于9999999999") + @Min(value = -9999999999L,message = "分数不能小于9999999999") + private Integer point; +} + diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java new file mode 100644 index 00000000..61cd07c7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java @@ -0,0 +1,83 @@ +package cn.lili.modules.search.entity.dto; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.utils.StringUtils; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.beans.BeanUtils; + +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; + +/** + * 商品查询条件 + * + * @author pikachu + * @since 2020-02-24 19:27:20 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class HotWordsSearchParams extends PageVO { + + private static final long serialVersionUID = 2544015852728566887L; + + @NotNull(message = "搜索热词不能为空") + @ApiModelProperty(value = "热词") + private String keywords; + + @ApiModelProperty(value = "快捷搜索", allowableValues = "TODAY, YESTERDAY, LAST_SEVEN, LAST_THIRTY") + private String searchType; + + @ApiModelProperty(value = "类型:年(YEAR)、月(MONTH)") + private String timeType; + + @ApiModelProperty(value = "年份") + private Integer year; + + @ApiModelProperty(value = "月份") + private Integer month; + + + //临时参数 不作为前端传递 + private Date startTIme; + + private Date endTime; + + //搜索热词数量 + private Integer top = 50; + + public QueryWrapper queryWrapper() { + //组织查询时间 + QueryWrapper queryWrapper = new QueryWrapper<>(); + StatisticsQueryParam statisticsQueryParam = new StatisticsQueryParam(); + BeanUtils.copyProperties(this, statisticsQueryParam); + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + + //获取当前时间 + Calendar calendar = Calendar.getInstance(); + + + calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0); + calendar.set(Calendar.MILLISECOND, 0); + + if (StringUtils.isNotEmpty(keywords)) { + queryWrapper.like("keywords", keywords); + } + queryWrapper.between("create_time", dates[0], dates[1]); + + startTIme = dates[0]; + endTime = dates[1]; + + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/ParamOptions.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/ParamOptions.java index 141d1e54..d23f1944 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dto/ParamOptions.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/ParamOptions.java @@ -8,7 +8,7 @@ import java.util.List; * 参数属性选择器 * * @author paulG - * @date 2020/10/20 + * @since 2020/10/20 **/ @Data public class ParamOptions { diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/SelectorOptions.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/SelectorOptions.java index 1264c9a7..e701b30f 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dto/SelectorOptions.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/SelectorOptions.java @@ -6,7 +6,7 @@ import java.util.List; /** * @author paulG - * @date 2020/10/20 + * @since 2020/10/20 **/ @Data public class SelectorOptions { diff --git a/framework/src/main/java/cn/lili/modules/search/entity/enums/HotWordsRedisKeyEnum.java b/framework/src/main/java/cn/lili/modules/search/entity/enums/HotWordsRedisKeyEnum.java deleted file mode 100644 index c9ba5a38..00000000 --- a/framework/src/main/java/cn/lili/modules/search/entity/enums/HotWordsRedisKeyEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.lili.modules.search.entity.enums; - -/** - * @author paulG - * @date 2021/1/20 - **/ -public enum HotWordsRedisKeyEnum { - - SEARCH_HOT_WORD("搜索热词"); - - - private final String description; - - HotWordsRedisKeyEnum(String description) { - this.description = description; - } - - public String description() { - return description; - } -} diff --git a/framework/src/main/java/cn/lili/modules/search/entity/vo/CustomWordsVO.java b/framework/src/main/java/cn/lili/modules/search/entity/vo/CustomWordsVO.java index 51899c0a..75258eba 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/vo/CustomWordsVO.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/vo/CustomWordsVO.java @@ -3,15 +3,21 @@ package cn.lili.modules.search.entity.vo; import cn.lili.modules.search.entity.dos.CustomWords; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; /** * @author paulG - * @date 2020/12/7 + * @since 2020/12/7 **/ @EqualsAndHashCode(callSuper = true) @Data +@NoArgsConstructor public class CustomWordsVO extends CustomWords { private static final long serialVersionUID = 143299060233417009L; + public CustomWordsVO(String name) { + this.setName(name); + this.setDisabled(1); + } } diff --git a/framework/src/main/java/cn/lili/modules/search/entity/vo/HotWordsHistoryVO.java b/framework/src/main/java/cn/lili/modules/search/entity/vo/HotWordsHistoryVO.java new file mode 100644 index 00000000..cbbdc0f9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/entity/vo/HotWordsHistoryVO.java @@ -0,0 +1,33 @@ +package cn.lili.modules.search.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Date; + +/** + * 在线会员 + * + * @author Chopper + * @since 2021-02-21 09:59 + */ +@Data +public class HotWordsHistoryVO { + + /** + * 时间 + */ + private Date createTime; + + /** + * 词 + */ + private String keywords; + + /** + * 分数 + */ + private Integer score; + +} diff --git a/framework/src/main/java/cn/lili/modules/search/mapper/CustomWordsMapper.java b/framework/src/main/java/cn/lili/modules/search/mapper/CustomWordsMapper.java index 10c04a76..6f3d99ec 100644 --- a/framework/src/main/java/cn/lili/modules/search/mapper/CustomWordsMapper.java +++ b/framework/src/main/java/cn/lili/modules/search/mapper/CustomWordsMapper.java @@ -1,13 +1,14 @@ package cn.lili.modules.search.mapper; import cn.lili.modules.search.entity.dos.CustomWords; +import cn.lili.mybatis.mybatisplus.external.SpiceBaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 自定义分词数据处理层 * * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 **/ -public interface CustomWordsMapper extends BaseMapper { +public interface CustomWordsMapper extends BaseMapper, SpiceBaseMapper { } diff --git a/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java b/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java new file mode 100644 index 00000000..97a1d90c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java @@ -0,0 +1,32 @@ +package cn.lili.modules.search.mapper; + +import cn.lili.modules.search.entity.dos.CustomWords; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.vo.HotWordsHistoryVO; +import cn.lili.modules.statistics.entity.vo.OrderStatisticsDataVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 搜索热词历史记录数据处理层 + * + * @author paulG + * @since 2020/10/15 + **/ +public interface HotWordsHistoryMapper extends BaseMapper { + + /** + * 获取订单统计数据 + * + * @param queryWrapper 查询条件 + * @return 订单统计列表 + */ + @Select("SELECT sum(score) as score,keywords FROM li_hot_words_history " +" ${ew.customSqlSegment}") + List statistics(@Param(Constants.WRAPPER) Wrapper queryWrapper); + +} diff --git a/framework/src/main/java/cn/lili/modules/search/repository/EsGoodsIndexRepository.java b/framework/src/main/java/cn/lili/modules/search/repository/EsGoodsIndexRepository.java index 3c5e9cf7..95920fe2 100644 --- a/framework/src/main/java/cn/lili/modules/search/repository/EsGoodsIndexRepository.java +++ b/framework/src/main/java/cn/lili/modules/search/repository/EsGoodsIndexRepository.java @@ -4,8 +4,10 @@ import cn.lili.modules.search.entity.dos.EsGoodsIndex; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; /** + * 商品索引 + * * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 **/ public interface EsGoodsIndexRepository extends ElasticsearchRepository { diff --git a/framework/src/main/java/cn/lili/modules/search/service/CustomWordsService.java b/framework/src/main/java/cn/lili/modules/search/service/CustomWordsService.java index 6ca9f654..90d775bc 100644 --- a/framework/src/main/java/cn/lili/modules/search/service/CustomWordsService.java +++ b/framework/src/main/java/cn/lili/modules/search/service/CustomWordsService.java @@ -6,11 +6,13 @@ import cn.lili.modules.search.entity.vo.CustomWordsVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * 自定义分词业务层 * * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 **/ public interface CustomWordsService extends IService { @@ -52,6 +54,22 @@ public interface CustomWordsService extends IService { */ boolean deleteCustomWords(String id); + /** + * 根据名字批量删除 + * + * @param names 名称列表 + * @return 是否删除成功 + */ + boolean deleteBathByName(List names); + + /** + * 批量插入自定义分词 + * + * @param customWordsList 自定义分词列表 + * @return 受影响行数 + */ + long insertBatchCustomWords(List customWordsList); + /** * 分页查询自定义分词 * diff --git a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java index 9ac0ab64..199e7e79 100644 --- a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java +++ b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsIndexService.java @@ -1,10 +1,12 @@ package cn.lili.modules.search.service; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; +import cn.lili.modules.promotion.entity.dos.BasePromotions; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.dto.BasePromotion; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; import cn.lili.modules.search.entity.dos.EsGoodsIndex; +import org.elasticsearch.action.update.UpdateRequest; import java.util.List; import java.util.Map; @@ -13,10 +15,28 @@ import java.util.Map; * 商品索引业务层 * * @author paulG - * @date 2020/10/14 + * @since 2020/10/14 **/ public interface EsGoodsIndexService { + /** + * 全局索引数据初始化 + */ + void init(); + + /** + * 获取es生成索引进度 + * + * @return + */ + Map getProgress(); + + + /** + * 全局索引初始化 + */ + void initIndex(); + /** * 添加商品索引 * @@ -24,6 +44,13 @@ public interface EsGoodsIndexService { */ void addIndex(EsGoodsIndex goods); + /** + * 添加商品索引 + * + * @param goods 商品索引信息 + */ + void addIndex(List goods); + /** * 更新商品索引 * @@ -32,29 +59,34 @@ public interface EsGoodsIndexService { void updateIndex(EsGoodsIndex goods); /** - * 更新商品索引的购买数量 + * 更新商品索引的的部分属性(只填写更新的字段,不需要更新的字段不要填写) * - * @param id 商品索引id - * @param buyCount 更新后的购买数量 + * @param id 商品索引id + * @param goods 更新后的购买数量 */ - void updateIndexBuyNum(String id, Integer buyCount); + void updateIndex(String id, EsGoodsIndex goods); /** - * 更新商品索引的评论相关数据 + * 更新商品索引的的部分属性 * - * @param id 商品索引ID - * @param commentNum 评论数量 - * @param highPraiseNum 好评数量 - * @param grade 好评率 + * @param queryFields 查询字段 + * @param updateFields 更新字段 */ - void updateIndexCommentNum(String id, Integer commentNum, Integer highPraiseNum, Double grade); + void updateIndex(Map queryFields, Map updateFields); + + /** + * 批量商品索引的的属性(ID 必填, 其他字段只填写更新的字段,不需要更新的字段不要填写。) + * + * @param goodsIndices 商品索引列表 + */ + void updateBulkIndex(List goodsIndices); /** * 删除索引 * - * @param goods 商品索引信息 + * @param queryFields 查询条件 (key 为字段,value为字段值) */ - void deleteIndex(EsGoodsIndex goods); + void deleteIndex(Map queryFields); /** * 删除索引 @@ -63,12 +95,20 @@ public interface EsGoodsIndexService { */ void deleteIndexById(String id); + /** + * 删除索引 + * + * @param ids 商品索引id集合 + */ + void deleteIndexByIds(List ids); + /** * 初始化商品索引 * * @param goodsIndexList 商品索引列表 + * @param regeneratorIndex 是否重新生成索引 */ - void initIndex(List goodsIndexList); + void initIndex(List goodsIndexList, boolean regeneratorIndex); /** * 更新商品索引的促销信息 @@ -76,9 +116,17 @@ public interface EsGoodsIndexService { * @param id id(skuId) * @param promotion 促销信息 * @param key 促销信息的key - * @param price 促销价格 */ - void updateEsGoodsIndex(String id, BasePromotion promotion, String key, Double price); + UpdateRequest updateEsGoodsIndexPromotions(String id, BasePromotions promotion, String key); + + /** + * 更新商品索引的促销信息 + * + * @param ids id(skuId) + * @param promotion 促销信息 + * @param key 促销信息的key + */ + void updateEsGoodsIndexPromotions(List ids, BasePromotions promotion, String key); /** * 根据列表更新商品索引的促销信息 @@ -87,7 +135,7 @@ public interface EsGoodsIndexService { * @param promotion 促销信息 * @param key 促销信息的key */ - void updateEsGoodsIndexByList(List promotionGoodsList, BasePromotion promotion, String key); + void updateEsGoodsIndexByList(List promotionGoodsList, BasePromotions promotion, String key); /** * 更新全部商品索引的促销信息 @@ -95,15 +143,23 @@ public interface EsGoodsIndexService { * @param promotion 促销信息 * @param key 促销信息的key */ - void updateEsGoodsIndexAllByList(BasePromotion promotion, String key); + void updateEsGoodsIndexAllByList(BasePromotions promotion, String key); /** - * 删除指定商品的促销信息 + * 删除索引中指定的促销活动id的促销活动 * - * @param skuIds skuId列表 - * @param promotionType 促销类型 + * @param skuIds 商品skuId + * @param promotionsKey 促销活动Key */ - void deleteEsGoodsPromotionIndexByList(List skuIds, PromotionTypeEnum promotionType); + void deleteEsGoodsPromotionByPromotionKey(List skuIds, String promotionsKey); + + + /** + * 删除索引中指定的促销活动id的促销活动 + * + * @param promotionsKey 促销活动Key + */ + void deleteEsGoodsPromotionByPromotionKey(String promotionsKey); /** * 清除所以商品索引的无效促销活动 @@ -136,10 +192,11 @@ public interface EsGoodsIndexService { List getPromotionIdByPromotionType(String id, PromotionTypeEnum promotionTypeEnum); /** - * 重置当前商品索引 + * 获取重置的商品索引 * - * @param goodsSku 商品sku信息 + * @param goodsSku 商品sku信息 + * @param goodsParamDTOS 商品参数 * @return 商品索引 */ - EsGoodsIndex resetEsGoodsIndex(GoodsSku goodsSku); + EsGoodsIndex getResetEsGoodsIndex(GoodsSku goodsSku, List goodsParamDTOS); } diff --git a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java index 79cbdf70..61930be0 100644 --- a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java +++ b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java @@ -4,14 +4,16 @@ import cn.lili.common.vo.PageVO; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; -import org.springframework.data.domain.Page; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.data.elasticsearch.core.SearchPage; import java.util.List; /** * ES商品搜索业务层 + * * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 **/ public interface EsGoodsSearchService { @@ -22,25 +24,39 @@ public interface EsGoodsSearchService { * @param pageVo 分页参数 * @return 搜索结果 */ - Page searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo); + SearchPage searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo); /** - * 获取热门关键词 + * 商品搜索 * - * @param start 查询范围开始位置 - * @param end 查询范围结束位置 - * @return + * @param searchDTO 搜索参数 + * @param pageVo 分页参数 + * @return 搜索结果 */ - List getHotWords(Integer start, Integer end); + Page searchGoodsByPage(EsGoodsSearchDTO searchDTO, PageVO pageVo); /** * 获取筛选器 * * @param goodsSearch 搜索条件 * @param pageVo 分页参数 - * @return Map + * @return ES商品关联 */ EsGoodsRelatedInfo getSelector(EsGoodsSearchDTO goodsSearch, PageVO pageVo); - List getEsGoodsBySkuIds(List skuIds); + /** + * 根据SkuID列表获取ES商品 + * + * @param skuIds SkuId列表 + * @return ES商品列表 + */ + List getEsGoodsBySkuIds(List skuIds, PageVO pageVo); + + /** + * 根据id获取商品索引 + * + * @param id 商品skuId + * @return 商品索引 + */ + EsGoodsIndex getEsGoodsById(String id); } diff --git a/framework/src/main/java/cn/lili/modules/search/service/HotWordsHistoryService.java b/framework/src/main/java/cn/lili/modules/search/service/HotWordsHistoryService.java new file mode 100644 index 00000000..d357b643 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/service/HotWordsHistoryService.java @@ -0,0 +1,41 @@ +package cn.lili.modules.search.service; + +import cn.lili.modules.search.entity.dos.CustomWords; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; +import cn.lili.modules.search.entity.dto.HotWordsSearchParams; +import cn.lili.modules.search.entity.vo.HotWordsHistoryVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.apache.poi.ss.formula.functions.T; + +import java.util.Date; +import java.util.List; + +/** + * HotWordsService + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:35 + */ +public interface HotWordsHistoryService extends IService { + + /** + * 热词统计 + * + * @param hotWordsSearchParams + * @return + */ + List statistics(HotWordsSearchParams hotWordsSearchParams); + + /** + * 根据时间查询 + * + * @param queryTime 查询时间 + * @return + */ + List queryByDay(Date queryTime); +} diff --git a/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java b/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java new file mode 100644 index 00000000..a13c9e7e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java @@ -0,0 +1,47 @@ +package cn.lili.modules.search.service; + +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; + +import java.util.List; + +/** + * HotWordsService + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:35 + */ +public interface HotWordsService { + + /** + * 获取热门关键词 + * + * @param count 热词数量 + * @return 热词集合 + */ + List getHotWords(Integer count); + + /** + * 获取热门关键词 + * + * @param count 热词数量 + * @return 热词集合 + */ + List getHotWordsVO(Integer count); + + /** + * 设置热门关键词 + * + * @param hotWords 热词分数 + */ + void setHotWords(HotWordsDTO hotWords); + + /** + * 删除热门关键词 + * + * @param keywords 热词 + */ + void deleteHotWords(String keywords); + +} diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java index a4185096..405050fa 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java @@ -1,30 +1,32 @@ package cn.lili.modules.search.serviceimpl; +import cn.lili.common.context.ThreadContextHolder; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; -import cn.lili.config.context.ThreadContextHolder; import cn.lili.modules.search.entity.dos.CustomWords; import cn.lili.modules.search.entity.vo.CustomWordsVO; import cn.lili.modules.search.mapper.CustomWordsMapper; import cn.lili.modules.search.service.CustomWordsService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; import java.util.List; /** * 自定义分词业务层实现 * @author paulG - * @date 2020/10/15 + * @since 2020/10/15 **/ @Service public class CustomWordsServiceImpl extends ServiceImpl implements CustomWordsService { - @Override public String deploy() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(CustomWords::getDisabled, 1); @@ -32,16 +34,15 @@ public class CustomWordsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper().eq(CustomWords::getName, customWordsVO.getName()); + CustomWords one = this.getOne(queryWrapper, false); + if (one != null && one.getDisabled().equals(1)) { + return false; + } else if (one != null && !one.getDisabled().equals(1)) { + this.remove(queryWrapper); } + customWordsVO.setDisabled(1); return this.save(customWordsVO); } @@ -76,13 +83,26 @@ public class CustomWordsServiceImpl extends ServiceImpl names) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(CustomWords::getName, names); + return this.remove(queryWrapper); + } + + @Override + public long insertBatchCustomWords(List customWordsList) { + return this.baseMapper.insertBatchSomeColumn(customWordsList); + } + /** * 修改自定义分词 * @@ -92,7 +112,7 @@ public class CustomWordsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper().eq(CustomWords::getName, words); - int count = count(queryWrapper); + long count = count(queryWrapper); return count > 0; } } diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java index 750b2111..e2c34666 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsIndexServiceImpl.java @@ -1,132 +1,482 @@ package cn.lili.modules.search.serviceimpl; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.extra.pinyin.PinyinUtil; -import cn.lili.common.elasticsearch.BaseElasticsearchService; -import cn.lili.common.elasticsearch.EsSuffix; -import cn.lili.config.elasticsearch.ElasticsearchProperties; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.PromotionTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.RetryException; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.vo.PageVO; +import cn.lili.elasticsearch.BaseElasticsearchService; +import cn.lili.elasticsearch.EsSuffix; +import cn.lili.elasticsearch.config.ElasticsearchProperties; import cn.lili.modules.goods.entity.dos.GoodsSku; -import cn.lili.modules.goods.entity.dos.GoodsWords; -import cn.lili.modules.goods.entity.enums.GoodsWordsTypeEnum; -import cn.lili.modules.goods.service.GoodsWordsService; +import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; +import cn.lili.modules.goods.entity.dto.GoodsSkuDTO; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.service.BrandService; +import cn.lili.modules.goods.service.CategoryService; +import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.goods.service.StoreGoodsLabelService; +import cn.lili.modules.promotion.entity.dos.BasePromotions; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.dto.BasePromotion; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.modules.search.entity.dos.CustomWords; import cn.lili.modules.search.entity.dos.EsGoodsAttribute; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.repository.EsGoodsIndexRepository; +import cn.lili.modules.search.service.CustomWordsService; import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.modules.search.service.EsGoodsSearchService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; -import org.assertj.core.util.IterableUtil; -import org.elasticsearch.action.search.SearchResponse; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.indices.AnalyzeRequest; -import org.elasticsearch.client.indices.AnalyzeResponse; -import org.elasticsearch.search.SearchHit; -import org.mybatis.spring.MyBatisSystemException; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.TermQueryBuilder; +import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; +import org.elasticsearch.index.reindex.UpdateByQueryRequest; +import org.elasticsearch.script.Script; +import org.elasticsearch.script.ScriptType; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.SearchHit; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.SearchPage; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; import java.io.IOException; +import java.lang.reflect.Field; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * 商品索引业务层实现 + * * @author paulG * @since 2020/10/14 **/ @Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements EsGoodsIndexService { - private final ElasticsearchProperties elasticsearchProperties; - private final EsGoodsIndexRepository goodsIndexRepository; - private final EsGoodsSearchService goodsSearchService; - private final GoodsWordsService goodsWordsService; - + private static final String IGNORE_FIELD = "serialVersionUID,promotionMap,id,goodsId"; + private static final String KEY_SUCCESS = "success"; + private static final String KEY_FAIL = "fail"; + private static final String KEY_PROCESSED = "processed"; + private final Map fieldMap = ReflectUtil.getFieldMap(EsGoodsIndex.class); + @Autowired + private ElasticsearchProperties elasticsearchProperties; + @Autowired + private EsGoodsIndexRepository goodsIndexRepository; + @Autowired + private EsGoodsSearchService goodsSearchService; + @Autowired private PromotionService promotionService; @Autowired - public void setPromotionService(PromotionService promotionService) { - this.promotionService = promotionService; + private PromotionGoodsService promotionGoodsService; + + @Autowired + private CustomWordsService customWordsService; + + @Autowired + private GoodsSkuService goodsSkuService; + @Autowired + private BrandService brandService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private StoreGoodsLabelService storeGoodsLabelService; + @Autowired + private Cache cache; + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + /** + * rocketMq配置 + */ + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + @Autowired + private ElasticsearchOperations restTemplate; + + /** + * 去除 重复元素 + * + * @param list + * @return + */ + public static void removeDuplicate(List list) { + HashSet h = new HashSet<>(list); + list.clear(); + list.addAll(h); + } + + @Override + public void init() { + //获取索引任务标识 + Boolean flag = (Boolean) cache.get(CachePrefix.INIT_INDEX_FLAG.getPrefix()); + //为空则默认写入没有任务 + if (flag == null) { + cache.put(CachePrefix.INIT_INDEX_FLAG.getPrefix(), false); + } + //有正在初始化的任务,则提示异常 + if (Boolean.TRUE.equals(flag)) { + throw new ServiceException(ResultCode.INDEX_BUILDING); + } + + //初始化标识 + cache.put(CachePrefix.INIT_INDEX_PROCESS.getPrefix(), null); + cache.put(CachePrefix.INIT_INDEX_FLAG.getPrefix(), true, 10L, TimeUnit.MINUTES); + + + ThreadUtil.execAsync(() -> { + try { + + QueryWrapper skuQueryWrapper = new QueryWrapper<>(); + skuQueryWrapper.eq("gs.auth_flag", GoodsAuthEnum.PASS.name()); + skuQueryWrapper.eq("gs.market_enable", GoodsStatusEnum.UPPER.name()); + skuQueryWrapper.eq("gs.delete_flag", false); + skuQueryWrapper.gt("gs.quantity", 0); + + + Map resultMap = (Map) cache.get(CachePrefix.INIT_INDEX_PROCESS.getPrefix()); + + if (CollUtil.isEmpty(resultMap)) { + QueryWrapper skuCountQueryWrapper = new QueryWrapper<>(); + skuCountQueryWrapper.eq("auth_flag", GoodsAuthEnum.PASS.name()); + skuCountQueryWrapper.eq("market_enable", GoodsStatusEnum.UPPER.name()); + skuCountQueryWrapper.eq("delete_flag", false); + skuCountQueryWrapper.gt("quantity", 0); + resultMap = new HashMap<>(); + resultMap.put(KEY_SUCCESS, 0L); + resultMap.put(KEY_FAIL, 0L); + resultMap.put(KEY_PROCESSED, 0L); + resultMap.put("total", this.goodsSkuService.count(skuCountQueryWrapper)); + cache.put(CachePrefix.INIT_INDEX_PROCESS.getPrefix(), resultMap); + } + + for (int i = 1; ; i++) { + List esGoodsIndices = new ArrayList<>(); + Page skuPage = new Page<>(i, 2000); + IPage skuIPage = goodsSkuService.getGoodsSkuDTOByPage(skuPage, skuQueryWrapper); + + if (skuIPage == null || CollUtil.isEmpty(skuIPage.getRecords())) { + break; + } + List skuValidPromotions = promotionGoodsService.findSkuValidPromotions(skuIPage.getRecords()); + + List brandIds = new ArrayList<>(); + + List categoryPaths = new ArrayList<>(); + + List storeCategoryPaths = new ArrayList<>(); + + for (GoodsSkuDTO goodsSkuDTO : skuIPage.getRecords()) { + if (CharSequenceUtil.isNotEmpty(goodsSkuDTO.getBrandId())) { + brandIds.add(goodsSkuDTO.getBrandId()); + } + if (CharSequenceUtil.isNotEmpty(goodsSkuDTO.getStoreCategoryPath())) { + storeCategoryPaths.addAll(Arrays.asList(goodsSkuDTO.getStoreCategoryPath().split(","))); + } + if (CharSequenceUtil.isNotEmpty((goodsSkuDTO.getCategoryPath()))) { + categoryPaths.addAll(Arrays.asList(goodsSkuDTO.getCategoryPath().split(","))); + } + } + + List> brandList = new ArrayList<>(); + if (CollUtil.isNotEmpty(brandIds)) { + brandList = this.brandService.getBrandsMapsByCategory(CollUtil.distinct(brandIds), "id,name,logo"); + } + List> categoryList = new ArrayList<>(); + if (CollUtil.isNotEmpty(categoryPaths)) { + categoryList = this.categoryService.listMapsByIdsOrderByLevel(CollUtil.distinct(categoryPaths), "id,name"); + } + List> storeCategoryList = new ArrayList<>(); + if (CollUtil.isNotEmpty(storeCategoryPaths)) { + storeCategoryList = this.storeGoodsLabelService.listMapsByStoreIds(CollUtil.distinct(storeCategoryPaths), "id,label_name"); + } + + for (GoodsSkuDTO goodsSku : skuIPage.getRecords()) { + int skuSource = 100; + EsGoodsIndex esGoodsIndex = wrapperEsGoodsIndex(goodsSku, brandList, categoryList, storeCategoryList); + long count = esGoodsIndices.stream().filter(j -> j.getGoodsId().equals(esGoodsIndex.getGoodsId())).count(); + if (count >= 1) { + skuSource -= count; + } + if (skuSource <= 0) { + skuSource = 1; + } + esGoodsIndex.setSkuSource(skuSource); + + + //设置促销信息 + List promotionGoods = skuValidPromotions.stream() + .filter(j -> + (CharSequenceUtil.isNotEmpty(j.getSkuId()) && j.getSkuId().equals(goodsSku.getId())) || + (j.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name()) && j.getStoreId().equals("0")) || + (j.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name()) && j.getStoreId().equals(esGoodsIndex.getStoreId())) || + (j.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && j.getScopeId().contains(goodsSku.getCategoryPath()))) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(promotionGoods)) { + esGoodsIndex.setPromotionMapJson(JSONUtil.toJsonStr(promotionService.wrapperPromotionMapList(promotionGoods))); + } + + esGoodsIndices.add(esGoodsIndex); + //库存锁是在redis做的,所以生成索引,同时更新一下redis中的库存数量 + cache.put(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity()); + } + + //批量插入索引,如果为第一次则删除原索引并创建新索引 + this.initIndex(esGoodsIndices, i == 1); + } + + cache.put(CachePrefix.INIT_INDEX_FLAG.getPrefix(), false); + + //初始化商品索引 + } catch (Exception e) { + log.error("商品索引生成异常:", e); + //如果出现异常,则将进行中的任务标识取消掉,打印日志 + cache.put(CachePrefix.INIT_INDEX_PROCESS.getPrefix(), null); + cache.put(CachePrefix.INIT_INDEX_FLAG.getPrefix(), false); + } + }); + + } + + @Override + public Map getProgress() { + Map map = (Map) cache.get(CachePrefix.INIT_INDEX_PROCESS.getPrefix()); + if (map == null) { + return Collections.emptyMap(); + } + Boolean flag = (Boolean) cache.get(CachePrefix.INIT_INDEX_FLAG.getPrefix()); + map.put("flag", Boolean.TRUE.equals(flag) ? 1L : 0L); + return map; + } + + @Override + public void initIndex() { + //索引名称拼接 + String indexName = this.getIndexName(); + + //索引初始化,因为mapping结构问题: + //但是如果索引已经自动生成过,这里就不会创建索引,设置mapping,所以这里决定在初始化索引的同时,将已有索引删除,重新创建 + + boolean indexExist = this.indexExist(indexName); + log.info("检测 {} 索引结构是否存在:{}", indexName, indexExist); + if (!indexExist) { + + log.info("初始化索引结构 {}", indexName); + //如果索引不存在,则创建索引 + createIndexRequest(indexName); + } + } @Override public void addIndex(EsGoodsIndex goods) { - String indexName = elasticsearchProperties.getIndexPrefix() + "_" + EsSuffix.GOODS_INDEX_NAME; try { - AnalyzeRequest analyzeRequest = AnalyzeRequest.withIndexAnalyzer(indexName, "ik_max_word", goods.getGoodsName()); - AnalyzeResponse analyze = client.indices().analyze(analyzeRequest, RequestOptions.DEFAULT); - List tokens = analyze.getTokens(); - if (goods.getAttrList() != null && !goods.getAttrList().isEmpty()) { - for (EsGoodsAttribute esGoodsAttribute : goods.getAttrList()) { - wordsToDb(esGoodsAttribute.getValue()); - } - } - for (AnalyzeResponse.AnalyzeToken token : tokens) { - wordsToDb(token.getTerm()); - } + //分词器分词 + this.analyzeAndSaveWords(goods); + //生成索引 goodsIndexRepository.save(goods); - } catch (IOException e) { + } catch (Exception e) { log.error("为商品[" + goods.getGoodsName() + "]生成索引异常", e); } } + /** + * 添加商品索引 + * + * @param goods 商品索引信息 + */ + @Override + public void addIndex(List goods) { + try { + for (EsGoodsIndex esGoodsIndex : goods) { + this.analyzeAndSaveWords(esGoodsIndex); + } + goodsIndexRepository.saveAll(goods); + } catch (Exception e) { + log.error("批量为商品生成索引异常", e); + } + } + @Override public void updateIndex(EsGoodsIndex goods) { + this.analyzeAndSaveWords(goods); goodsIndexRepository.save(goods); } /** - * 更新商品索引的购买数量 + * 商品分词 * - * @param id 商品索引id - * @param buyCount 更新后的购买数量 + * @param goods 商品信息 */ - @Override - public void updateIndexBuyNum(String id, Integer buyCount) { - EsGoodsIndex goodsIndex = this.findById(id); - goodsIndex.setBuyCount(buyCount); - this.updateIndex(goodsIndex); + private void analyzeAndSaveWords(EsGoodsIndex goods) { + try { + List keywordsList = new ArrayList<>(); + //根据商品参数分词 + if (goods.getAttrList() != null && !goods.getAttrList().isEmpty()) { + //保存分词 + for (EsGoodsAttribute esGoodsAttribute : goods.getAttrList()) { + if (keywordsList.stream().noneMatch(i -> i.toLowerCase(Locale.ROOT).equals(esGoodsAttribute.getValue().toLowerCase(Locale.ROOT)))) { + keywordsList.add(esGoodsAttribute.getValue()); + } + } + } + //根据商品名称生成分词 + keywordsList.add(goods.getGoodsName().substring(0, Math.min(goods.getGoodsName().length(), 10))); + + //去除重复词 + removeDuplicate(keywordsList); + //入库自定义分词 + List customWordsArrayList = new ArrayList<>(); + keywordsList.forEach(item -> customWordsArrayList.add(new CustomWords(item))); + //这里采用先批量删除再插入的方法,故意这么做。否则需要挨个匹配是否存在,性能消耗更大 + if (CollUtil.isNotEmpty(customWordsArrayList)) { + customWordsService.deleteBathByName(keywordsList); + customWordsService.insertBatchCustomWords(customWordsArrayList); + } + } catch (Exception e) { + log.info(goods + "自定义分词错误", e); + } } /** - * 更新商品索引的评论相关数据 + * 更新商品索引的的部分属性(只填写更新的字段,不需要更新的字段不要填写) * - * @param id 商品索引ID - * @param commentNum 评论数量 - * @param highPraiseNum 好评数量 - * @param grade 好评率 + * @param id 商品索引id + * @param goods 更新后的购买数量 */ @Override - public void updateIndexCommentNum(String id, Integer commentNum, Integer highPraiseNum, Double grade) { + public void updateIndex(String id, EsGoodsIndex goods) { EsGoodsIndex goodsIndex = this.findById(id); - goodsIndex.setCommentNum(commentNum); - goodsIndex.setHighPraiseNum(highPraiseNum); - goodsIndex.setGrade(grade); - this.updateIndex(goodsIndex); + // 通过反射获取全部字段,在根据参数字段是否为空,设置要更新的字段 + for (Map.Entry entry : fieldMap.entrySet()) { + Object fieldValue = ReflectUtil.getFieldValue(goods, entry.getValue()); + if (fieldValue != null && !IGNORE_FIELD.contains(entry.getKey())) { + ReflectUtil.setFieldValue(goodsIndex, entry.getValue(), fieldValue); + } + } + goodsIndexRepository.save(goodsIndex); } + /** + * 更新商品索引的的部分属性(只填写更新的字段,不需要更新的字段不要填写) + * + * @param queryFields 查询字段 + * @param updateFields 更新字段 + */ @Override - public void deleteIndex(EsGoodsIndex goods) { - if (ObjectUtils.isEmpty(goods)) { - // 如果对象为空,则删除全量 - goodsIndexRepository.deleteAll(); + public void updateIndex(Map queryFields, Map updateFields) { + UpdateByQueryRequest update = new UpdateByQueryRequest(getIndexName()); + BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); + for (Map.Entry entry : queryFields.entrySet()) { + TermQueryBuilder termQueryBuilder = new TermQueryBuilder(entry.getKey(), entry.getValue()); + queryBuilder.filter(termQueryBuilder); + } + update.setQuery(queryBuilder); + StringBuilder script = new StringBuilder(); + for (Map.Entry entry : updateFields.entrySet()) { + script.append("ctx._source.").append(entry.getKey()).append("=").append("'").append(entry.getValue()).append("'").append(";"); + } + update.setScript(new Script(script.toString())); + update.setConflicts("proceed"); + try { + BulkByScrollResponse bulkByScrollResponse = client.updateByQuery(update, RequestOptions.DEFAULT); + if (bulkByScrollResponse.getVersionConflicts() > 0) { + throw new RetryException("更新商品索引失败,es内容版本冲突"); + } + } catch (IOException e) { + log.error("更新商品索引异常", e); + } + } + + /** + * 批量商品索引的的属性(ID 必填, 其他字段只填写更新的字段,不需要更新的字段不要填写。) + * + * @param goodsIndices 商品索引列表 + */ + @Override + public void updateBulkIndex(List goodsIndices) { + try { + //索引名称拼接 + String indexName = getIndexName(); + + BulkRequest request = new BulkRequest(); + + for (EsGoodsIndex goodsIndex : goodsIndices) { + UpdateRequest updateRequest = new UpdateRequest(indexName, goodsIndex.getId()); + + JSONObject jsonObject = JSONUtil.parseObj(goodsIndex); + jsonObject.set("releaseTime", goodsIndex.getReleaseTime()); + updateRequest.doc(jsonObject); + request.add(updateRequest); + } + client.bulk(request, RequestOptions.DEFAULT); + } catch (IOException e) { + log.error("批量更新商品索引异常", e); + } + } + + /** + * 删除索引 + * + * @param queryFields 查询条件 + */ + @Override + public void deleteIndex(Map queryFields) { + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + for (Map.Entry entry : queryFields.entrySet()) { + boolQueryBuilder.filter(QueryBuilders.termsQuery(entry.getKey(), entry.getValue().toString())); + } + + DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(); + deleteByQueryRequest.setQuery(boolQueryBuilder); + deleteByQueryRequest.indices(getIndexName()); + deleteByQueryRequest.setConflicts("proceed"); + try { + BulkByScrollResponse bulkByScrollResponse = client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); + if (bulkByScrollResponse.getVersionConflicts() > 0) { + throw new RetryException("删除索引失败,es内容版本冲突"); + } + } catch (IOException e) { + log.error("删除索引异常", e); } - goodsIndexRepository.delete(goods); } /** @@ -139,44 +489,119 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements goodsIndexRepository.deleteById(id); } + /** + * 删除索引 + * + * @param ids 商品索引id集合 + */ @Override - public void initIndex(List goodsIndexList) { - String indexName = elasticsearchProperties.getIndexPrefix() + "_" + EsSuffix.GOODS_INDEX_NAME; - // deleteIndexRequest(indexName); - if (!indexExist(indexName)) { - createIndexRequest(indexName); - } - if (goodsIndexList != null && !goodsIndexList.isEmpty()) { - goodsIndexRepository.deleteAll(); - for (EsGoodsIndex goodsIndex : goodsIndexList) { - addIndex(goodsIndex); - } - } + public void deleteIndexByIds(List ids) { + NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); + queryBuilder.withQuery(QueryBuilders.termsQuery("id", ids.toArray())); + this.restTemplate.delete(queryBuilder.build(), EsGoodsIndex.class); } @Override - public void updateEsGoodsIndex(String id, BasePromotion promotion, String key, Double price) { + public void initIndex(List goodsIndexList, boolean regeneratorIndex) { + if (goodsIndexList == null || goodsIndexList.isEmpty()) { + //初始化标识 + cache.put(CachePrefix.INIT_INDEX_PROCESS.getPrefix(), null); + cache.put(CachePrefix.INIT_INDEX_FLAG.getPrefix(), false); + return; + } + //索引名称拼接 + String indexName = this.getIndexName(); + + //索引初始化,因为mapping结构问题: + //但是如果索引已经自动生成过,这里就不会创建索引,设置mapping,所以这里决定在初始化索引的同时,将已有索引删除,重新创建 + + //如果索引存在,则删除,重新生成。 这里应该有更优解。 + boolean indexExist = this.indexExist(indexName); + if (regeneratorIndex || !indexExist) { + if (indexExist) { + this.deleteIndexRequest(indexName); + } + //如果索引不存在,则创建索引 + this.createIndexRequest(indexName); + } + + Map resultMap = (Map) cache.get(CachePrefix.INIT_INDEX_PROCESS.getPrefix()); + if (!goodsIndexList.isEmpty()) { + for (EsGoodsIndex goodsIndex : goodsIndexList) { + try { + log.info("生成商品索引:{}", goodsIndex); + this.addIndex(goodsIndex); + resultMap.put(KEY_SUCCESS, resultMap.get(KEY_SUCCESS) + 1); + } catch (Exception e) { + log.error("商品{}生成索引错误!", goodsIndex); + resultMap.put(KEY_FAIL, resultMap.get(KEY_FAIL) + 1); + } + resultMap.put(KEY_PROCESSED, resultMap.get(KEY_PROCESSED) + 1); + cache.put(CachePrefix.INIT_INDEX_PROCESS.getPrefix(), resultMap); + } + } + cache.put(CachePrefix.INIT_INDEX_PROCESS.getPrefix(), resultMap); + } + + @Override + public UpdateRequest updateEsGoodsIndexPromotions(String id, BasePromotions promotion, String key) { EsGoodsIndex goodsIndex = findById(id); if (goodsIndex != null) { - if (promotion.getPromotionStatus().equals(PromotionStatusEnum.START.name()) && price != null) { - goodsIndex.setPromotionPrice(price); - } else { - goodsIndex.setPromotionPrice(goodsIndex.getPrice()); + // 批发商品不参与促销(除优惠券和满减) + if (PromotionTools.isPromotionsTypeNeedsToChecked(key) && GoodsSalesModeEnum.WHOLESALE.name().equals(goodsIndex.getSalesModel())) { + return null; } - this.updateGoodsIndexPromotion(goodsIndex, key, promotion); + //更新索引 + return this.updateGoodsIndexPromotion(goodsIndex, key, promotion); } else { - log.error("更新索引商品促销信息失败!skuId 为 【{}】的索引不存在!", id); + log.error("更新索引商品促销信息失败!skuId 为 {} 的索引不存在!", id); + return null; } } + /** + * 更新商品索引的促销信息 + * + * @param ids skuId集合 + * @param promotion 促销信息 + * @param key 促销信息的key + */ @Override - public void updateEsGoodsIndexByList(List promotionGoodsList, BasePromotion promotion, String key) { - if (promotionGoodsList != null) { - for (PromotionGoods promotionGoods : promotionGoodsList) { - updateEsGoodsIndex(promotionGoods.getSkuId(), promotion, key, promotionGoods.getPrice()); + public void updateEsGoodsIndexPromotions(List ids, BasePromotions promotion, String key) { + BulkRequest bulkRequest = new BulkRequest(); + log.info("更新商品索引的促销信息----------"); + log.info("商品ids: {}", ids); + log.info("活动: {}", promotion); + log.info("key: {}", key); + for (String id : ids) { + UpdateRequest updateRequest = this.updateEsGoodsIndexPromotions(id, promotion, key); + if (updateRequest != null) { + bulkRequest.add(updateRequest); } } + this.executeBulkUpdateRequest(bulkRequest); + } + + @Override + public void updateEsGoodsIndexByList(List promotionGoodsList, BasePromotions promotion, String key) { + BulkRequest bulkRequest = new BulkRequest(); + log.info("修改商品活动索引"); + log.info("促销商品信息: {}", promotionGoodsList); + log.info("活动关键字: {}", key); + log.info("活动: {}", promotion); + if (promotionGoodsList != null) { + //循环更新 促销商品索引 + for (PromotionGoods promotionGoods : promotionGoodsList) { + promotion.setStartTime(promotionGoods.getStartTime()); + promotion.setEndTime(promotionGoods.getEndTime()); + UpdateRequest updateRequest = this.updateEsGoodsIndexPromotions(promotionGoods.getSkuId(), promotion, key); + if (updateRequest != null) { + bulkRequest.add(updateRequest); + } + } + } + this.executeBulkUpdateRequest(bulkRequest); } /** @@ -186,61 +611,145 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements * @param key 促销信息的key */ @Override - public void updateEsGoodsIndexAllByList(BasePromotion promotion, String key) { - List goodsIndices; - if (promotion.getStoreId() != null) { + public void updateEsGoodsIndexAllByList(BasePromotions promotion, String key) { + ThreadUtil.execAsync(() -> this.executeUpdateEsGoodsIndexAll(promotion, key)); + + } + + private void executeUpdateEsGoodsIndexAll(BasePromotions promotion, String key) { + for (int i = 0; ; i++) { + List skuIds; + PageVO pageVO = new PageVO(); + pageVO.setPageNumber(i); + pageVO.setPageSize(1000); EsGoodsSearchDTO searchDTO = new EsGoodsSearchDTO(); - searchDTO.setStoreId(promotion.getStoreId()); - Page esGoodsIndices = goodsSearchService.searchGoods(searchDTO, null); - goodsIndices = esGoodsIndices.getContent(); - } else { - Iterable all = goodsIndexRepository.findAll(); - goodsIndices = new ArrayList<>(IterableUtil.toCollection(all)); - } - for (EsGoodsIndex goodsIndex : goodsIndices) { - this.updateGoodsIndexPromotion(goodsIndex, key, promotion); + if (PromotionTools.isPromotionsTypeNeedsToChecked(key)) { + searchDTO.setSalesModel(GoodsSalesModeEnum.RETAIL.name()); + } + //如果storeId不为空,则表示是店铺活动 + if (promotion.getStoreId() != null && !promotion.getStoreId().equals(PromotionTools.PLATFORM_ID)) { + searchDTO.setStoreId(promotion.getStoreId()); + } + + //查询出店铺商品 + SearchPage esGoodsIndices = goodsSearchService.searchGoods(searchDTO, pageVO); + + skuIds = esGoodsIndices.isEmpty() ? new ArrayList<>() : + esGoodsIndices.getContent().stream().map(SearchHit::getId).collect(Collectors.toList()); + if (skuIds.isEmpty()) { + break; + } + this.deleteEsGoodsPromotionByPromotionKey(skuIds, key); + this.updateEsGoodsIndexPromotions(skuIds, promotion, key); } } @Override - public void deleteEsGoodsPromotionIndexByList(List skuIds, PromotionTypeEnum promotionType) { + public void deleteEsGoodsPromotionByPromotionKey(List skuIds, String promotionsKey) { + BulkRequest bulkRequest = new BulkRequest(); + log.info("删除商品活动索引"); + log.info("商品skuIds: {}", skuIds); + log.info("活动Key: {}", promotionsKey); + if (skuIds == null || skuIds.isEmpty()) { + return; + } for (String skuId : skuIds) { EsGoodsIndex goodsIndex = findById(skuId); + //商品索引不为空 if (goodsIndex != null) { - Map promotionMap = goodsIndex.getPromotionMap(); - if (promotionMap != null && !promotionMap.isEmpty()) { - // 如果存在同类型促销活动删除 - List collect = promotionMap.keySet().parallelStream().filter(i -> i.contains(promotionType.name())).collect(Collectors.toList()); - collect.forEach(promotionMap::remove); - goodsIndex.setPromotionMap(promotionMap); - updateIndex(goodsIndex); + UpdateRequest updateRequest = this.removePromotionByPromotionKey(goodsIndex, promotionsKey); + if (updateRequest != null) { + bulkRequest.add(updateRequest); } } else { log.error("更新索引商品促销信息失败!skuId 为 【{}】的索引不存在!", skuId); } } + this.executeBulkUpdateRequest(bulkRequest); } /** - * 清除所以商品索引的无效促销活动 + * 删除索引中指定的促销活动id的促销活动 + * + * @param promotionsKey 促销活动Key + */ + @Override + public void deleteEsGoodsPromotionByPromotionKey(String promotionsKey) { + ThreadUtil.execAsync(() -> { + for (int i = 0; ; i++) { + BulkRequest bulkRequest = new BulkRequest(); + + NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); + nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery()); + nativeSearchQueryBuilder.withPageable(PageRequest.of(i, 1000)); + try { + SearchHits esGoodsIndices = this.restTemplate.search(nativeSearchQueryBuilder.build(), EsGoodsIndex.class); + if (esGoodsIndices.isEmpty() || esGoodsIndices.getSearchHits().isEmpty()) { + break; + } + for (SearchHit searchHit : esGoodsIndices.getSearchHits()) { + EsGoodsIndex goodsIndex = searchHit.getContent(); + UpdateRequest updateRequest = this.removePromotionByPromotionKey(goodsIndex, promotionsKey); + if (updateRequest != null) { + bulkRequest.add(updateRequest); + } + } + this.executeBulkUpdateRequest(bulkRequest); + } catch (Exception e) { + log.error("删除索引中指定的促销活动id的促销活动失败!key: {}", promotionsKey, e); + return; + } + } + }); + } + + /** + * 从索引中删除指定促销活动id的促销活动 + * + * @param goodsIndex 索引 + * @param promotionsKey 促销活动key + */ + private UpdateRequest removePromotionByPromotionKey(EsGoodsIndex goodsIndex, String promotionsKey) { + Map promotionMap = goodsIndex.getOriginPromotionMap(); + if (promotionMap != null && !promotionMap.isEmpty()) { + //如果存在同促销ID的活动删除 + Map filterPromotionMap = promotionMap.entrySet().stream().filter(i -> !i.getKey().equals(promotionsKey)).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + return this.getGoodsIndexPromotionUpdateRequest(goodsIndex.getId(), filterPromotionMap); + } + return null; + } + + /** + * 清除所有商品索引的无效促销活动 */ @Override public void cleanInvalidPromotion() { - Iterable all = goodsIndexRepository.findAll(); - for (EsGoodsIndex goodsIndex : all) { - Map promotionMap = goodsIndex.getPromotionMap(); - if (promotionMap != null && !promotionMap.isEmpty()) { - for (Map.Entry entry : promotionMap.entrySet()) { - BasePromotion promotion = (BasePromotion) entry.getValue(); - if (promotion.getEndTime().getTime() > DateUtil.date().getTime()) { - promotionMap.remove(entry.getKey()); - } + ThreadUtil.execAsync(this::executeCleanInvalidPromotions); + } + + private void executeCleanInvalidPromotions() { + for (int i = 1; ; i++) { + org.springframework.data.domain.Page all = goodsIndexRepository.findAll(PageRequest.of(i, 1000)); + if (all.isEmpty()) { + break; + } + for (EsGoodsIndex goodsIndex : all.toList()) { + Map promotionMap = goodsIndex.getOriginPromotionMap(); + //获取商品索引 + if (promotionMap != null && !promotionMap.isEmpty()) { + //促销不为空则进行清洗 + promotionMap.entrySet().removeIf(j -> { + JSONObject promotionJson = JSONUtil.parseObj(j.getValue()); + BasePromotions promotion = promotionJson.toBean(BasePromotions.class); + return promotion.getEndTime() != null && promotion.getEndTime().getTime() < DateUtil.date().getTime(); + }); } } + goodsIndexRepository.saveAll(all); } - goodsIndexRepository.saveAll(all); } + @Override public EsGoodsIndex findById(String id) { Optional goodsIndex = goodsIndexRepository.findById(id); @@ -260,14 +769,16 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements @Override public Map getPromotionMap(String id) { EsGoodsIndex goodsIndex = this.findById(id); + + //如果商品索引不为空,返回促销信息,否则返回空 if (goodsIndex != null) { - Map promotionMap = goodsIndex.getPromotionMap(); + Map promotionMap = goodsIndex.getOriginPromotionMap(); if (promotionMap == null || promotionMap.isEmpty()) { - return new HashMap<>(); + return new HashMap<>(16); } return promotionMap; } - return null; + return new HashMap<>(); } /** @@ -280,55 +791,108 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements @Override public List getPromotionIdByPromotionType(String id, PromotionTypeEnum promotionTypeEnum) { Map promotionMap = this.getPromotionMap(id); + //如果没有促销信息,则返回新的 if (promotionMap == null || promotionMap.isEmpty()) { return new ArrayList<>(); } + //对促销进行过滤 List keyCollect = promotionMap.keySet().stream().filter(i -> i.contains(promotionTypeEnum.name())).collect(Collectors.toList()); List promotionIds = new ArrayList<>(); + //写入促销id for (String key : keyCollect) { - BasePromotion promotion = (BasePromotion) promotionMap.get(key); + BasePromotions promotion = (BasePromotions) promotionMap.get(key); promotionIds.add(promotion.getId()); } return promotionIds; } /** - * 重置当前商品索引 + * 获取重置的商品索引 * - * @param goodsSku 商品sku信息 + * @param goodsSku 商品sku信息 + * @param goodsParamDTOS 商品参数 * @return 商品索引 */ @Override - public EsGoodsIndex resetEsGoodsIndex(GoodsSku goodsSku) { - EsGoodsIndex index = new EsGoodsIndex(goodsSku); - Map goodsCurrentPromotionMap = promotionService.getGoodsCurrentPromotionMap(index); - index.setPromotionMap(goodsCurrentPromotionMap); - this.addIndex(index); + public EsGoodsIndex getResetEsGoodsIndex(GoodsSku goodsSku, List goodsParamDTOS) { + EsGoodsIndex index = new EsGoodsIndex(goodsSku, goodsParamDTOS); + //获取活动信息 + Map goodsCurrentPromotionMap = promotionService.getGoodsSkuPromotionMap(index.getStoreId(), index.getId()); + //写入促销信息 + index.setPromotionMapJson(JSONUtil.toJsonStr(goodsCurrentPromotionMap)); + + //发送mq消息 + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.RESET_GOODS_INDEX.name(); + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(Collections.singletonList(index)), RocketmqSendCallbackBuilder.commonCallback()); return index; } - private void updateGoodsIndexPromotion(EsGoodsIndex goodsIndex, String key, BasePromotion promotion) { + /** + * 修改商品活动索引 + * + * @param goodsIndex 商品索引 + * @param key 关键字 + * @param promotion 活动 + */ + private UpdateRequest updateGoodsIndexPromotion(EsGoodsIndex goodsIndex, String key, BasePromotions promotion) { Map promotionMap; - if (goodsIndex.getPromotionMap() == null || goodsIndex.getPromotionMap().isEmpty()) { + //数据非空处理,如果空给一个新的信息 + if (goodsIndex.getOriginPromotionMap() == null || goodsIndex.getOriginPromotionMap().isEmpty()) { promotionMap = new HashMap<>(1); } else { - promotionMap = goodsIndex.getPromotionMap(); + promotionMap = goodsIndex.getOriginPromotionMap(); } - - - if (promotion.getPromotionStatus().equals(PromotionStatusEnum.END.name()) || promotion.getPromotionStatus().equals(PromotionStatusEnum.CLOSE.name())) { - if (promotionMap.containsKey(key)) { - promotionMap.remove(key); - } else { - this.removePromotionKey(key, promotionMap, PromotionTypeEnum.SECKILL.name()); - } +// log.info("ES修改商品活动索引-原商品索引信息:{}", goodsIndex); +// log.info("ES修改商品活动索引-原商品索引活动信息:{}", promotionMap); + //如果活动已结束 + if (promotion.getPromotionStatus().equals(PromotionsStatusEnum.END.name()) || promotion.getPromotionStatus().equals(PromotionsStatusEnum.CLOSE.name())) {//如果存在活动 + //删除活动 + promotionMap.remove(key); } else { - // 添加促销活动前,如果是同一时间只可以有一个的活动,但商品索引的促销活动里存在其他(同一时间只可以有一个)的活动,则清除 - this.removePromotionKey(key, promotionMap, PromotionTypeEnum.PINTUAN.name(), PromotionTypeEnum.SECKILL.name(), PromotionTypeEnum.FULL_DISCOUNT.name()); promotionMap.put(key, promotion); } - goodsIndex.setPromotionMap(promotionMap); - updateIndex(goodsIndex); +// log.info("ES修改商品活动索引-过滤后商品索引活动信息:{}", promotionMap); + return this.getGoodsIndexPromotionUpdateRequest(goodsIndex.getId(), promotionMap); + } + + /** + * 以更新部分字段的方式更新索引促销信息 + * + * @param id 索引id + * @param promotionMap 促销信息 + */ + private UpdateRequest getGoodsIndexPromotionUpdateRequest(String id, Map promotionMap) { + UpdateRequest updateRequest = new UpdateRequest(); + updateRequest.index(getIndexName()); + updateRequest.id(id); + updateRequest.retryOnConflict(3); +// updateRequest.version(promotionMap.size()); + Map params = new HashMap<>(); + params.put("promotionMap", JSONUtil.toJsonStr(promotionMap)); + Script script = new Script(ScriptType.INLINE, "painless", "ctx._source.promotionMapJson=params.promotionMap;", params); + updateRequest.script(script); + return updateRequest; + } + + /** + * 执行批量更新商品索引 + * + * @param bulkRequest 批量请求 + */ + private void executeBulkUpdateRequest(BulkRequest bulkRequest) { + if (bulkRequest.requests().isEmpty()) { + return; + } + try { + BulkResponse responses = this.client.bulk(bulkRequest, RequestOptions.DEFAULT); + if (responses.hasFailures()) { + log.info("批量更新商品索引的促销信息中出现部分异常:{}", responses.buildFailureMessage()); + } else { + log.info("批量更新商品索引的促销信息结果:{}", responses.status()); + } + } catch (IOException e) { + log.error("批量更新商品索引的促销信息出现异常!", e); + } } /** @@ -339,9 +903,13 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements * @param needRemoveKeys 需移除的促销活动 */ private void removePromotionKey(String currentKey, Map promotionMap, String... needRemoveKeys) { + //判定是否需要移除 if (CharSequenceUtil.containsAny(currentKey, needRemoveKeys)) { + List removeKeys = new ArrayList<>(); + //促销循环 for (String entry : promotionMap.keySet()) { + //需要移除则进行移除处理 for (String needRemoveKey : needRemoveKeys) { if (entry.contains(needRemoveKey) && currentKey.contains(needRemoveKey)) { removeKeys.add(entry); @@ -349,43 +917,50 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements } } } - promotionMap.keySet().removeAll(removeKeys); + //移除促销信息 + removeKeys.forEach(promotionMap.keySet()::remove); } } - /** - * 将商品关键字入库 - * - * @param words 商品关键字 - */ - private void wordsToDb(String words) { - try { - // 是否有重复 - GoodsWords entity = goodsWordsService.getOne(new LambdaQueryWrapper().eq(GoodsWords::getWords, words)); - if (entity == null) { - GoodsWords goodsWords = new GoodsWords(); - goodsWords.setWords(words); - goodsWords.setWholeSpell(PinyinUtil.getPinyin(words, "")); - goodsWords.setAbbreviate(PinyinUtil.getFirstLetter(words, "")); - goodsWords.setType(GoodsWordsTypeEnum.SYSTEM.name()); - goodsWords.setSort(0); - goodsWordsService.save(goodsWords); + private String getIndexName() { + //索引名称拼接 + return elasticsearchProperties.getIndexPrefix() + "_" + EsSuffix.GOODS_INDEX_NAME; + } + + private EsGoodsIndex wrapperEsGoodsIndex(GoodsSkuDTO goodsSku, List> brandList, List> categoryList, List> storeCategoryList) { + EsGoodsIndex index = new EsGoodsIndex(goodsSku); + + //商品参数索引 + if (CharSequenceUtil.isNotEmpty(goodsSku.getParams())) { + List goodsParamDTOS = JSONUtil.toList(goodsSku.getParams(), GoodsParamsDTO.class); + index = new EsGoodsIndex(goodsSku, goodsParamDTOS); + } + //商品分类索引 + if (CollUtil.isNotEmpty(categoryList) && CharSequenceUtil.isNotEmpty(goodsSku.getCategoryPath())) { + StringBuilder categoryNamePath = new StringBuilder(); + categoryList.stream().filter(o -> goodsSku.getCategoryPath().contains(o.get("id").toString())).forEach(p -> categoryNamePath.append(p.get("name")).append(",")); + if (CharSequenceUtil.isNotEmpty(categoryNamePath)) { + categoryNamePath.deleteCharAt(categoryNamePath.length() - 1); + index.setCategoryNamePath(categoryNamePath.toString()); } - } catch (MyBatisSystemException e) { - log.error(words + "关键字已存在!"); } + //商品品牌索引 + if (CollUtil.isNotEmpty(brandList) && CharSequenceUtil.isNotEmpty(goodsSku.getBrandId())) { + Optional> brandInfo = brandList.stream().filter(p -> p.get("id").equals(goodsSku.getBrandId())).findFirst(); + if (brandInfo.isPresent()) { + index.setBrandName(brandInfo.get().get("name").toString()); + index.setBrandUrl(brandInfo.get().get("logo").toString()); + } + } + //店铺分类索引 + if (CollUtil.isNotEmpty(storeCategoryList) && CharSequenceUtil.isNotEmpty(goodsSku.getStoreCategoryPath())) { + StringBuilder storeCategoryNamePath = new StringBuilder(); + storeCategoryList.stream().filter(o -> goodsSku.getStoreCategoryPath().contains(o.get("id").toString())).forEach(p -> storeCategoryNamePath.append(p.get("label_name").toString()).append(",")); + if (CharSequenceUtil.isNotEmpty(storeCategoryNamePath)) { + storeCategoryNamePath.deleteCharAt(storeCategoryNamePath.length() - 1); + index.setStoreCategoryNamePath(storeCategoryNamePath.toString()); + } + } + return index; } - - public List searchList(String index) { - SearchResponse searchResponse = search(index); - SearchHit[] hits = searchResponse.getHits().getHits(); - List goodsIndices = new ArrayList<>(); - Arrays.stream(hits).forEach(hit -> { - Map sourceAsMap = hit.getSourceAsMap(); - EsGoodsIndex person = BeanUtil.mapToBean(sourceAsMap, EsGoodsIndex.class, false, CopyOptions.create()); - goodsIndices.add(person); - }); - return goodsIndices; - } - } diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java index 4f7da41e..708400e7 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java @@ -1,128 +1,168 @@ package cn.lili.modules.search.serviceimpl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.utils.StringUtils; +import cn.hutool.core.util.ArrayUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.PageVO; -import cn.lili.modules.goods.entity.dos.Brand; -import cn.lili.modules.goods.entity.dos.Category; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; -import cn.lili.modules.goods.service.BrandService; -import cn.lili.modules.goods.service.CategoryService; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.entity.dto.ParamOptions; import cn.lili.modules.search.entity.dto.SelectorOptions; -import cn.lili.modules.search.entity.enums.HotWordsRedisKeyEnum; -import cn.lili.modules.search.repository.EsGoodsIndexRepository; import cn.lili.modules.search.service.EsGoodsSearchService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.search.utils.SqlFilter; +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.lucene.search.join.ScoreMode; +import org.elasticsearch.common.lucene.search.function.FieldValueFactorFunction; import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery; import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MatchQueryBuilder; +import org.elasticsearch.index.query.Operator; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; -import org.elasticsearch.search.aggregations.Aggregation; -import org.elasticsearch.search.aggregations.AggregationBuilder; -import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.aggregations.*; import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested; import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; -import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.*; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.redis.core.DefaultTypedTuple; import org.springframework.stereotype.Service; import java.util.*; +import java.util.stream.Collectors; /** * ES商品搜索业务层实现 + * * @author paulG * @since 2020/10/16 **/ @Slf4j @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { + // 最小分词匹配 + private static final String MINIMUM_SHOULD_MATCH = "20%"; + private static final String ATTR_PATH = "attrList"; private static final String ATTR_VALUE = "attrList.value"; private static final String ATTR_NAME = "attrList.name"; + private static final String ATTR_SORT = "attrList.sort"; + private static final String ATTR_BRAND_ID = "brandId"; + private static final String ATTR_BRAND_NAME = "brandNameAgg"; + private static final String ATTR_BRAND_URL = "brandUrlAgg"; private static final String ATTR_NAME_KEY = "nameList"; private static final String ATTR_VALUE_KEY = "valueList"; - - private final EsGoodsIndexRepository goodsIndexRepository; - //商品分类 - private final CategoryService categoryService; - //品牌 - private final BrandService brandService; - //ES - private final ElasticsearchRestTemplate restTemplate; - //缓存 - private final Cache cache; + /** + * ES + */ + @Autowired + private ElasticsearchOperations restTemplate; + /** + * 缓存 + */ + @Autowired + private Cache cache; @Override - public Page searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo) { - if (CharSequenceUtil.isNotEmpty(searchDTO.getKeyword())) { - cache.incrementScore(HotWordsRedisKeyEnum.SEARCH_HOT_WORD.name(), searchDTO.getKeyword()); - } - NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo, false); - NativeSearchQuery searchQuery = searchQueryBuilder.build(); - log.info("searchGoods DSL:{}", searchQuery.getQuery()); + public SearchPage searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo) { - return goodsIndexRepository.search(searchQuery); + //如果搜索词不为空,且明显不是sql注入,那么就将搜索词加入热搜词 + //PS:线上环境运行很多客户反馈被sql攻击,写在了搜索热词里,这里控制命中关键字就不做热词统计,如果线上比较严格可以调用关键词替换,不过不建议这么做 + if (CharSequenceUtil.isNotBlank(searchDTO.getKeyword()) && Boolean.FALSE.equals(SqlFilter.hit(searchDTO.getKeyword()))) { + cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword()); + } + NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo); + NativeSearchQuery searchQuery = searchQueryBuilder.build(); + searchQuery.setTrackTotalHits(true); + log.debug("searchGoods DSL:{}", searchQuery.getQuery()); + SearchHits search = restTemplate.search(searchQuery, EsGoodsIndex.class); + return SearchHitSupport.searchPageFor(search, searchQuery.getPageable()); } @Override - public List getHotWords(Integer start, Integer end) { - List hotWords = new ArrayList<>(); - Set set = cache.reverseRangeWithScores(HotWordsRedisKeyEnum.SEARCH_HOT_WORD.name(), start, end); - for (DefaultTypedTuple defaultTypedTuple : set) { - hotWords.add(Objects.requireNonNull(defaultTypedTuple.getValue()).toString()); + public Page searchGoodsByPage(EsGoodsSearchDTO searchDTO, PageVO pageVo) { + SearchPage esGoodsIndices = this.searchGoods(searchDTO, pageVo); + Page resultPage = new Page<>(); + if (esGoodsIndices != null && !esGoodsIndices.getContent().isEmpty()) { + List collect = esGoodsIndices.getSearchHits().getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList()); + resultPage.setRecords(collect); + resultPage.setPages(esGoodsIndices.getTotalPages()); + resultPage.setCurrent(esGoodsIndices.getNumber() + 1L); + resultPage.setSize(esGoodsIndices.getSize()); + resultPage.setTotal(esGoodsIndices.getTotalElements()); } - return hotWords; + return resultPage; } @Override public EsGoodsRelatedInfo getSelector(EsGoodsSearchDTO goodsSearch, PageVO pageVo) { - NativeSearchQueryBuilder builder = createSearchQueryBuilder(goodsSearch, null, true); + NativeSearchQueryBuilder builder = createSearchQueryBuilder(goodsSearch, pageVo); //分类 - builder.addAggregation(AggregationBuilders.terms("categoryAgg").field("categoryPath")); + AggregationBuilder categoryNameBuilder = AggregationBuilders.terms("categoryNameAgg").field("categoryNamePath.keyword"); + builder.addAggregation(AggregationBuilders.terms("categoryAgg").field("categoryPath").subAggregation(categoryNameBuilder)); + //品牌 - builder.addAggregation(AggregationBuilders.terms("brandAgg").field("brandId").size(Integer.MAX_VALUE)); + AggregationBuilder brandNameBuilder = AggregationBuilders.terms(ATTR_BRAND_NAME).field("brandName.keyword"); + builder.addAggregation(AggregationBuilders.terms("brandIdNameAgg").field(ATTR_BRAND_ID).size(Integer.MAX_VALUE).subAggregation(brandNameBuilder)); + AggregationBuilder brandUrlBuilder = AggregationBuilders.terms(ATTR_BRAND_URL).field("brandUrl.keyword"); + builder.addAggregation(AggregationBuilders.terms("brandIdUrlAgg").field(ATTR_BRAND_ID).size(Integer.MAX_VALUE).subAggregation(brandUrlBuilder)); //参数 AggregationBuilder valuesBuilder = AggregationBuilders.terms("valueAgg").field(ATTR_VALUE); - AggregationBuilder paramsNameBuilder = AggregationBuilders.terms("nameAgg").field(ATTR_NAME).subAggregation(valuesBuilder); + AggregationBuilder sortBuilder = AggregationBuilders.sum("sortAgg").field(ATTR_SORT); + AggregationBuilder paramsNameBuilder = AggregationBuilders.terms("nameAgg").field(ATTR_NAME).subAggregation(sortBuilder).order(BucketOrder.aggregation("sortAgg", false)).subAggregation(valuesBuilder); builder.addAggregation(AggregationBuilders.nested("attrAgg", ATTR_PATH).subAggregation(paramsNameBuilder)); NativeSearchQuery searchQuery = builder.build(); SearchHits search = restTemplate.search(searchQuery, EsGoodsIndex.class); - log.info("getSelector DSL:{}", searchQuery.getQuery()); + log.debug("getSelector DSL:{}", searchQuery.getQuery()); Map aggregationMap = Objects.requireNonNull(search.getAggregations()).getAsMap(); return convertToEsGoodsRelatedInfo(aggregationMap, goodsSearch); } @Override - public List getEsGoodsBySkuIds(List skuIds) { + public List getEsGoodsBySkuIds(List skuIds, PageVO pageVo) { NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder(); + if (pageVo != null) { + int pageNumber = pageVo.getPageNumber() - 1; + if (pageNumber < 0) { + pageNumber = 0; + } + Pageable pageable = PageRequest.of(pageNumber, pageVo.getPageSize()); + //分页 + searchQueryBuilder.withPageable(pageable); + } NativeSearchQuery build = searchQueryBuilder.build(); build.setIds(skuIds); return restTemplate.multiGet(build, EsGoodsIndex.class, restTemplate.getIndexCoordinatesFor(EsGoodsIndex.class)); } + /** + * 根据id获取商品索引 + * + * @param id 商品skuId + * @return 商品索引 + */ + @Override + public EsGoodsIndex getEsGoodsById(String id) { + return this.restTemplate.get(id, EsGoodsIndex.class); + } + /** * 转换搜索结果为聚合商品展示信息 * @@ -131,53 +171,23 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { */ private EsGoodsRelatedInfo convertToEsGoodsRelatedInfo(Map aggregationMap, EsGoodsSearchDTO goodsSearch) { EsGoodsRelatedInfo esGoodsRelatedInfo = new EsGoodsRelatedInfo(); - // 分类 + //分类 List categoryOptions = new ArrayList<>(); ParsedStringTerms categoryTerms = (ParsedStringTerms) aggregationMap.get("categoryAgg"); List categoryBuckets = categoryTerms.getBuckets(); if (categoryBuckets != null && !categoryBuckets.isEmpty()) { - for (Terms.Bucket categoryBucket : categoryBuckets) { - String categoryPath = categoryBucket.getKey().toString(); - String[] split = categoryPath.split(","); - for (String s : split) { - if (CharSequenceUtil.isNotEmpty(s)) { - Category category = categoryService.getById(s); - if (category != null) { - SelectorOptions so = new SelectorOptions(); - so.setName(category.getName()); - so.setValue(category.getId()); - if (!categoryOptions.contains(so)) { - categoryOptions.add(so); - } - } - } - } - - } + categoryOptions = this.convertCategoryOptions(categoryBuckets); } esGoodsRelatedInfo.setCategories(categoryOptions); //品牌 - ParsedStringTerms brandTerms = (ParsedStringTerms) aggregationMap.get("brandAgg"); - List brandBuckets = brandTerms.getBuckets(); + ParsedStringTerms brandNameTerms = (ParsedStringTerms) aggregationMap.get("brandIdNameAgg"); + ParsedStringTerms brandUrlTerms = (ParsedStringTerms) aggregationMap.get("brandIdUrlAgg"); + List brandBuckets = brandNameTerms.getBuckets(); + List brandUrlBuckets = brandUrlTerms.getBuckets(); List brandOptions = new ArrayList<>(); if (brandBuckets != null && !brandBuckets.isEmpty()) { - for (Terms.Bucket brandBucket : brandBuckets) { - if (CharSequenceUtil.isNotEmpty(goodsSearch.getBrandId())) { - List brandList = Arrays.asList(goodsSearch.getBrandId().split("@")); - if (brandList.contains(brandBucket.getKey().toString())) { - continue; - } - } - Brand brand = brandService.getById(brandBucket.getKey().toString()); - if (brand != null) { - SelectorOptions so = new SelectorOptions(); - so.setName(brand.getName()); - so.setValue(brand.getId()); - so.setUrl(brand.getLogo()); - brandOptions.add(so); - } - } + brandOptions = this.convertBrandOptions(goodsSearch, brandBuckets, brandUrlBuckets); } esGoodsRelatedInfo.setBrands(brandOptions); @@ -185,103 +195,220 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { ParsedNested attrTerms = (ParsedNested) aggregationMap.get("attrAgg"); if (!goodsSearch.getNotShowCol().isEmpty()) { if (goodsSearch.getNotShowCol().containsKey(ATTR_NAME_KEY) && goodsSearch.getNotShowCol().containsKey(ATTR_VALUE_KEY)) { - esGoodsRelatedInfo.setParamOptions(buildGoodsParam(attrTerms, goodsSearch.getNotShowCol().get(ATTR_NAME_KEY), goodsSearch.getNotShowCol().get(ATTR_VALUE_KEY))); + esGoodsRelatedInfo.setParamOptions(buildGoodsParam(attrTerms, goodsSearch.getNotShowCol().get(ATTR_NAME_KEY))); } } else { - esGoodsRelatedInfo.setParamOptions(buildGoodsParam(attrTerms, null, null)); + esGoodsRelatedInfo.setParamOptions(buildGoodsParam(attrTerms, null)); } return esGoodsRelatedInfo; } + /** + * 将品牌聚合结果转换品牌选择项 + * + * @param goodsSearch 查询参数 + * @param brandBuckets 品牌聚合结果桶 + * @param brandUrlBuckets 品牌地址聚合结果桶 + * @return 品牌选择项列表 + */ + private List convertBrandOptions(EsGoodsSearchDTO goodsSearch, List brandBuckets, List brandUrlBuckets) { + List brandOptions = new ArrayList<>(); + for (int i = 0; i < brandBuckets.size(); i++) { + String brandId = brandBuckets.get(i).getKey().toString(); + //当商品品牌id为0时,代表商品没有选择品牌,所以过滤掉品牌选择器 + //当品牌id为空并且 + if (brandId.equals("0") || + (CharSequenceUtil.isNotEmpty(goodsSearch.getBrandId()) + && Arrays.asList(goodsSearch.getBrandId().split("@")).contains(brandId))) { + continue; + } + + String brandName = ""; + if (brandBuckets.get(i).getAggregations() != null && brandBuckets.get(i).getAggregations().get(ATTR_BRAND_NAME) != null) { + ParsedStringTerms aggregation = brandBuckets.get(i).getAggregations().get(ATTR_BRAND_NAME); + brandName = this.getAggregationsBrandOptions(aggregation); + if (StringUtils.isEmpty(brandName)) { + continue; + } + } + + String brandUrl = ""; + if (brandUrlBuckets != null && !brandUrlBuckets.isEmpty() && + brandUrlBuckets.get(i).getAggregations() != null && + brandUrlBuckets.get(i).getAggregations().get(ATTR_BRAND_URL) != null) { + ParsedStringTerms aggregation = brandUrlBuckets.get(i).getAggregations().get(ATTR_BRAND_URL); + brandUrl = this.getAggregationsBrandOptions(aggregation); + if (StringUtils.isEmpty(brandUrl)) { + continue; + } + } + SelectorOptions so = new SelectorOptions(); + so.setName(brandName); + so.setValue(brandId); + so.setUrl(brandUrl); + brandOptions.add(so); + } + return brandOptions; + } + + /** + * 获取品牌聚合结果内的参数 + * + * @param brandAgg 品牌聚合结果 + * @return 品牌聚合结果内的参数 + */ + private String getAggregationsBrandOptions(ParsedStringTerms brandAgg) { + List brandAggBuckets = brandAgg.getBuckets(); + if (brandAggBuckets != null && !brandAggBuckets.isEmpty()) { + return brandAggBuckets.get(0).getKey().toString(); + } + return ""; + } + + + /** + * 将分类聚合结果转换分类选择项 + * + * @param categoryBuckets 分类聚合结果 + * @return 分类选择项集合 + */ + private List convertCategoryOptions(List categoryBuckets) { + List categoryOptions = new ArrayList<>(); + for (Terms.Bucket categoryBucket : categoryBuckets) { + String categoryPath = categoryBucket.getKey().toString(); + ParsedStringTerms categoryNameAgg = categoryBucket.getAggregations().get("categoryNameAgg"); + List categoryNameBuckets = categoryNameAgg.getBuckets(); + + + String categoryNamePath = categoryPath; + if (!categoryNameBuckets.isEmpty()) { + categoryNamePath = categoryNameBuckets.get(0).getKey().toString(); + } + String[] split = ArrayUtil.distinct(categoryPath.split(",")); + String[] nameSplit = categoryNamePath.split(","); + if (split.length == nameSplit.length) { + for (int i = 0; i < split.length; i++) { + SelectorOptions so = new SelectorOptions(); + so.setName(nameSplit[i]); + so.setValue(split[i]); + if (!categoryOptions.contains(so)) { + categoryOptions.add(so); + } + } + } + } + return categoryOptions; + } + /** * 构建商品参数信息 * * @param attrTerms 商品参数搜索结果 * @param nameList 查询的规格名 - * @param valueList 查询的规格项 * @return 商品参数信息 */ - private List buildGoodsParam(ParsedNested attrTerms, List nameList, List valueList) { - List paramOptions = new ArrayList<>(); + private List buildGoodsParam(ParsedNested attrTerms, List nameList) { if (attrTerms != null) { Aggregations attrAggregations = attrTerms.getAggregations(); Map attrMap = attrAggregations.getAsMap(); ParsedStringTerms nameAgg = (ParsedStringTerms) attrMap.get("nameAgg"); if (nameAgg != null) { - List nameBuckets = nameAgg.getBuckets(); - - for (Terms.Bucket bucket : nameBuckets) { - String name = bucket.getKey().toString(); - ParamOptions paramOptions1 = new ParamOptions(); - ParsedStringTerms valueAgg = bucket.getAggregations().get("valueAgg"); - List valueBuckets = valueAgg.getBuckets(); - List valueSelectorList = new ArrayList<>(); - - for (Terms.Bucket valueBucket : valueBuckets) { - String value = valueBucket.getKey().toString(); - - if (CharSequenceUtil.isNotEmpty(value)) { - valueSelectorList.add(value); - } - - } - if (nameList == null || !nameList.contains(name)) { - paramOptions1.setKey(name); - paramOptions1.setValues(valueSelectorList); - paramOptions.add(paramOptions1); - } - } - - + return this.buildGoodsParamOptions(nameAgg, nameList); } } + return new ArrayList<>(); + } + + /** + * 构造商品参数属性 + * + * @param nameAgg 商品参数聚合内容 + * @param nameList 查询的规格名 + * @return 商品参数属性集合 + */ + private List buildGoodsParamOptions(ParsedStringTerms nameAgg, List nameList) { + List paramOptions = new ArrayList<>(); + List nameBuckets = nameAgg.getBuckets(); + + for (Terms.Bucket bucket : nameBuckets) { + String name = bucket.getKey().toString(); + ParamOptions paramOptions1 = new ParamOptions(); + ParsedStringTerms valueAgg = bucket.getAggregations().get("valueAgg"); + List valueBuckets = valueAgg.getBuckets(); + List valueSelectorList = new ArrayList<>(); + + for (Terms.Bucket valueBucket : valueBuckets) { + String value = valueBucket.getKey().toString(); + + if (CharSequenceUtil.isNotEmpty(value)) { + valueSelectorList.add(value); + } + + } + if (nameList == null || !nameList.contains(name)) { + paramOptions1.setKey(name); + paramOptions1.setValues(valueSelectorList); + paramOptions.add(paramOptions1); + } + } return paramOptions; } - /** * 创建es搜索builder * - * @param searchDTO 搜索条件 - * @param pageVo 分页参数 - * @param isAggregation 是否是聚合查询 + * @param searchDTO 搜索条件 + * @param pageVo 分页参数 * @return es搜索builder */ - private NativeSearchQueryBuilder createSearchQueryBuilder(EsGoodsSearchDTO searchDTO, PageVO pageVo, boolean isAggregation) { + private NativeSearchQueryBuilder createSearchQueryBuilder(EsGoodsSearchDTO searchDTO, PageVO pageVo) { NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); if (pageVo != null) { - Pageable pageable = PageRequest.of(pageVo.getPageNumber(), pageVo.getPageSize()); + int pageNumber = pageVo.getPageNumber() - 1; + if (pageNumber < 0) { + pageNumber = 0; + } + Pageable pageable = PageRequest.of(pageNumber, pageVo.getPageSize()); //分页 nativeSearchQueryBuilder.withPageable(pageable); } + //查询参数非空判定 if (searchDTO != null) { + //过滤条件 BoolQueryBuilder filterBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); - this.commonSearch(filterBuilder, queryBuilder, searchDTO, isAggregation); + //对查询条件进行处理 + this.commonSearch(filterBuilder, searchDTO); - // 未上架的商品不显示 + //智能推荐 + this.recommended(filterBuilder, searchDTO); + + //未上架的商品不显示 filterBuilder.must(QueryBuilders.matchQuery("marketEnable", GoodsStatusEnum.UPPER.name())); - // 待审核和审核不通过的商品不显示 - filterBuilder.must(QueryBuilders.matchQuery("isAuth", GoodsAuthEnum.PASS.name())); + //待审核和审核不通过的商品不显示 + filterBuilder.must(QueryBuilders.matchQuery("authFlag", GoodsAuthEnum.PASS.name())); - // 关键字检索 - if (StringUtils.isEmpty(searchDTO.getKeyword())) { - nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery()); + //关键字检索 + if (CharSequenceUtil.isEmpty(searchDTO.getKeyword())) { + List filterFunctionBuilders = this.buildFunctionSearch(); + FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()]; + filterFunctionBuilders.toArray(builders); + FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), builders) + .scoreMode(FunctionScoreQuery.ScoreMode.SUM) + .setMinScore(2); + //聚合搜索则将结果放入过滤条件 + filterBuilder.must(functionScoreQueryBuilder); } else { - this.keywordSearch(filterBuilder, queryBuilder, searchDTO.getKeyword(), isAggregation); + this.keywordSearch(filterBuilder, searchDTO.getKeyword()); } - if (isAggregation) { - nativeSearchQueryBuilder.withQuery(filterBuilder); - } else { - nativeSearchQueryBuilder.withQuery(queryBuilder); - nativeSearchQueryBuilder.withFilter(filterBuilder); - } + //如果是聚合查询 + + nativeSearchQueryBuilder.withQuery(filterBuilder); if (pageVo != null && CharSequenceUtil.isNotEmpty(pageVo.getOrder()) && CharSequenceUtil.isNotEmpty(pageVo.getSort())) { @@ -294,80 +421,202 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { return nativeSearchQueryBuilder; } - private void commonSearch(BoolQueryBuilder filterBuilder, BoolQueryBuilder queryBuilder, EsGoodsSearchDTO searchDTO, boolean isAggregation) { + /** + * 商品推荐 + * + * @param filterBuilder 过滤条件 + * @param searchDTO 搜索条件 + */ + private void recommended(BoolQueryBuilder filterBuilder, EsGoodsSearchDTO searchDTO) { + + String currentGoodsId = searchDTO.getCurrentGoodsId(); + if (CharSequenceUtil.isEmpty(currentGoodsId)) { + return; + } + + //排除当前商品 + filterBuilder.mustNot(QueryBuilders.matchQuery("id", currentGoodsId)); + + //查询当前浏览商品的索引信息 + EsGoodsIndex esGoodsIndex = restTemplate.get(currentGoodsId, EsGoodsIndex.class); + if (esGoodsIndex == null) { + return; + } + //推荐与当前浏览商品相同一个二级分类下的商品 + String categoryPath = esGoodsIndex.getCategoryPath(); + if (CharSequenceUtil.isNotEmpty(categoryPath)) { + //匹配二级分类 + String substring = categoryPath.substring(0, categoryPath.lastIndexOf(",")); + filterBuilder.must(QueryBuilders.wildcardQuery("categoryPath", substring + "*")); + } + + } + + /** + * 查询属性处理 + * + * @param filterBuilder 过滤构造器 + * @param searchDTO 查询参数 + */ + private void commonSearch(BoolQueryBuilder filterBuilder, EsGoodsSearchDTO searchDTO) { + //品牌判定 if (CharSequenceUtil.isNotEmpty(searchDTO.getBrandId())) { String[] brands = searchDTO.getBrandId().split("@"); - filterBuilder.must(QueryBuilders.termsQuery("brandId", brands)); + filterBuilder.must(QueryBuilders.termsQuery(ATTR_BRAND_ID, brands)); } + if (searchDTO.getRecommend() != null) { + filterBuilder.filter(QueryBuilders.termQuery("recommend", searchDTO.getRecommend())); + } + // 商品类型判定 + if (CharSequenceUtil.isNotEmpty(searchDTO.getGoodsType())) { + filterBuilder.filter(QueryBuilders.termQuery("goodsType", searchDTO.getGoodsType())); + } + if (CharSequenceUtil.isNotEmpty(searchDTO.getNeGoodsType())) { + filterBuilder.mustNot(QueryBuilders.termQuery("goodsType", searchDTO.getNeGoodsType())); + } + // 销售类型判定 + if (CharSequenceUtil.isNotEmpty(searchDTO.getSalesModel())) { + filterBuilder.filter(QueryBuilders.termQuery("salesModel", searchDTO.getSalesModel())); + } + if (CharSequenceUtil.isNotEmpty(searchDTO.getNeSalesModel())) { + filterBuilder.mustNot(QueryBuilders.termQuery("salesModel", searchDTO.getNeSalesModel())); + } + //规格项判定 if (searchDTO.getNameIds() != null && !searchDTO.getNameIds().isEmpty()) { filterBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.termsQuery("attrList.nameId", searchDTO.getNameIds()), ScoreMode.None)); } + //分类判定 if (CharSequenceUtil.isNotEmpty(searchDTO.getCategoryId())) { filterBuilder.must(QueryBuilders.wildcardQuery("categoryPath", "*" + searchDTO.getCategoryId() + "*")); } + //店铺分类判定 if (CharSequenceUtil.isNotEmpty(searchDTO.getStoreCatId())) { filterBuilder.must(QueryBuilders.wildcardQuery("storeCategoryPath", "*" + searchDTO.getStoreCatId() + "*")); } + //店铺判定 if (CharSequenceUtil.isNotEmpty(searchDTO.getStoreId())) { filterBuilder.filter(QueryBuilders.termQuery("storeId", searchDTO.getStoreId())); } + //属性判定 if (CharSequenceUtil.isNotEmpty(searchDTO.getProp())) { - String[] props = searchDTO.getProp().split("@"); - List nameList = new ArrayList<>(); - List valueList = new ArrayList<>(); - for (String prop : props) { - String[] propValues = prop.split("_"); - String name = propValues[0]; - String value = propValues[1]; - if (!nameList.contains(name)) { - nameList.add(name); - } - if (!valueList.contains(value)) { - valueList.add(value); - } - if (isAggregation) { - filterBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.termQuery(ATTR_NAME, name), ScoreMode.None)); - filterBuilder.should(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.termsQuery(ATTR_VALUE, value), ScoreMode.None)); - } else { - queryBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.termQuery(ATTR_NAME, name), ScoreMode.None)); - queryBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.wildcardQuery(ATTR_VALUE, "*" + value + "*"), ScoreMode.None)); - } - - } - searchDTO.getNotShowCol().put(ATTR_NAME_KEY, nameList); - searchDTO.getNotShowCol().put(ATTR_VALUE_KEY, valueList); + this.propSearch(filterBuilder, searchDTO); } + // 促销活动判定 + if (CharSequenceUtil.isNotEmpty(searchDTO.getPromotionsId()) && CharSequenceUtil.isNotEmpty(searchDTO.getPromotionType())) { + filterBuilder.must(QueryBuilders.wildcardQuery("promotionMapJson", "*" + searchDTO.getPromotionType() + "-" + searchDTO.getPromotionsId() + "*")); + } + //价格区间判定 if (CharSequenceUtil.isNotEmpty(searchDTO.getPrice())) { String[] prices = searchDTO.getPrice().split("_"); - if(prices.length==0){ + if (prices.length == 0) { return; } - double min = StringUtils.toDouble(prices[0], 0.0); + double min = Convert.toDouble(prices[0], 0.0); double max = Integer.MAX_VALUE; if (prices.length == 2) { - max = StringUtils.toDouble(prices[1], Double.MAX_VALUE); + max = Convert.toDouble(prices[1], Double.MAX_VALUE); + } + if (min > max) { + throw new ServiceException("价格区间错误"); + } + if (min > Double.MAX_VALUE) { + min = Double.MAX_VALUE; + } + if (max > Double.MAX_VALUE) { + max = Double.MAX_VALUE; } filterBuilder.must(QueryBuilders.rangeQuery("price").from(min).to(max).includeLower(true).includeUpper(true)); } } - private void keywordSearch(BoolQueryBuilder filterBuilder, BoolQueryBuilder queryBuilder, String keyword, boolean isAggregation) { - List filterFunctionBuilders = new ArrayList<>(); - filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.wildcardQuery("goodsName", "*" + keyword + "*"), - ScoreFunctionBuilders.weightFactorFunction(10))); - filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.wildcardQuery(ATTR_VALUE, "*" + keyword + "*"), ScoreMode.None), - ScoreFunctionBuilders.weightFactorFunction(8))); + /** + * 商品参数查询处理 + * + * @param filterBuilder 过滤构造器 + * @param searchDTO 查询参数 + */ + private void propSearch(BoolQueryBuilder filterBuilder, EsGoodsSearchDTO searchDTO) { + String[] props = searchDTO.getProp().split("@"); + List nameList = new ArrayList<>(); + List valueList = new ArrayList<>(); + Map> valueMap = new HashMap<>(16); + for (String prop : props) { + String[] propValues = prop.split("_"); + String name = propValues[0]; + String value = propValues[1]; + if (!nameList.contains(name)) { + nameList.add(name); + } + if (!valueList.contains(value)) { + valueList.add(value); + } + //将同一规格名下的规格值分组 + if (!valueMap.containsKey(name)) { + List values = new ArrayList<>(); + values.add(value); + valueMap.put(name, values); + } else { + valueMap.get(name).add(value); + } + } + //遍历所有的规格 + for (Map.Entry> entry : valueMap.entrySet()) { + filterBuilder.must(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.matchQuery(ATTR_NAME, entry.getKey()), ScoreMode.None)); + BoolQueryBuilder shouldBuilder = QueryBuilders.boolQuery(); + for (String s : entry.getValue()) { + shouldBuilder.should(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.matchQuery(ATTR_VALUE, s), ScoreMode.None)); + } + filterBuilder.must(shouldBuilder); + } + searchDTO.getNotShowCol().put(ATTR_NAME_KEY, nameList); + searchDTO.getNotShowCol().put(ATTR_VALUE_KEY, valueList); + } + + /** + * 关键字查询处理 + * + * @param filterBuilder 过滤构造器 + * @param keyword 关键字 + */ + private void keywordSearch(BoolQueryBuilder filterBuilder, String keyword) { + + List filterFunctionBuilders = this.buildFunctionSearch(); + + //分词匹配 + // operator 为 AND 时 需全部分词匹配。为 OR 时 需配置 minimumShouldMatch(最小分词匹配数)不设置默认为1 + MatchQueryBuilder goodsNameMatchQuery = QueryBuilders.matchQuery("goodsName", keyword).operator(Operator.OR).minimumShouldMatch(MINIMUM_SHOULD_MATCH); + FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()]; filterFunctionBuilders.toArray(builders); - FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders) + FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(goodsNameMatchQuery, builders) .scoreMode(FunctionScoreQuery.ScoreMode.SUM) .setMinScore(2); - if (isAggregation) { - filterBuilder.must(functionScoreQueryBuilder); - } else { - queryBuilder.must(functionScoreQueryBuilder); - } + //聚合搜索则将结果放入过滤条件 + filterBuilder.must(functionScoreQueryBuilder); + filterBuilder.should(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("goodsName", keyword).boost(10))); + } + + /** + * 构造关键字查询 + * + * @return 构造查询的集合 + */ + private List buildFunctionSearch() { + List filterFunctionBuilders = new ArrayList<>(); + +// GaussDecayFunctionBuilder skuNoScore = ScoreFunctionBuilders.gaussDecayFunction("skuSource", 100, 10).setWeight(2); +// FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(skuNoScore); +// filterFunctionBuilders.add(skuNoBuilder); + FieldValueFactorFunctionBuilder skuNoScore = ScoreFunctionBuilders.fieldValueFactorFunction("skuSource").modifier(FieldValueFactorFunction.Modifier.LOG1P).setWeight(3); + FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(skuNoScore); + filterFunctionBuilders.add(skuNoBuilder); + + // 修改分数算法为无,数字最大分数越高 +// FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.NONE).setWeight(10); +// FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(buyCountScore); +// filterFunctionBuilders.add(buyCountBuilder); + return filterFunctionBuilders; } } diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java new file mode 100644 index 00000000..c3091ef7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java @@ -0,0 +1,53 @@ +package cn.lili.modules.search.serviceimpl; + +import cn.lili.common.utils.DateUtil; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsSearchParams; +import cn.lili.modules.search.mapper.HotWordsHistoryMapper; +import cn.lili.modules.search.service.HotWordsHistoryService; +import cn.lili.modules.search.service.HotWordsService; +import cn.lili.modules.statistics.entity.enums.SearchTypeEnum; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 历史热词 + * + * @author paulG + * @since 2020/10/15 + **/ +@Service +public class HotWordsHistoryServiceImpl extends ServiceImpl implements HotWordsHistoryService { + + @Autowired + private HotWordsService hotWordsService; + + @Override + public List statistics(HotWordsSearchParams hotWordsSearchParams) { + if (hotWordsSearchParams.getSearchType().equals(SearchTypeEnum.TODAY.name())) { + return hotWordsService.getHotWordsVO(hotWordsSearchParams.getTop()); + } + QueryWrapper queryWrapper = hotWordsSearchParams.queryWrapper(); + + queryWrapper.groupBy("keywords"); + queryWrapper.orderByDesc("score"); + queryWrapper.last("limit " + hotWordsSearchParams.getTop()); + List list = baseMapper.statistics(queryWrapper); + return list; + } + + @Override + public List queryByDay(Date queryTime) { + QueryWrapper queryWrapper = new QueryWrapper(); + + Date[] dates = StatisticsDateUtil.getDateArray(queryTime); + queryWrapper.between("create_time", dates[0], dates[1]); + return list(queryWrapper); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java new file mode 100644 index 00000000..d036f96e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java @@ -0,0 +1,96 @@ +package cn.lili.modules.search.serviceimpl; + +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; +import cn.lili.modules.search.mapper.HotWordsHistoryMapper; +import cn.lili.modules.search.service.HotWordsService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * HotWordsServiceImpl + * + * @author Chopper + * @version v1.0 + * 2022-04-14 09:35 + */ +@Slf4j +@Service +public class HotWordsServiceImpl implements HotWordsService { + + /** + * 缓存 + */ + @Autowired + private Cache cache; + + @Override + public List getHotWords(Integer count) { + if (count == null) { + count = 0; + } + List hotWords = new ArrayList<>(); + // redis 排序中,下标从0开始,所以这里需要 -1 处理 + count = count - 1; + Set> set = cache.reverseRangeWithScores(CachePrefix.HOT_WORD.getPrefix(), count); + if (set == null || set.isEmpty()) { + return new ArrayList<>(); + } + for (ZSetOperations.TypedTuple defaultTypedTuple : set) { + hotWords.add(Objects.requireNonNull(defaultTypedTuple.getValue()).toString()); + } + return hotWords; + } + + @Override + public List getHotWordsVO(Integer count) { + if (count == null) { + count = 50; + } + List hotWords = new ArrayList<>(); + // redis 排序中,下标从0开始,所以这里需要 -1 处理 + count = count - 1; + Set> set = cache.reverseRangeWithScores(CachePrefix.HOT_WORD.getPrefix(), count); + if (set == null || set.isEmpty()) { + return new ArrayList<>(); + } + for (ZSetOperations.TypedTuple defaultTypedTuple : set) { + try { + hotWords.add(new HotWordsHistory(defaultTypedTuple.getValue().toString(), + defaultTypedTuple.getScore().intValue())); + } catch (Exception e) { + log.error("读取热词错误", e); + } + + } + + + Collections.sort(hotWords); + return hotWords; + } + + @Override + public void setHotWords(HotWordsDTO hotWords) { + cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), hotWords.getKeywords(), hotWords.getPoint()); + } + + /** + * 删除热门关键词 + * + * @param keywords 热词 + */ + @Override + public void deleteHotWords(String keywords) { + cache.zRemove(CachePrefix.HOT_WORD.getPrefix(), keywords); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/search/utils/EsIndexUtil.java b/framework/src/main/java/cn/lili/modules/search/utils/EsIndexUtil.java new file mode 100644 index 00000000..1f65638c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/utils/EsIndexUtil.java @@ -0,0 +1,45 @@ +package cn.lili.modules.search.utils; + +import cn.hutool.core.util.ReflectUtil; +import cn.lili.modules.search.entity.dos.EsGoodsIndex; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * @author paulG + * @since 2021/10/11 + **/ +public class EsIndexUtil { + + private static final String IGNORE_FIELD = "serialVersionUID,promotionMap,id,goodsId"; + + public static Map getUpdateIndexFieldsMap(EsGoodsIndex queryGoodsIndex, EsGoodsIndex updateGoodsIndex) { + Map queryFieldsMap = new HashMap<>(); + Map updateFieldsMap = new HashMap<>(); + + for (Map.Entry entry : ReflectUtil.getFieldMap(EsGoodsIndex.class).entrySet()) { + Object queryFieldValue = ReflectUtil.getFieldValue(queryGoodsIndex, entry.getValue()); + Object updateFieldValue = ReflectUtil.getFieldValue(updateGoodsIndex, entry.getValue()); + if (queryFieldValue != null && !IGNORE_FIELD.contains(entry.getKey())) { + ReflectUtil.setFieldValue(queryFieldsMap, entry.getValue(), queryFieldValue); + } + if (updateFieldValue != null && !IGNORE_FIELD.contains(entry.getKey())) { + ReflectUtil.setFieldValue(updateFieldsMap, entry.getValue(), updateFieldValue); + } + } + + return getUpdateIndexFieldsMap(queryFieldsMap, updateFieldsMap); + } + + public static Map getUpdateIndexFieldsMap(Map queryFieldsMap, Map updateFieldsMap) { + Map updateIndexMap = new HashMap<>(); + + updateIndexMap.put("queryFields", queryFieldsMap); + updateIndexMap.put("updateFields", updateFieldsMap); + return updateIndexMap; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/search/utils/SqlFilter.java b/framework/src/main/java/cn/lili/modules/search/utils/SqlFilter.java new file mode 100644 index 00000000..f1a2d374 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/search/utils/SqlFilter.java @@ -0,0 +1,59 @@ +package cn.lili.modules.search.utils; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * sql 关键字过滤 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2023/3/22 17:27 + */ + +public class SqlFilter { + + private static final Set SQL_KEYWORDS = new HashSet<>(Arrays.asList( + "SELECT", "FROM", "WHERE", "AND", "OR", "NOT", "INSERT", "UPDATE", "DELETE", "CREATE", + "TABLE", "INDEX", "VIEW", "DROP", "ALTER", "COLUMN", "ADD", "SET", "GROUP", "BY", + "HAVING", "ORDER", "ASC", "DESC", "LIKE", "IN", "BETWEEN", "IS", "NULL", "TRUE", "FALSE", + "JOIN", "LEFT", "RIGHT", "INNER", "OUTER", "FULL", "ON", "AS", "DISTINCT", "COUNT", + "MAX", "MIN", "SUM", "AVG" + )); + + + /** + * 关键字命中 + * + * @param sql + * @return + */ + public static Boolean hit(String sql) { + String[] tokens = sql.split("\\s+"); + for (String token : tokens) { + if (!SQL_KEYWORDS.contains(token.toUpperCase())) { + return true; + } + } + return false; + } + + /** + * 关键字替换 + * + * @param sql + * @return + */ + public static String filterSql(String sql) { + String[] tokens = sql.split("\\s+"); + StringBuilder filteredSql = new StringBuilder(); + for (String token : tokens) { + if (!SQL_KEYWORDS.contains(token.toUpperCase())) { + filteredSql.append(token).append(" "); + } + } + return filteredSql.toString().trim(); + } +} diff --git a/framework/src/main/java/cn/lili/common/sms/SmsUtil.java b/framework/src/main/java/cn/lili/modules/sms/SmsUtil.java similarity index 72% rename from framework/src/main/java/cn/lili/common/sms/SmsUtil.java rename to framework/src/main/java/cn/lili/modules/sms/SmsUtil.java index 0732b9b3..0f0c4621 100644 --- a/framework/src/main/java/cn/lili/common/sms/SmsUtil.java +++ b/framework/src/main/java/cn/lili/modules/sms/SmsUtil.java @@ -1,16 +1,14 @@ -package cn.lili.common.sms; +package cn.lili.modules.sms; -import cn.lili.common.verification.enums.VerificationEnums; +import cn.lili.modules.verification.entity.enums.VerificationEnums; import java.util.List; -import java.util.Map; /** * 短信接口 * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/30 15:44 */ public interface SmsUtil { @@ -32,17 +30,10 @@ public interface SmsUtil { * @param verificationEnums 验证码场景 * @param uuid 用户标识uuid * @param code 待验证code + * @return 操作状态 */ boolean verifyCode(String mobile, VerificationEnums verificationEnums, String uuid, String code); - /** - * 短信发送 - * - * @param mobile 接收手机号 - * @param param 参数 - * @param templateCode 模版code - */ - void sendSmsCode(String signName, String mobile, Map param, String templateCode); /** * 短信批量发送 diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/SmsReach.java b/framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsReach.java similarity index 77% rename from framework/src/main/java/cn/lili/modules/message/entity/dos/SmsReach.java rename to framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsReach.java index 51e02367..33ff2db6 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/SmsReach.java +++ b/framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsReach.java @@ -1,19 +1,17 @@ -package cn.lili.modules.message.entity.dos; +package cn.lili.modules.sms.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; @@ -21,20 +19,15 @@ import java.util.Date; * 短信任务 * * @author Chopper - * @date 2021/1/30 4:13 下午 + * @since 2021/1/30 4:13 下午 */ @Data -@Entity -@Table(name = "li_sms_reach") @TableName("li_sms_reach") @ApiModel(value = "短信任务") -public class SmsReach { +@EqualsAndHashCode(callSuper = true) +public class SmsReach extends BaseIdEntity { - @Id - @TableId - @TableField - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; + private static final long serialVersionUID = -8106666482841131277L; @ApiModelProperty(value = "签名名称", required = true) private String signName; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/SmsSign.java b/framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsSign.java similarity index 66% rename from framework/src/main/java/cn/lili/modules/message/entity/dos/SmsSign.java rename to framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsSign.java index e1f0cb10..6c7ade7d 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/SmsSign.java +++ b/framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsSign.java @@ -1,37 +1,22 @@ -package cn.lili.modules.message.entity.dos; +package cn.lili.modules.sms.entity.dos; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - /** * 短信签名 * * @author Chopper - * @date 2021/1/30 4:13 下午 + * @since 2021/1/30 4:13 下午 */ @Data -@Entity -@Table(name = "li_sms_sign") @TableName("li_sms_sign") @ApiModel(value = "短信签名") -public class SmsSign { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class SmsSign extends BaseIdEntity { @ApiModelProperty(value = "签名名称", required = true) private String signName; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/SmsTemplate.java b/framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsTemplate.java similarity index 66% rename from framework/src/main/java/cn/lili/modules/message/entity/dos/SmsTemplate.java rename to framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsTemplate.java index e17da568..855721f0 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/SmsTemplate.java +++ b/framework/src/main/java/cn/lili/modules/sms/entity/dos/SmsTemplate.java @@ -1,37 +1,22 @@ -package cn.lili.modules.message.entity.dos; +package cn.lili.modules.sms.entity.dos; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - /** * 短信模板 * * @author Chopper - * @date 2021/1/30 4:13 下午 + * @since 2021/1/30 4:13 下午 */ @Data -@Entity -@Table(name = "li_sms_template") @TableName("li_sms_template") @ApiModel(value = "短信模板") -public class SmsTemplate { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; +public class SmsTemplate extends BaseIdEntity { @ApiModelProperty(value = "模板名称", required = true) private String templateName; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dto/SmsReachDTO.java b/framework/src/main/java/cn/lili/modules/sms/entity/dto/SmsReachDTO.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/message/entity/dto/SmsReachDTO.java rename to framework/src/main/java/cn/lili/modules/sms/entity/dto/SmsReachDTO.java index 7840ed28..8081387d 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dto/SmsReachDTO.java +++ b/framework/src/main/java/cn/lili/modules/sms/entity/dto/SmsReachDTO.java @@ -1,6 +1,6 @@ -package cn.lili.modules.message.entity.dto; +package cn.lili.modules.sms.entity.dto; -import cn.lili.modules.message.entity.dos.SmsReach; +import cn.lili.modules.sms.entity.dos.SmsReach; import lombok.Data; import java.util.List; @@ -8,7 +8,7 @@ import java.util.List; /** * 短信任务DTO * @author Chopper - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ @Data public class SmsReachDTO extends SmsReach { diff --git a/framework/src/main/java/cn/lili/modules/sms/entity/enums/SmsEnum.java b/framework/src/main/java/cn/lili/modules/sms/entity/enums/SmsEnum.java new file mode 100644 index 00000000..894e6b37 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/sms/entity/enums/SmsEnum.java @@ -0,0 +1,15 @@ +package cn.lili.modules.sms.entity.enums; + +/** + * 短信通道枚举 + * + * @author Bulbasaur + * @since 2023-02-16 + */ +public enum SmsEnum { + + /** + * 短信渠道 + */ + ALI, HUAWEI, TENCENT; +} diff --git a/framework/src/main/java/cn/lili/modules/sms/impl/SmsUtilAliImplService.java b/framework/src/main/java/cn/lili/modules/sms/impl/SmsUtilAliImplService.java new file mode 100644 index 00000000..65fe31ba --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/sms/impl/SmsUtilAliImplService.java @@ -0,0 +1,160 @@ +package cn.lili.modules.sms.impl; + +import cn.hutool.core.util.StrUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.SmsTemplateProperties; +import cn.lili.common.properties.SystemSettingProperties; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.CommonUtil; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.sms.SmsUtil; +import cn.lili.modules.sms.plugin.SmsPluginFactory; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SmsSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import com.google.gson.Gson; +import com.xkcoding.http.util.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 短信网管阿里云实现 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/30 15:44 + */ +@Component +@Slf4j +public class SmsUtilAliImplService implements SmsUtil { + + @Autowired + private Cache cache; + @Autowired + private SettingService settingService; + @Autowired + private MemberService memberService; + @Autowired + private SmsPluginFactory smsPluginFactory; + + @Autowired + private SmsTemplateProperties smsTemplateProperties; + + @Autowired + private SystemSettingProperties systemSettingProperties; + + @Override + public void sendSmsCode(String mobile, VerificationEnums verificationEnums, String uuid) { + //获取短信配置 + Setting setting = settingService.get(SettingEnum.SMS_SETTING.name()); + if (StrUtil.isBlank(setting.getSettingValue())) { + throw new ServiceException(ResultCode.ALI_SMS_SETTING_ERROR); + } + SmsSetting smsSetting = new Gson().fromJson(setting.getSettingValue(), SmsSetting.class); + + //验证码 + String code = CommonUtil.getRandomNum(); + + //准备发送短信参数 + Map params = new HashMap<>(2); + //验证码内容 + params.put("code", code); + + //模版 默认为登录验证 + String templateCode; + + //如果某个模版需要自定义,则在此处进行调整 + switch (verificationEnums) { + //登录 + case LOGIN: { + templateCode = smsTemplateProperties.getLOGIN(); + break; + } + //注册 + case REGISTER: { + templateCode = smsTemplateProperties.getREGISTER(); + break; + } + //找回密码 + case FIND_USER: { + templateCode = smsTemplateProperties.getFIND_USER(); + break; + } + //修改密码 + case UPDATE_PASSWORD: { + Member member = memberService.getById(UserContext.getCurrentUser().getId()); + if (member == null || StringUtil.isEmpty(member.getMobile())) { + return; + } + //更新为用户最新手机号 + mobile = member.getMobile(); + templateCode = smsTemplateProperties.getUPDATE_PASSWORD(); + break; + } + //设置支付密码 + case WALLET_PASSWORD: { + Member member = memberService.getById(UserContext.getCurrentUser().getId()); + //更新为用户最新手机号 + mobile = member.getMobile(); + templateCode = smsTemplateProperties.getWALLET_PASSWORD(); + break; + } + //如果不是有效的验证码手段,则此处不进行短信操作 + default: + return; + } + //如果是测试模式 默认验证码 6个1 + if (systemSettingProperties.getIsTestModel()) { + code = "111111"; + log.info("测试模式 - 接收手机:{},验证码:{}", mobile, code); + } else { + log.info("接收手机:{},验证码:{}", mobile, code); + //发送短信 + smsPluginFactory.smsPlugin().sendSmsCode(smsSetting.getSignName(), mobile, params, templateCode); + } + //缓存中写入要验证的信息 + cache.put(cacheKey(verificationEnums, mobile, uuid), code, 300L); + } + + @Override + public boolean verifyCode(String mobile, VerificationEnums verificationEnums, String uuid, String code) { + Object result = cache.get(cacheKey(verificationEnums, mobile, uuid)); + if (code.equals(result) || code.equals("0")) { + //校验之后,删除 + cache.remove(cacheKey(verificationEnums, mobile, uuid)); + return true; + } else { + return false; + } + + } + + @Override + public void sendBatchSms(String signName, List mobile, String templateCode) { + smsPluginFactory.smsPlugin().sendBatchSms(signName, mobile, templateCode); + } + + + /** + * 生成缓存key + * + * @param verificationEnums 验证场景 + * @param mobile 手机号码 + * @param uuid 用户标识 uuid + * @return + */ + static String cacheKey(VerificationEnums verificationEnums, String mobile, String uuid) { + return CachePrefix.SMS_CODE.getPrefix() + verificationEnums.name() + uuid + mobile; + } +} diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/SmsReachMapper.java b/framework/src/main/java/cn/lili/modules/sms/mapper/SmsReachMapper.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/message/mapper/SmsReachMapper.java rename to framework/src/main/java/cn/lili/modules/sms/mapper/SmsReachMapper.java index b9e5d8c2..dc59ac51 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/SmsReachMapper.java +++ b/framework/src/main/java/cn/lili/modules/sms/mapper/SmsReachMapper.java @@ -1,12 +1,12 @@ -package cn.lili.modules.message.mapper; +package cn.lili.modules.sms.mapper; -import cn.lili.modules.message.entity.dos.SmsReach; +import cn.lili.modules.sms.entity.dos.SmsReach; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 短信任务数据处理层 * @author Chopper - * @date 2021/1/30 4:17 下午 + * @since 2021/1/30 4:17 下午 */ public interface SmsReachMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/SmsSignMapper.java b/framework/src/main/java/cn/lili/modules/sms/mapper/SmsSignMapper.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/message/mapper/SmsSignMapper.java rename to framework/src/main/java/cn/lili/modules/sms/mapper/SmsSignMapper.java index ad24c205..fd566fb1 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/SmsSignMapper.java +++ b/framework/src/main/java/cn/lili/modules/sms/mapper/SmsSignMapper.java @@ -1,12 +1,12 @@ -package cn.lili.modules.message.mapper; +package cn.lili.modules.sms.mapper; -import cn.lili.modules.message.entity.dos.SmsSign; +import cn.lili.modules.sms.entity.dos.SmsSign; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 短信签名数据处理层 * @author Chopper - * @date 2021/1/30 4:17 下午 + * @since 2021/1/30 4:17 下午 */ public interface SmsSignMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/SmsTemplateMapper.java b/framework/src/main/java/cn/lili/modules/sms/mapper/SmsTemplateMapper.java similarity index 60% rename from framework/src/main/java/cn/lili/modules/message/mapper/SmsTemplateMapper.java rename to framework/src/main/java/cn/lili/modules/sms/mapper/SmsTemplateMapper.java index ab6b93b9..ea92d487 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/SmsTemplateMapper.java +++ b/framework/src/main/java/cn/lili/modules/sms/mapper/SmsTemplateMapper.java @@ -1,12 +1,12 @@ -package cn.lili.modules.message.mapper; +package cn.lili.modules.sms.mapper; -import cn.lili.modules.message.entity.dos.SmsTemplate; +import cn.lili.modules.sms.entity.dos.SmsTemplate; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 短信模板数据处理层 * @author Chopper - * @date 2021/1/30 4:17 下午 + * @since 2021/1/30 4:17 下午 */ public interface SmsTemplateMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/sms/plugin/SmsPlugin.java b/framework/src/main/java/cn/lili/modules/sms/plugin/SmsPlugin.java new file mode 100644 index 00000000..2000d81b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/sms/plugin/SmsPlugin.java @@ -0,0 +1,110 @@ +package cn.lili.modules.sms.plugin; + +import cn.lili.modules.sms.entity.dos.SmsSign; +import cn.lili.modules.sms.entity.dos.SmsTemplate; +import cn.lili.modules.sms.entity.enums.SmsEnum; + +import java.util.List; +import java.util.Map; + +/** + * 短信插件接口 + * + * @author Bulbasaur + * @since 2023-02-16 + */ +public interface SmsPlugin { + + /** + * 插件名称 + */ + SmsEnum pluginName(); + + /** + * 短信发送 + * + * @param mobile 接收手机号 + * @param param 参数 + * @param templateCode 模版code + * @param signName 签名名称 + */ + void sendSmsCode(String signName, String mobile, Map param, String templateCode); + + /** + * 短信批量发送 + * + * @param mobile 接收手机号 + * @param signName 签名 + * @param templateCode 模版code + */ + void sendBatchSms(String signName, List mobile, String templateCode); + + + /** + * 申请短信签名 + * + * @param smsSign 短信签名 + * @throws Exception 阿里短信签名错误 + */ + void addSmsSign(SmsSign smsSign) throws Exception; + + + /** + * 删除短信签名 + * + * @param signName 签名名称 + * @throws Exception 阿里短信签名错误 + */ + void deleteSmsSign(String signName) throws Exception; + + /** + * 查询短信签名申请状态 + * + * @param signName 签名名称 + * @return 短信签名申请状态 + * @throws Exception 阿里短信签名错误 + */ + Map querySmsSign(String signName) throws Exception; + + /** + * 修改未审核通过的短信签名,并重新提交审核。 + * + * @param smsSign 短信签名 + * @throws Exception 阿里短信签名错误 + */ + void modifySmsSign(SmsSign smsSign) throws Exception; + + /** + * 修改未审核通过的短信模板,并重新提交审核。 + * + * @param smsTemplate 短信模板 + * @throws Exception 阿里短信签名错误 + */ + void modifySmsTemplate(SmsTemplate smsTemplate) throws Exception; + + /** + * 查看短信模板 + * + * @param templateCode 短信模板CODE + * @return 短信模板 + * @throws Exception 阿里短信签名错误 + */ + Map querySmsTemplate(String templateCode) throws Exception; + + /** + * 申请短信模板 + * + * @param smsTemplate 短信模板 + * @return 短信模板 + * @throws Exception 阿里短信签名错误 + */ + String addSmsTemplate(SmsTemplate smsTemplate) throws Exception; + + /** + * 删除短信模板 + * + * @param templateCode 短信模板CODE + * @throws Exception 阿里短信签名错误 + */ + void deleteSmsTemplate(String templateCode) throws Exception; +} diff --git a/framework/src/main/java/cn/lili/modules/sms/plugin/SmsPluginFactory.java b/framework/src/main/java/cn/lili/modules/sms/plugin/SmsPluginFactory.java new file mode 100644 index 00000000..0ae7bf5d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/sms/plugin/SmsPluginFactory.java @@ -0,0 +1,59 @@ +package cn.lili.modules.sms.plugin; + +import cn.hutool.json.JSONUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.sms.entity.enums.SmsEnum; +import cn.lili.modules.sms.plugin.impl.AliSmsPlugin; +import cn.lili.modules.sms.plugin.impl.HuaweiSmsPlugin; +import cn.lili.modules.sms.plugin.impl.TencentSmsPlugin; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SmsSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 短信服务抽象工厂 直接返回操作类 + * + * @author Bulbasaur + * @version v1.0 + * @since 2023-02-16 + */ +@Component +public class SmsPluginFactory { + + @Autowired + private SettingService settingService; + + + /** + * 获取oss client + * + * @return + */ + public SmsPlugin smsPlugin() { + + SmsSetting smsSetting = null; + try { + Setting setting = settingService.get(SettingEnum.SMS_SETTING.name()); + + smsSetting = JSONUtil.toBean(setting.getSettingValue(), SmsSetting.class); + + + switch (SmsEnum.valueOf(smsSetting.getType())) { + + case ALI: + return new AliSmsPlugin(smsSetting); + case TENCENT: + return new TencentSmsPlugin(smsSetting); + case HUAWEI: + return new HuaweiSmsPlugin(smsSetting); + default: + throw new ServiceException(); + } + } catch (Exception e) { + throw new ServiceException(); + } + } +} diff --git a/framework/src/main/java/cn/lili/common/sms/impl/SmsUtilAliImplService.java b/framework/src/main/java/cn/lili/modules/sms/plugin/impl/AliSmsPlugin.java similarity index 62% rename from framework/src/main/java/cn/lili/common/sms/impl/SmsUtilAliImplService.java rename to framework/src/main/java/cn/lili/modules/sms/plugin/impl/AliSmsPlugin.java index 19394748..e8d7b1aa 100644 --- a/framework/src/main/java/cn/lili/common/sms/impl/SmsUtilAliImplService.java +++ b/framework/src/main/java/cn/lili/modules/sms/plugin/impl/AliSmsPlugin.java @@ -1,32 +1,17 @@ -package cn.lili.common.sms.impl; +package cn.lili.modules.sms.plugin.impl; -import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.sms.AliSmsUtil; -import cn.lili.common.sms.SmsUtil; -import cn.lili.common.utils.CommonUtil; -import cn.lili.common.verification.enums.VerificationEnums; -import cn.lili.modules.message.entity.dos.SmsSign; -import cn.lili.modules.message.entity.dos.SmsTemplate; -import cn.lili.modules.connect.util.Base64Utils; -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.common.utils.Base64Utils; +import cn.lili.modules.sms.entity.dos.SmsSign; +import cn.lili.modules.sms.entity.dos.SmsTemplate; +import cn.lili.modules.sms.entity.enums.SmsEnum; +import cn.lili.modules.sms.plugin.SmsPlugin; import cn.lili.modules.system.entity.dto.SmsSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; import com.aliyun.dysmsapi20170525.models.*; import com.aliyun.teaopenapi.models.Config; -import com.google.gson.Gson; -import com.xkcoding.http.util.StringUtil; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.HashMap; @@ -34,78 +19,27 @@ import java.util.List; import java.util.Map; /** - * 短信网管阿里云实现 + * 阿里云短信插件 * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/11/30 15:44 + * @author Bulbasaur + * @since 2023-02-16 */ -@Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { +public class AliSmsPlugin implements SmsPlugin { - private final Cache cache; + private SmsSetting smsSetting; - private final SettingService settingService; - - private final MemberService memberService; - - @Override - public void sendSmsCode(String mobile, VerificationEnums verificationEnums, String uuid) { - - String code = CommonUtil.getRandomNum(); - code = "111111"; - - switch (verificationEnums) { - //如果某个模版需要自定义,则在此处进行调整 - case LOGIN: - case REGISTER: - case FIND_USER: { - - //准备发送短信参数 - Map params = new HashMap<>(); - params.put("code", code); - cache.put(cacheKey(verificationEnums, mobile, uuid), code, 300L); - //this.sendSmsCode("北京宏业汇成科技有限公司",mobile, params, verificationEnums.getSmsTemplate()); - break; - } - case UPDATE_PASSWORD: { - Member member = memberService.getById(UserContext.getCurrentUser().getId()); - if (member == null || StringUtil.isEmpty(member.getMobile())) { - return; - } - String memberMobile = member.getMobile(); - //准备发送短信参数 - Map params = new HashMap<>(); - params.put("code", code); - cache.put(cacheKey(verificationEnums, memberMobile, uuid), code, 300L); - //this.sendSmsCode("北京宏业汇成科技有限公司",mobile, params, verificationEnums.getSmsTemplate()); - break; - } - //如果不是有效的验证码手段,则此处不进行短信操作 - default: - return; - } + public AliSmsPlugin(SmsSetting smsSetting) { + this.smsSetting = smsSetting; } @Override - public boolean verifyCode(String mobile, VerificationEnums verificationEnums, String uuid, String code) { - Object result = cache.get(cacheKey(verificationEnums, mobile, uuid)); - if (code.equals(result)) { - //校验之后,删除 - cache.remove(cacheKey(verificationEnums, mobile, uuid)); - return true; - } else { - return false; - } - + public SmsEnum pluginName() { + return SmsEnum.ALI; } @Override public void sendSmsCode(String signName, String mobile, Map param, String templateCode) { - com.aliyun.dysmsapi20170525.Client client = this.createClient(); SendSmsRequest sendSmsRequest = new SendSmsRequest() .setSignName(signName) @@ -114,19 +48,23 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { .setTemplateParam(JSONUtil.toJsonStr(param)); try { SendSmsResponse response = client.sendSms(sendSmsRequest); - System.out.println(response.getBody().getCode()); + if (!("OK").equals(response.getBody().getCode())) { + throw new ServiceException(response.getBody().getMessage()); + } } catch (Exception e) { - e.printStackTrace(); + log.error("发送短信错误", e); } } + @Override public void sendBatchSms(String signName, List mobile, String templateCode) { com.aliyun.dysmsapi20170525.Client client = this.createClient(); - List sign = mobile; + List sign = new ArrayList(); + sign.addAll(mobile); sign.replaceAll(e -> signName); //手机号拆成多个小组进行发送 @@ -142,7 +80,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { signNameList.add(sign.subList((i * 100), endPoint)); } - //发送短信 +// //发送短信 for (int i = 0; i < mobileList.size(); i++) { SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest() .setPhoneNumberJson(JSONUtil.toJsonStr(mobileList.get(i))) @@ -151,24 +89,25 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { try { client.sendBatchSms(sendBatchSmsRequest); } catch (Exception e) { - e.printStackTrace(); + log.error("批量发送短信错误", e); } } } - @Override public void addSmsSign(SmsSign smsSign) throws Exception { //设置参数添加短信签名 com.aliyun.dysmsapi20170525.Client client = this.createClient(); - + //营业执照 AddSmsSignRequest.AddSmsSignRequestSignFileList signFileList0 = new AddSmsSignRequest.AddSmsSignRequestSignFileList() .setFileContents(Base64Utils.encode(smsSign.getBusinessLicense())) .setFileSuffix(smsSign.getBusinessLicense().substring(smsSign.getBusinessLicense().lastIndexOf(".") + 1)); + //授权委托书 AddSmsSignRequest.AddSmsSignRequestSignFileList signFileList1 = new AddSmsSignRequest.AddSmsSignRequestSignFileList() .setFileContents(Base64Utils.encode(smsSign.getLicense())) - .setFileSuffix(smsSign.getLicense().substring(smsSign.getBusinessLicense().lastIndexOf(".") + 1)); + .setFileSuffix(smsSign.getLicense().substring(smsSign.getLicense().lastIndexOf(".")) + 1); + //添加短信签名 AddSmsSignRequest addSmsSignRequest = new AddSmsSignRequest() .setSignName(smsSign.getSignName()) .setSignSource(smsSign.getSignSource()) @@ -178,7 +117,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { signFileList1 )); AddSmsSignResponse response = client.addSmsSign(addSmsSignRequest); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } @@ -190,7 +129,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { .setSignName(signName); DeleteSmsSignResponse response = client.deleteSmsSign(deleteSmsSignRequest); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } @@ -203,10 +142,10 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { QuerySmsSignRequest querySmsSignRequest = new QuerySmsSignRequest().setSignName(signName); QuerySmsSignResponse response = client.querySmsSign(querySmsSignRequest); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } - Map map = new HashMap<>(); + Map map = new HashMap<>(2); map.put("SignStatus", response.getBody().getSignStatus()); map.put("Reason", response.getBody().getReason()); return map; @@ -232,7 +171,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { signFileList1 )); ModifySmsSignResponse response = client.modifySmsSign(modifySmsSign); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } @@ -248,7 +187,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { .setTemplateCode(smsTemplate.getTemplateCode()); ModifySmsTemplateResponse response = client.modifySmsTemplate(modifySmsTemplateRequest); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } @@ -260,10 +199,10 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { .setTemplateCode(templateCode); QuerySmsTemplateResponse response = client.querySmsTemplate(querySmsTemplateRequest); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } - Map map = new HashMap<>(); + Map map = new HashMap<>(4); map.put("TemplateStatus", response.getBody().getTemplateStatus()); map.put("Reason", response.getBody().getReason()); map.put("TemplateCode", response.getBody().getTemplateCode()); @@ -280,7 +219,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { .setRemark(smsTemplate.getRemark()); AddSmsTemplateResponse response = client.addSmsTemplate(addSmsTemplateRequest); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } return response.getBody().getTemplateCode(); @@ -293,51 +232,34 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { .setTemplateCode(templateCode); DeleteSmsTemplateResponse response = client.deleteSmsTemplate(deleteSmsTemplateRequest); - if (!response.getBody().getCode().equals("OK")) { + if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } /** - * 使用AK&SK初始化账号Client + * 初始化账号Client * - * @return Client - * @throws Exception + * @return Client 短信操作 */ public com.aliyun.dysmsapi20170525.Client createClient() { try { - Setting setting = settingService.getById(SettingEnum.SMS_SETTING.name()); - if (StrUtil.isBlank(setting.getSettingValue())) { - throw new ServiceException("您还未配置阿里云短信"); + if (smsSetting == null) { + throw new ServiceException(ResultCode.ALI_SMS_SETTING_ERROR); } - SmsSetting smsSetting = new Gson().fromJson(setting.getSettingValue(), SmsSetting.class); - Config config = new Config(); - // 您的AccessKey ID - //config.accessKeyId = smsSetting.getAccessKeyId(); - config.accessKeyId = "LTAI4G4deX59EyjpEULaJdsU"; - // 您的AccessKey Secret - //config.accessKeySecret = smsSetting.getAccessSecret(); - config.accessKeySecret = "BlRBpl7WBman6GYYwLKMiKqMTXFhWf"; - // 访问的域名 + //您的AccessKey ID + config.accessKeyId = smsSetting.getAccessKeyId(); + //您的AccessKey Secret + config.accessKeySecret = smsSetting.getAccessSecret(); + //访问的域名 config.endpoint = "dysmsapi.aliyuncs.com"; return new com.aliyun.dysmsapi20170525.Client(config); } catch (Exception e) { - e.printStackTrace(); + log.error("短信初始化错误", e); } return null; } - /** - * 生成缓存key - * - * @param verificationEnums 验证场景 - * @param mobile 手机号码 - * @param uuid 用户标识 uuid - * @return - */ - static String cacheKey(VerificationEnums verificationEnums, String mobile, String uuid) { - return CachePrefix.SMS_CODE.getPrefix() + verificationEnums.name() + mobile; - } } diff --git a/framework/src/main/java/cn/lili/modules/sms/plugin/impl/HuaweiSmsPlugin.java b/framework/src/main/java/cn/lili/modules/sms/plugin/impl/HuaweiSmsPlugin.java new file mode 100644 index 00000000..fa6818c5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/sms/plugin/impl/HuaweiSmsPlugin.java @@ -0,0 +1,323 @@ +package cn.lili.modules.sms.plugin.impl; + +import cn.lili.modules.sms.entity.dos.SmsSign; +import cn.lili.modules.sms.entity.dos.SmsTemplate; +import cn.lili.modules.sms.entity.enums.SmsEnum; +import cn.lili.modules.sms.plugin.SmsPlugin; +import cn.lili.modules.system.entity.dto.SmsSetting; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import javax.net.ssl.*; +import java.io.*; +import java.net.URL; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 腾讯云短信插件 + * + * @author Bulbasaur + * @since 2023-02-16 + */ +@Slf4j +public class HuaweiSmsPlugin implements SmsPlugin { + + private SmsSetting smsSetting; + + public HuaweiSmsPlugin(SmsSetting smsSetting) { + this.smsSetting = smsSetting; + } + + @Override + public SmsEnum pluginName() { + return SmsEnum.HUAWEI; + } + + //无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值 + private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""; + //无需修改,用于格式化鉴权头域,给"Authorization"参数赋值 + private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""; + + + @Override + public void sendSmsCode(String signName, String mobile, Map param, String templateCode) { + try { + this.sendSms(signName, mobile, "[" + param.values() + "]", templateCode); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @Override + public void sendBatchSms(String signName, List mobile, String templateCode) { + try { + this.sendSms(signName, StringUtils.join(mobile, ","), null, templateCode); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void addSmsSign(SmsSign smsSign) throws Exception { + + } + + @Override + public void deleteSmsSign(String signName) throws Exception { + + } + + @Override + public Map querySmsSign(String signName) throws Exception { + return null; + } + + @Override + public void modifySmsSign(SmsSign smsSign) throws Exception { + + } + + @Override + public void modifySmsTemplate(SmsTemplate smsTemplate) throws Exception { + + } + + @Override + public Map querySmsTemplate(String templateCode) throws Exception { + return null; + } + + @Override + public String addSmsTemplate(SmsTemplate smsTemplate) throws Exception { + return null; + } + + @Override + public void deleteSmsTemplate(String templateCode) throws Exception { + + } + + + private void sendSms(String signName, String mobile, String param, String templateCode) throws Exception { + //必填,请参考"开发准备"获取如下数据,替换为实际值 + String url = "https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1"; //APP接入地址(在控制台"应用管理"页面获取)+接口访问URI + String appKey = smsSetting.getHuaweiAppKey(); //APP_Key + String appSecret = smsSetting.getHuaweiAppSecret(); //APP_Secret + String sender = smsSetting.getHuaweiSender(); //国内短信签名通道号或国际/港澳台短信通道号 + String templateId = templateCode; //模板ID + + //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + //国际/港澳台短信不用关注该参数 + String signature = signName; //签名名称 + + //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔 + String receiver = mobile; //短信接收人号码 + + //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + String templateParas = param; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + + //请求Body,不携带签名名称时,signature请填null + String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + System.out.println("body is null."); + return; + } + + //请求Headers中的X-WSSE参数值 + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + System.out.println("wsse header is null."); + return; + } + + Writer out = null; + BufferedReader in = null; + StringBuffer result = new StringBuffer(); + HttpsURLConnection connection = null; + InputStream is = null; + + + HostnameVerifier hv = new HostnameVerifier() { + + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + trustAllHttpsCertificates(); + + try { + URL realUrl = new URL(url); + connection = (HttpsURLConnection) realUrl.openConnection(); + + connection.setHostnameVerifier(hv); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(true); + //请求方法 + connection.setRequestMethod("POST"); + //请求Headers参数 + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + connection.setRequestProperty("Authorization", AUTH_HEADER_VALUE); + connection.setRequestProperty("X-WSSE", wsseHeader); + + connection.connect(); + out = new OutputStreamWriter(connection.getOutputStream()); + out.write(body); //发送请求Body参数 + out.flush(); + out.close(); + + int status = connection.getResponseCode(); + if (200 == status) { //200 + is = connection.getInputStream(); + } else { //400/401 + is = connection.getErrorStream(); + } + in = new BufferedReader(new InputStreamReader(is, "UTF-8")); + String line = ""; + while ((line = in.readLine()) != null) { + result.append(line); + } + System.out.println(result.toString()); //打印响应消息实体 + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (null != out) { + out.close(); + } + if (null != is) { + is.close(); + } + if (null != in) { + in.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 构造请求Body体 + * + * @param sender + * @param receiver + * @param templateId + * @param templateParas + * @param statusCallBack + * @param signature | 签名名称,使用国内短信通用模板时填写 + * @return + */ + static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, + String statusCallBack, String signature) { + if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty() + || templateId.isEmpty()) { + System.out.println("buildRequestBody(): sender, receiver or templateId is null."); + return null; + } + Map map = new HashMap(); + + map.put("from", sender); + map.put("to", receiver); + map.put("templateId", templateId); + if (null != templateParas && !templateParas.isEmpty()) { + map.put("templateParas", templateParas); + } + if (null != statusCallBack && !statusCallBack.isEmpty()) { + map.put("statusCallback", statusCallBack); + } + if (null != signature && !signature.isEmpty()) { + map.put("signature", signature); + } + + StringBuilder sb = new StringBuilder(); + String temp = ""; + + for (String s : map.keySet()) { + try { + temp = URLEncoder.encode(map.get(s), "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + sb.append(s).append("=").append(temp).append("&"); + } + + return sb.deleteCharAt(sb.length() - 1).toString(); + } + + /** + * 构造X-WSSE参数值 + * + * @param appKey + * @param appSecret + * @return + */ + static String buildWsseHeader(String appKey, String appSecret) { + if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) { + System.out.println("buildWsseHeader(): appKey or appSecret is null."); + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + String time = sdf.format(new Date()); //Created + String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce + + MessageDigest md; + byte[] passwordDigest = null; + + try { + md = MessageDigest.getInstance("SHA-256"); + md.update((nonce + time + appSecret).getBytes()); + passwordDigest = md.digest(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码 + String passwordDigestBase64Str = Base64.getEncoder().encodeToString(passwordDigest); //PasswordDigest + //如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码 + //String passwordDigestBase64Str = Base64.encodeBase64String(passwordDigest); //PasswordDigest + //若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正 + //passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", ""); + return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time); + } + + /*** @throws Exception + */ + static void trustAllHttpsCertificates() throws Exception { + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + return; + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + return; + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } + }; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } +} diff --git a/framework/src/main/java/cn/lili/modules/sms/plugin/impl/TencentSmsPlugin.java b/framework/src/main/java/cn/lili/modules/sms/plugin/impl/TencentSmsPlugin.java new file mode 100644 index 00000000..dae2cba0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/sms/plugin/impl/TencentSmsPlugin.java @@ -0,0 +1,254 @@ +package cn.lili.modules.sms.plugin.impl; + +import cn.hutool.core.convert.Convert; +import cn.lili.modules.sms.entity.dos.SmsSign; +import cn.lili.modules.sms.entity.dos.SmsTemplate; +import cn.lili.modules.sms.entity.enums.SmsEnum; +import cn.lili.modules.sms.plugin.SmsPlugin; +import cn.lili.modules.system.entity.dto.SmsSetting; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Map; + +/** + * 腾讯云短信插件 + * + * @author Bulbasaur + * @since 2023-02-16 + */ +@Slf4j +public class TencentSmsPlugin implements SmsPlugin { + + private SmsSetting smsSetting; + + public TencentSmsPlugin(SmsSetting smsSetting) { + this.smsSetting = smsSetting; + } + + @Override + public SmsEnum pluginName() { + return SmsEnum.TENCENT; + } + + + @Override + public void sendSmsCode(String signName, String mobile, Map param, String templateCode) { + try { + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + SendSmsRequest req = new SendSmsRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + req.setSmsSdkAppId(smsSetting.getTencentSdkAppId()); + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 + req.setSignName(smsSetting.getTencentSignName()); + + /* 模板 ID: 必须填写已审核通过的模板 ID */ + // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 + req.setTemplateId(templateCode); + + /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */ + req.setTemplateParamSet(param.values().toArray(new String[0])); + + /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] + * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */ + String[] phoneNumberSet = {"+86" + mobile}; + req.setPhoneNumberSet(phoneNumberSet); + + /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ + String sessionContext = ""; + req.setSessionContext(sessionContext); + + /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String extendCode = ""; + req.setExtendCode(extendCode); + + /* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String senderid = ""; + req.setSenderId(senderid); + + /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */ + SendSmsResponse res = getClient().SendSms(req); + + // 输出json格式的字符串回包 + System.out.println(SendSmsResponse.toJsonString(res)); + + // 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义 + // System.out.println(res.getRequestId()); + + /* 当出现以下错误码时,快速解决方案参考 + * [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms) + */ + } catch (TencentCloudSDKException tencentCloudSDKException) { + tencentCloudSDKException.printStackTrace(); + } + + } + + @Override + public void sendBatchSms(String signName, List mobile, String templateCode) { + try { + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + SendSmsRequest req = new SendSmsRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + req.setSmsSdkAppId(smsSetting.getTencentSdkAppId()); + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 + req.setSignName(smsSetting.getTencentSignName()); + + /* 模板 ID: 必须填写已审核通过的模板 ID */ + // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 + req.setTemplateId(templateCode); + + /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */ + req.setTemplateParamSet(null); + + /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] + * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */ + req.setPhoneNumberSet(Convert.toStrArray(mobile)); + + /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ + String sessionContext = ""; + req.setSessionContext(sessionContext); + + /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String extendCode = ""; + req.setExtendCode(extendCode); + + /* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String senderid = ""; + req.setSenderId(senderid); + + /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */ + SendSmsResponse res = getClient().SendSms(req); + + // 输出json格式的字符串回包 + System.out.println(SendSmsResponse.toJsonString(res)); + + // 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义 + // System.out.println(res.getRequestId()); + + /* 当出现以下错误码时,快速解决方案参考 + * [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms) + */ + } catch (TencentCloudSDKException tencentCloudSDKException) { + tencentCloudSDKException.printStackTrace(); + } + } + + @Override + public void addSmsSign(SmsSign smsSign) throws Exception { + + } + + @Override + public void deleteSmsSign(String signName) throws Exception { + + } + + @Override + public Map querySmsSign(String signName) throws Exception { + return null; + } + + @Override + public void modifySmsSign(SmsSign smsSign) throws Exception { + + } + + @Override + public void modifySmsTemplate(SmsTemplate smsTemplate) throws Exception { + + } + + @Override + public Map querySmsTemplate(String templateCode) throws Exception { + return null; + } + + @Override + public String addSmsTemplate(SmsTemplate smsTemplate) throws Exception { + return null; + } + + @Override + public void deleteSmsTemplate(String templateCode) throws Exception { + + } + + + /** + * 获取smsclient + * + * @return + */ + private SmsClient getClient() { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及你的财产安全。 + * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */ + Credential cred = new Credential(smsSetting.getTencentSecretId(), smsSetting.getTencentSecretKey()); + + // 实例化一个http选项,可选,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理(无需要直接忽略) + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* SDK默认使用POST方法。 + * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + httpProfile.setReqMethod("POST"); + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + httpProfile.setConnTimeout(60); + /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */ + return new SmsClient(cred, "ap-guangzhou"); + } +} diff --git a/framework/src/main/java/cn/lili/modules/message/service/SmsReachService.java b/framework/src/main/java/cn/lili/modules/sms/service/SmsReachService.java similarity index 70% rename from framework/src/main/java/cn/lili/modules/message/service/SmsReachService.java rename to framework/src/main/java/cn/lili/modules/sms/service/SmsReachService.java index 6866dd22..d93b6ef5 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/SmsReachService.java +++ b/framework/src/main/java/cn/lili/modules/sms/service/SmsReachService.java @@ -1,6 +1,6 @@ -package cn.lili.modules.message.service; +package cn.lili.modules.sms.service; -import cn.lili.modules.message.entity.dos.SmsReach; +import cn.lili.modules.sms.entity.dos.SmsReach; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -9,7 +9,7 @@ import java.util.List; * 短信任务业务层 * * @author Bulbasaur - * @date 2021/1/30 3:19 下午 + * @since 2021/1/30 3:19 下午 */ public interface SmsReachService extends IService { @@ -17,6 +17,7 @@ public interface SmsReachService extends IService { * 添加短信任务 * * @param smsReach 短信签名 + * @param mobile 手机号 */ void addSmsReach(SmsReach smsReach, List mobile); diff --git a/framework/src/main/java/cn/lili/modules/message/service/SmsSignService.java b/framework/src/main/java/cn/lili/modules/sms/service/SmsSignService.java similarity index 88% rename from framework/src/main/java/cn/lili/modules/message/service/SmsSignService.java rename to framework/src/main/java/cn/lili/modules/sms/service/SmsSignService.java index f527d24e..cada47a6 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/SmsSignService.java +++ b/framework/src/main/java/cn/lili/modules/sms/service/SmsSignService.java @@ -1,7 +1,7 @@ -package cn.lili.modules.message.service; +package cn.lili.modules.sms.service; import cn.lili.common.vo.PageVO; -import cn.lili.modules.message.entity.dos.SmsSign; +import cn.lili.modules.sms.entity.dos.SmsSign; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 签名申请业务层 * * @author Bulbasaur - * @date 2021/1/30 3:19 下午 + * @since 2021/1/30 3:19 下午 */ public interface SmsSignService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/message/service/SmsTemplateService.java b/framework/src/main/java/cn/lili/modules/sms/service/SmsTemplateService.java similarity index 89% rename from framework/src/main/java/cn/lili/modules/message/service/SmsTemplateService.java rename to framework/src/main/java/cn/lili/modules/sms/service/SmsTemplateService.java index fc25b636..b2ccf111 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/SmsTemplateService.java +++ b/framework/src/main/java/cn/lili/modules/sms/service/SmsTemplateService.java @@ -1,7 +1,7 @@ -package cn.lili.modules.message.service; +package cn.lili.modules.sms.service; import cn.lili.common.vo.PageVO; -import cn.lili.modules.message.entity.dos.SmsTemplate; +import cn.lili.modules.sms.entity.dos.SmsTemplate; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 签名申请业务层 * * @author Bulbasaur - * @date 2021/1/30 3:19 下午 + * @since 2021/1/30 3:19 下午 */ public interface SmsTemplateService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsReachServiceImpl.java b/framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsReachServiceImpl.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsReachServiceImpl.java rename to framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsReachServiceImpl.java index 620c7077..89187cee 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsReachServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsReachServiceImpl.java @@ -1,16 +1,15 @@ -package cn.lili.modules.message.serviceimpl; +package cn.lili.modules.sms.serviceimpl; import cn.hutool.json.JSONUtil; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.OtherTagsEnum; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.utils.BeanUtil; -import cn.lili.config.rocketmq.RocketmqCustomProperties; -import cn.lili.modules.message.entity.dos.SmsReach; -import cn.lili.modules.message.entity.dto.SmsReachDTO; -import cn.lili.modules.message.mapper.SmsReachMapper; -import cn.lili.modules.message.service.SmsReachService; +import cn.lili.modules.sms.entity.dos.SmsReach; +import cn.lili.modules.sms.entity.dto.SmsReachDTO; +import cn.lili.modules.sms.mapper.SmsReachMapper; +import cn.lili.modules.sms.service.SmsReachService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.OtherTagsEnum; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,25 +21,25 @@ import java.util.List; * 短信任务业务层实现 * * @author Bulbasaur - * @date 2021/1/30 3:19 下午 + * @since 2021/1/30 3:19 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SmsReachServiceImpl extends ServiceImpl implements SmsReachService { - - private final RocketMQTemplate rocketMQTemplate; - private final RocketmqCustomProperties rocketmqCustomProperties; + @Autowired + private RocketMQTemplate rocketMQTemplate; + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; @Override + @Transactional(rollbackFor = Exception.class) public void addSmsReach(SmsReach smsReach,List mobile) { String destination = rocketmqCustomProperties.getNoticeSendTopic() + ":" + OtherTagsEnum.SMS.name(); SmsReachDTO smsReachDTO = new SmsReachDTO(); BeanUtil.copyProperties(smsReach,smsReachDTO); smsReachDTO.setMobile(mobile); this.save(smsReach); - //发送订单变更mq消息 + //发送短信批量发送mq消息 rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(smsReachDTO), RocketmqSendCallbackBuilder.commonCallback()); } diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsSignServiceImpl.java b/framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsSignServiceImpl.java similarity index 66% rename from framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsSignServiceImpl.java rename to framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsSignServiceImpl.java index d77efb5e..6820b3fa 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsSignServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsSignServiceImpl.java @@ -1,19 +1,18 @@ -package cn.lili.modules.message.serviceimpl; +package cn.lili.modules.sms.serviceimpl; -import cn.lili.common.enums.MessageCode; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.sms.AliSmsUtil; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; -import cn.lili.modules.message.entity.dos.SmsSign; -import cn.lili.modules.message.mapper.SmsSignMapper; -import cn.lili.modules.message.service.SmsSignService; +import cn.lili.modules.sms.entity.dos.SmsSign; +import cn.lili.modules.sms.mapper.SmsSignMapper; +import cn.lili.modules.sms.plugin.SmsPluginFactory; +import cn.lili.modules.sms.service.SmsSignService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,71 +23,74 @@ import java.util.Map; /** * 短信签名业务层实现 + * * @author Chopper - * @date 2021/1/30 4:27 下午 + * @since 2021/1/30 4:27 下午 */ +@Slf4j @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SmsSignServiceImpl extends ServiceImpl implements SmsSignService { - - private final AliSmsUtil aliSmsUtil; + @Autowired + private SmsPluginFactory smsPluginFactory; @Override + @Transactional(rollbackFor = Exception.class) public void addSmsSign(SmsSign smsSign) { try { //如果短信签名已存在,不能重复申请 if (this.getOne(new QueryWrapper().eq("sign_name", smsSign.getSignName())) != null) { throw new ServiceException(ResultCode.SMS_SIGN_EXIST_ERROR); } - aliSmsUtil.addSmsSign(smsSign); + smsPluginFactory.smsPlugin().addSmsSign(smsSign); smsSign.setSignStatus(0); this.save(smsSign); } catch (Exception e) { - e.printStackTrace(); + log.error("添加短信签名错误", e); } } @Override + @Transactional(rollbackFor = Exception.class) public void deleteSmsSign(String id) { try { SmsSign smsSign = this.getById(id); if (smsSign != null) { - aliSmsUtil.deleteSmsSign(smsSign.getSignName()); + smsPluginFactory.smsPlugin().deleteSmsSign(smsSign.getSignName()); this.removeById(id); } } catch (Exception e) { - e.printStackTrace(); + log.error("删除短信签名错误", e); } } @Override + @Transactional(rollbackFor = Exception.class) public void querySmsSign() { try { - Map map = new HashMap<>(); + Map map = new HashMap<>(16); //获取未审核通过的签名列表 - List list = list(new LambdaQueryWrapper().eq(SmsSign::getSignStatus, 0)); + List list = list(new LambdaQueryWrapper().ne(SmsSign::getSignStatus, 1)); //查询签名状态 for (SmsSign smsSign : list) { - map = aliSmsUtil.querySmsSign(smsSign.getSignName()); - + map = smsPluginFactory.smsPlugin().querySmsSign(smsSign.getSignName()); smsSign.setSignStatus((Integer) map.get("SignStatus")); smsSign.setReason(map.get("Reason").toString()); this.updateById(smsSign); } } catch (Exception e) { - e.printStackTrace(); + log.error("查询短信签名错误", e); } } @Override + @Transactional(rollbackFor = Exception.class) public void modifySmsSign(SmsSign smsSign) { try { - aliSmsUtil.modifySmsSign(smsSign); + smsPluginFactory.smsPlugin().modifySmsSign(smsSign); this.updateById(smsSign); } catch (Exception e) { - e.printStackTrace(); + log.error("更新短信签名错误", e); } } diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsTemplateServiceImpl.java b/framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsTemplateServiceImpl.java similarity index 68% rename from framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsTemplateServiceImpl.java rename to framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsTemplateServiceImpl.java index 028d417a..8f813b5a 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsTemplateServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/sms/serviceimpl/SmsTemplateServiceImpl.java @@ -1,46 +1,45 @@ -package cn.lili.modules.message.serviceimpl; +package cn.lili.modules.sms.serviceimpl; -import cn.lili.common.sms.AliSmsUtil; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; -import cn.lili.modules.message.entity.dos.SmsTemplate; -import cn.lili.modules.message.mapper.SmsTemplateMapper; -import cn.lili.modules.message.service.SmsTemplateService; +import cn.lili.modules.sms.entity.dos.SmsTemplate; +import cn.lili.modules.sms.mapper.SmsTemplateMapper; +import cn.lili.modules.sms.plugin.SmsPluginFactory; +import cn.lili.modules.sms.service.SmsTemplateService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.HashMap; import java.util.List; import java.util.Map; /** * 短信模板业务层实现 + * * @author Chopper - * @date 2021/1/30 4:27 下午 + * @since 2021/1/30 4:27 下午 */ +@Slf4j @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SmsTemplateServiceImpl extends ServiceImpl implements SmsTemplateService { - private final AliSmsUtil aliSmsUtil; + @Autowired + private SmsPluginFactory smsPluginFactory; @Override public void addSmsTemplate(SmsTemplate smsTemplate) { try { - smsTemplate.setTemplateCode(aliSmsUtil.addSmsTemplate(smsTemplate)); + smsTemplate.setTemplateCode(smsPluginFactory.smsPlugin().addSmsTemplate(smsTemplate)); smsTemplate.setTemplateStatus(0); smsTemplate.setTemplateType(1); this.save(smsTemplate); } catch (Exception e) { - e.printStackTrace(); + log.error("添加短信模板错误", e); } } @@ -49,11 +48,11 @@ public class SmsTemplateServiceImpl extends ServiceImpl map = new HashMap<>(); + Map map; //获取未审核通过的签名列表 List list = list(new LambdaQueryWrapper().eq(SmsTemplate::getTemplateStatus, 0)); //查询签名状态 for (SmsTemplate smsTemplate : list) { - map = aliSmsUtil.querySmsTemplate(smsTemplate.getTemplateName()); + map = smsPluginFactory.smsPlugin().querySmsTemplate(smsTemplate.getTemplateCode()); smsTemplate.setTemplateStatus((Integer) map.get("TemplateStatus")); smsTemplate.setReason(map.get("Reason").toString()); smsTemplate.setTemplateCode(map.get("TemplateCode").toString()); this.updateById(smsTemplate); } } catch (Exception e) { - e.printStackTrace(); + log.error("查询短信模板错误", e); } } @Override public void modifySmsTemplate(SmsTemplate smsTemplate) { try { - aliSmsUtil.modifySmsTemplate(smsTemplate); + smsPluginFactory.smsPlugin().modifySmsTemplate(smsTemplate); smsTemplate.setTemplateStatus(0); this.updateById(smsTemplate); } catch (Exception e) { - e.printStackTrace(); + log.error("重新提交短信模板错误", e); } } diff --git a/framework/src/main/java/cn/lili/modules/statistics/aop/PageViewPoint.java b/framework/src/main/java/cn/lili/modules/statistics/aop/PageViewPoint.java index 0a8cb42a..c97a8109 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/aop/PageViewPoint.java +++ b/framework/src/main/java/cn/lili/modules/statistics/aop/PageViewPoint.java @@ -6,6 +6,9 @@ import java.lang.annotation.*; /** * 埋点统计 + * + * @author Bulbasaur + * @since 2021/7/9 1:47 上午 */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/framework/src/main/java/cn/lili/modules/statistics/aop/aspect/PageViewInterceptor.java b/framework/src/main/java/cn/lili/modules/statistics/aop/aspect/PageViewInterceptor.java index 4044c75c..2c90a85e 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/aop/aspect/PageViewInterceptor.java +++ b/framework/src/main/java/cn/lili/modules/statistics/aop/aspect/PageViewInterceptor.java @@ -1,15 +1,15 @@ package cn.lili.modules.statistics.aop.aspect; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.context.ThreadContextHolder; +import cn.lili.common.utils.IpUtils; import cn.lili.common.utils.SpelUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.connect.util.IpUtils; import cn.lili.modules.goods.entity.vos.GoodsSkuVO; import cn.lili.modules.statistics.aop.PageViewPoint; import cn.lili.modules.statistics.aop.enums.PageViewEnum; import cn.lili.modules.statistics.util.StatisticsSuffix; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; @@ -18,7 +18,6 @@ import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; -import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; @@ -27,17 +26,16 @@ import java.util.Map; * 页面浏览统计拦截 * * @author Chopper - * @date 2021-01-14 18:01 + * @since 2021-01-14 18:01 */ @Aspect @Configuration @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PageViewInterceptor { - private final Cache cache; + @Autowired + private Cache cache; - private final HttpServletRequest request; @AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.statistics.aop.PageViewPoint)") @@ -54,23 +52,25 @@ public class PageViewInterceptor { switch (pageViewEnum) { case SKU: ResultMessage> skuRvt = (ResultMessage>) rvt; - GoodsSkuVO goodsSkuDetail = (GoodsSkuVO) skuRvt.getResult().get("data"); - storeId = goodsSkuDetail.getStoreId(); - goodsId = goodsSkuDetail.getGoodsId(); - break; + if (skuRvt != null && skuRvt.getResult() != null && skuRvt.getResult().containsKey("data")) { + GoodsSkuVO goodsSkuDetail = (GoodsSkuVO) skuRvt.getResult().get("data"); + storeId = goodsSkuDetail.getStoreId(); + goodsId = goodsSkuDetail.getGoodsId(); + break; + } case STORE: - Map map = spelFormat(point); + Map map = null; + try { + map = spelFormat(point); + } catch (Exception e) { + return; + } storeId = map.get("id"); break; default: storeId = "-1"; } - String ip = IpUtils.getIpAddress(request); -// //如果用户不为空,则ip后追加用户id,这样一个用户多个ip登录,可以被多次记录访客数 -// if (UserContext.getCurrentUser() != null) { -// ip += UserContext.getCurrentUser().getId(); -// } - + String ip = IpUtils.getIpAddress(ThreadContextHolder.getHttpRequest()); try { //PV 统计48小时过期 留下一定时间予以统计累计数据库 cache.incr(CachePrefix.PV.getPrefix() + StatisticsSuffix.suffix(), 60 * 60 * 48); @@ -84,7 +84,7 @@ public class PageViewInterceptor { //店铺UV 统计,则需要对id去重复,所以如下处理 cache.cumulative(CachePrefix.STORE_UV.getPrefix() + StatisticsSuffix.suffix(storeId), ip); } catch (Exception e) { - e.printStackTrace(); + log.error("页面出错", e); } } @@ -98,7 +98,7 @@ public class PageViewInterceptor { */ private static Map spelFormat(JoinPoint joinPoint) { - Map result = new HashMap<>(); + Map result = new HashMap<>(2); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); PageViewPoint pageViewPoint = signature.getMethod().getAnnotation(PageViewPoint.class); String id = SpelUtil.compileParams(joinPoint, pageViewPoint.id()); diff --git a/framework/src/main/java/cn/lili/modules/statistics/aop/enums/PageViewEnum.java b/framework/src/main/java/cn/lili/modules/statistics/aop/enums/PageViewEnum.java index fb89dd0f..e823bf72 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/aop/enums/PageViewEnum.java +++ b/framework/src/main/java/cn/lili/modules/statistics/aop/enums/PageViewEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.statistics.aop.enums; * 统计页面类型 * * @author Chopper - * @date 2021-01-14 17:55 + * @since 2021-01-14 17:55 */ public enum PageViewEnum { /** diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/dos/MemberStatisticsData.java b/framework/src/main/java/cn/lili/modules/statistics/entity/dos/MemberStatisticsData.java similarity index 51% rename from framework/src/main/java/cn/lili/modules/statistics/model/dos/MemberStatisticsData.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/dos/MemberStatisticsData.java index 0d02c6a0..ad6df23d 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/dos/MemberStatisticsData.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/dos/MemberStatisticsData.java @@ -1,52 +1,39 @@ -package cn.lili.modules.statistics.model.dos; +package cn.lili.modules.statistics.entity.dos; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 会员统计 + * * @author Chopper - * @date 2020/11/17 7:34 下午 + * @since 2020/11/17 7:34 下午 */ @Data -@Entity -@Table(name = "li_member_statistics_data") @TableName("li_member_statistics_data") @ApiModel(value = "会员统计") -public class MemberStatisticsData { +public class MemberStatisticsData extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @ApiModelProperty(value = "统计日") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") private Date createDate; @ApiModelProperty(value = "当前会员数量") - private Integer memberCount; + private Long memberCount; @ApiModelProperty(value = "新增会员数量") - private Integer newlyAdded; + private Long newlyAdded; @ApiModelProperty(value = "当日活跃数量") - private Integer activeQuantity; + private Long activeQuantity; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/dos/PlatformViewData.java b/framework/src/main/java/cn/lili/modules/statistics/entity/dos/PlatformViewData.java similarity index 53% rename from framework/src/main/java/cn/lili/modules/statistics/model/dos/PlatformViewData.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/dos/PlatformViewData.java index c82beed6..04d92765 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/dos/PlatformViewData.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/dos/PlatformViewData.java @@ -1,39 +1,25 @@ -package cn.lili.modules.statistics.model.dos; +package cn.lili.modules.statistics.entity.dos; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 平台pv统计 * * @author Chopper - * @date 2020-06-19 17:50 + * @since 2020-06-19 17:50 */ @Data -@Entity -@Table(name = "li_s_platform_view_data") @TableName("li_s_platform_view_data") @ApiModel(value = "平台pv统计") -public class PlatformViewData { +public class PlatformViewData extends BaseIdEntity { - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @ApiModelProperty(value = "pv数量") private Long pvNum; diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/dto/GoodsStatisticsQueryParam.java b/framework/src/main/java/cn/lili/modules/statistics/entity/dto/GoodsStatisticsQueryParam.java similarity index 80% rename from framework/src/main/java/cn/lili/modules/statistics/model/dto/GoodsStatisticsQueryParam.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/dto/GoodsStatisticsQueryParam.java index 03c0190f..f666faba 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/dto/GoodsStatisticsQueryParam.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/dto/GoodsStatisticsQueryParam.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.dto; +package cn.lili.modules.statistics.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 商品统计查询参数 * * @author Chopper - * @date 2020/11/17 7:34 下午 + * @since 2020/11/17 7:34 下午 */ @Data public class GoodsStatisticsQueryParam extends StatisticsQueryParam { diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/dto/StatisticsQueryParam.java b/framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java similarity index 89% rename from framework/src/main/java/cn/lili/modules/statistics/model/dto/StatisticsQueryParam.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java index f0f57018..37b985e8 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/dto/StatisticsQueryParam.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.dto; +package cn.lili.modules.statistics.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 统计查询参数 * * @author Bulbasaur - * @date 2020/12/9 14:20 + * @since 2020/12/9 14:20 */ @Data public class StatisticsQueryParam { diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/enums/SearchTypeEnum.java b/framework/src/main/java/cn/lili/modules/statistics/entity/enums/SearchTypeEnum.java similarity index 81% rename from framework/src/main/java/cn/lili/modules/statistics/model/enums/SearchTypeEnum.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/enums/SearchTypeEnum.java index 22850d5b..a7854cc2 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/enums/SearchTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/enums/SearchTypeEnum.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.enums; +package cn.lili.modules.statistics.entity.enums; /** * 搜索类型 diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/enums/StatisticsQuery.java b/framework/src/main/java/cn/lili/modules/statistics/entity/enums/StatisticsQuery.java similarity index 78% rename from framework/src/main/java/cn/lili/modules/statistics/model/enums/StatisticsQuery.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/enums/StatisticsQuery.java index bf001aa2..68aee0d6 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/enums/StatisticsQuery.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/enums/StatisticsQuery.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.enums; +package cn.lili.modules.statistics.entity.enums; /** * 统计查询 diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/enums/TimeTypeEnum.java b/framework/src/main/java/cn/lili/modules/statistics/entity/enums/TimeTypeEnum.java similarity index 81% rename from framework/src/main/java/cn/lili/modules/statistics/model/enums/TimeTypeEnum.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/enums/TimeTypeEnum.java index 8b131641..abc94b1e 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/enums/TimeTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/enums/TimeTypeEnum.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.enums; +package cn.lili.modules.statistics.entity.enums; /** * 时间类型 diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/CategoryStatisticsDataVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/CategoryStatisticsDataVO.java similarity index 86% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/CategoryStatisticsDataVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/CategoryStatisticsDataVO.java index b05c7745..bcc41996 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/CategoryStatisticsDataVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/CategoryStatisticsDataVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 分类统计VO * * @author Bulbasaur - * @date 2020/12/10 15:42 + * @since 2020/12/10 15:42 */ @Data public class CategoryStatisticsDataVO { diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/GoodsStatisticsDataVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/GoodsStatisticsDataVO.java similarity index 86% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/GoodsStatisticsDataVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/GoodsStatisticsDataVO.java index 169d82e5..e8cad939 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/GoodsStatisticsDataVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/GoodsStatisticsDataVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 商品统计VO * * @author Bulbasaur - * @date 2020/12/9 14:25 + * @since 2020/12/9 14:25 */ @Data public class GoodsStatisticsDataVO { diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/IndexNoticeVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/IndexNoticeVO.java similarity index 66% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/IndexNoticeVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/IndexNoticeVO.java index e9956bf7..beca7f8d 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/IndexNoticeVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/IndexNoticeVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,27 +7,27 @@ import lombok.Data; * 消息提示 * * @author Bulbasaur - * @date 2020/12/9 14:25 + * @since 2020/12/9 14:25 */ @Data public class IndexNoticeVO { @ApiModelProperty(value = "待处理商品审核") - private Integer goods; + private Long goods; @ApiModelProperty(value = "待处理店铺入驻审核") - private Integer store; + private Long store; @ApiModelProperty(value = "待处理售后申请") - private Integer refund; + private Long refund; @ApiModelProperty(value = "待处理投诉审核") - private Integer complain; + private Long complain; @ApiModelProperty(value = "待处理分销员提现申请") - private Integer distributionCash; + private Long distributionCash; @ApiModelProperty(value = "待处理商家结算") - private Integer waitPayBill; + private Long waitPayBill; } diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/IndexStatisticsVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/IndexStatisticsVO.java similarity index 77% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/IndexStatisticsVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/IndexStatisticsVO.java index 2064a11c..3e5645a1 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/IndexStatisticsVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/IndexStatisticsVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,19 +7,19 @@ import lombok.Data; * 首页统计内容 * * @author Bulbasaur - * @date 2020/12/22 14:23 + * @since 2020/12/22 14:23 */ @Data public class IndexStatisticsVO { @ApiModelProperty(value = "订单总数量") - private Integer orderNum; + private Long orderNum; @ApiModelProperty(value = "商品总数量") - private Integer goodsNum; + private Long goodsNum; @ApiModelProperty(value = "会员总数量") - private Integer memberNum; + private Long memberNum; @ApiModelProperty(value = "店铺总数量") - private Integer storeNum; + private Long storeNum; /** * 流量概括 @@ -41,15 +41,13 @@ public class IndexStatisticsVO { @ApiModelProperty(value = "今日下单金额") private Double todayOrderPrice; @ApiModelProperty(value = "今日新增会员数量") - private Integer todayMemberNum; + private Long todayMemberNum; @ApiModelProperty(value = "今日新增商品数量") - private Integer todayGoodsNum; + private Long todayGoodsNum; @ApiModelProperty(value = "今日新增店铺数量") - private Integer todayStoreNum; + private Long todayStoreNum; @ApiModelProperty(value = "今日新增评论数量") - private Integer todayMemberEvaluation; - - //当前在线人数 + private Long todayMemberEvaluation; @ApiModelProperty(value = "当前在线人数") private Long currentNumberPeopleOnline; } diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/OnlineMemberVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/OnlineMemberVO.java similarity index 54% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/OnlineMemberVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/OnlineMemberVO.java index ecad5579..bd20847b 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/OnlineMemberVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/OnlineMemberVO.java @@ -1,8 +1,9 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.Date; @@ -10,17 +11,27 @@ import java.util.Date; * 在线会员 * * @author Chopper - * @date 2021-02-21 09:59 + * @since 2021-02-21 09:59 */ @Data @AllArgsConstructor +@NoArgsConstructor public class OnlineMemberVO { - //在线时间 + /** + * 在线时间 + */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH") private Date date; - //在线会员人数 + /** + * 在线会员人数 + */ private Integer num; + /** + * 上一周期在线会员人数 + */ + private Integer lastNum; + } diff --git a/framework/src/main/java/cn/lili/modules/statistics/entity/vo/OrderOverviewVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/OrderOverviewVO.java new file mode 100644 index 00000000..3bf8f8b4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/OrderOverviewVO.java @@ -0,0 +1,126 @@ +package cn.lili.modules.statistics.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单统计概述 + * + * @author Chopper + * @since 2021-03-03 10:27 + */ +@Data +public class OrderOverviewVO { + + @ApiModelProperty(value = "UV人次") + private Long uvNum; + + /** + * 下单统计 + */ + @ApiModelProperty(value = "下单数量") + private Long orderNum; + + @ApiModelProperty(value = "下单人数") + private Long orderMemberNum; + + @ApiModelProperty(value = "下单金额") + private Double orderAmount; + + /** + * 付款统计 + */ + @ApiModelProperty(value = "付款订单数量") + private Long paymentOrderNum; + + @ApiModelProperty(value = "付款人数") + private Long paymentsNum; + + @ApiModelProperty(value = "付款金额") + private Double paymentAmount; + + + /** + * 退单统计 + */ + @ApiModelProperty(value = "退单笔数") + private Long refundOrderNum; + + @ApiModelProperty(value = "退单金额") + private Double refundOrderPrice; + + /** + * 转换率 + */ + @ApiModelProperty(value = "下单转换率") + private String orderConversionRate; + + @ApiModelProperty(value = "付款转换率") + private String paymentsConversionRate; + + @ApiModelProperty(value = "整体转换率") + private String overallConversionRate; + + public Long getUvNum() { + if (uvNum == null) { + return 0L; + } + return uvNum; + } + + public Long getOrderNum() { + if (orderNum == null) { + return 0L; + } + return orderNum; + } + + public Long getOrderMemberNum() { + if (orderMemberNum == null) { + return 0L; + } + return orderMemberNum; + } + + public Double getOrderAmount() { + if (orderAmount == null) { + return 0D; + } + return orderAmount; + } + + public Long getPaymentOrderNum() { + if (paymentOrderNum == null) { + return 0L; + } + return paymentOrderNum; + } + + public Long getPaymentsNum() { + if (paymentsNum == null) { + return 0L; + } + return paymentsNum; + } + + public Double getPaymentAmount() { + if (paymentAmount == null) { + return 0D; + } + return paymentAmount; + } + + public Long getRefundOrderNum() { + if (refundOrderNum == null) { + return 0L; + } + return refundOrderNum; + } + + public Double getRefundOrderPrice() { + if (refundOrderPrice == null) { + return 0D; + } + return refundOrderPrice; + } +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/OrderStatisticsDataVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/OrderStatisticsDataVO.java similarity index 91% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/OrderStatisticsDataVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/OrderStatisticsDataVO.java index 01b2e4ca..c349d471 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/OrderStatisticsDataVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/OrderStatisticsDataVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; @@ -11,7 +11,7 @@ import java.util.Date; * 订单统计数据VO * * @author Bulbasaur - * @date 2020/12/9 17:13 + * @since 2020/12/9 17:13 */ @Data public class OrderStatisticsDataVO { diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/PlatformViewVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/PlatformViewVO.java similarity index 93% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/PlatformViewVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/PlatformViewVO.java index 64ba5320..2e8486bc 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/PlatformViewVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/PlatformViewVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; @@ -10,7 +10,7 @@ import java.util.Date; * 流量数据展示VO * * @author Chopper - * @date 2020-06-19 17:50 + * @since 2020-06-19 17:50 */ @Data public class PlatformViewVO { diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/RefundOrderStatisticsDataVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/RefundOrderStatisticsDataVO.java similarity index 89% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/RefundOrderStatisticsDataVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/RefundOrderStatisticsDataVO.java index 30512db4..2920ae03 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/RefundOrderStatisticsDataVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/RefundOrderStatisticsDataVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 退款统计VO * * @author Bulbasaur - * @date 2020/12/10 11:24 + * @since 2020/12/10 11:24 */ @Data public class RefundOrderStatisticsDataVO { diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/StoreIndexStatisticsVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/StoreIndexStatisticsVO.java similarity index 67% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/StoreIndexStatisticsVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/StoreIndexStatisticsVO.java index 1b9b025d..9d2da2ae 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/StoreIndexStatisticsVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/StoreIndexStatisticsVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,13 +7,13 @@ import lombok.Data; * 店铺首页数据 * * @author Chopper - * @date 2021/3/17 4:04 下午 + * @since 2021/3/17 4:04 下午 */ @Data public class StoreIndexStatisticsVO { @ApiModelProperty(value = "商品总数量") - private Integer goodsNum; + private Long goodsNum; @ApiModelProperty(value = "订单总数量") private Integer orderNum; @ApiModelProperty(value = "订单总额") @@ -22,30 +22,33 @@ public class StoreIndexStatisticsVO { private Integer storeUV; @ApiModelProperty(value = "待付款订单数量") - private Integer unPaidOrder; + private Long unPaidOrder; @ApiModelProperty(value = "待发货订单数量") - private Integer unDeliveredOrder; + private Long unDeliveredOrder; @ApiModelProperty(value = "待收货订单数量") - private Integer deliveredOrder; + private Long deliveredOrder; @ApiModelProperty(value = "待处理退货数量") - private Integer returnGoods; + private Long returnGoods; @ApiModelProperty(value = "待处理退款数量") - private Integer returnMoney; + private Long returnMoney; @ApiModelProperty(value = "待回复评价数量") - private Integer memberEvaluation; + private Long memberEvaluation; @ApiModelProperty(value = "待处理交易投诉数量") - private Integer complaint; + private Long complaint; @ApiModelProperty(value = "待上架商品数量") - private Integer waitUpper; + private Long waitUpper; @ApiModelProperty(value = "待审核商品数量") - private Integer waitAuth; + private Long waitAuth; @ApiModelProperty(value = "可参与秒杀活动数量") - private Integer seckillNum; + private Long seckillNum; @ApiModelProperty(value = "未对账结算单数量") - private Integer waitPayBill; + private Long waitPayBill; + + @ApiModelProperty(value = "待自提数量") + private Long selfPickNum; } diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/StoreStatisticsDataVO.java b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/StoreStatisticsDataVO.java similarity index 86% rename from framework/src/main/java/cn/lili/modules/statistics/model/vo/StoreStatisticsDataVO.java rename to framework/src/main/java/cn/lili/modules/statistics/entity/vo/StoreStatisticsDataVO.java index 14f6c306..88f99211 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/StoreStatisticsDataVO.java +++ b/framework/src/main/java/cn/lili/modules/statistics/entity/vo/StoreStatisticsDataVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.statistics.model.vo; +package cn.lili.modules.statistics.entity.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.Data; * 商品统计VO * * @author Bulbasaur - * @date 2020/12/9 14:25 + * @since 2020/12/9 14:25 */ @Data public class StoreStatisticsDataVO { diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/AfterSaleStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/AfterSaleStatisticsMapper.java new file mode 100644 index 00000000..5a6437eb --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/AfterSaleStatisticsMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 售后统计数据处理层 + * + * @author Bulbasaur + * @since 2020/11/17 7:34 下午 + */ +public interface AfterSaleStatisticsMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/BillStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/BillStatisticsMapper.java new file mode 100644 index 00000000..6a1f2cc2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/BillStatisticsMapper.java @@ -0,0 +1,56 @@ +package cn.lili.modules.statistics.mapper; + + +import cn.lili.modules.store.entity.dos.Bill; +import cn.lili.modules.store.entity.vos.BillListVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 结算单数据处理层 + * + * @author Chopper + * @since 2020/11/17 4:27 下午 + */ +public interface BillStatisticsMapper extends BaseMapper { + + /** + * 查询结算单分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 结算单分页 + */ + @Select("select b.id,b.sn,b.start_time,b.end_time,b.bill_status,b.store_name,b.bill_price,b.create_time from li_bill as b ${ew.customSqlSegment}") + IPage queryBillPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询订单结算 + * + * @param queryWrapper 查询条件 + * @return 结算单 + */ + @Select("SELECT SUM( final_price ) AS orderPrice,SUM( commission_price ) AS commissionPrice" + + ",SUM( distribution_rebate ) AS distributionCommission,SUM( site_coupon_commission ) AS siteCouponCommission" + + ",SUM( point_settlement_price ) AS pointSettlementPrice " + + ",SUM( kanjia_settlement_price ) AS kanjiaSettlementPrice " + + ",SUM( bill_price ) AS billPrice " + + "FROM li_store_flow ${ew.customSqlSegment}") + Bill getOrderBill(@Param(Constants.WRAPPER) QueryWrapper queryWrapper); + + /** + * 查询退款结算单 + * + * @param queryWrapper 查询条件 + * @return 结算单 + */ + @Select("SELECT SUM( final_price ) AS refundPrice,SUM( commission_price ) AS refundCommissionPrice" + + ",SUM( distribution_rebate ) AS distributionRefundCommission,SUM( site_coupon_commission ) AS siteCouponRefundCommission" + + ",SUM( bill_price ) AS billPrice FROM li_store_flow ${ew.customSqlSegment}") + Bill getRefundBill(@Param(Constants.WRAPPER) QueryWrapper queryWrapper); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/DistributionCashStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/DistributionCashStatisticsMapper.java new file mode 100644 index 00000000..4506aeb3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/DistributionCashStatisticsMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.distribution.entity.dos.DistributionCash; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 分销佣金数据统计 + * + * @author pikachu + * @since 2020-03-26 18:45:56 + */ +public interface DistributionCashStatisticsMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/GoodsStatisticsDataMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/GoodsStatisticsDataMapper.java deleted file mode 100644 index 0f691763..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/mapper/GoodsStatisticsDataMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.lili.modules.statistics.mapper; - -import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.statistics.model.vo.CategoryStatisticsDataVO; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - * 商品统计数据处理层 - * - * @author Bulbasaur - * @date 2020/11/17 7:34 下午 - */ -public interface GoodsStatisticsDataMapper extends BaseMapper { - - //商品统计 - @Select("SELECT goods_id,goods_name,SUM(final_price) AS price,SUM(num) AS num FROM li_store_flow ${ew.customSqlSegment}") - List getGoodsStatisticsData(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - - //分类统计 - @Select("SELECT category_id,category_name,SUM(price) AS price,SUM(num) AS num FROM li_store_flow ${ew.customSqlSegment}") - List getCateGoryStatisticsData(@Param(Constants.WRAPPER) Wrapper queryWrapper); -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/GoodsStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/GoodsStatisticsMapper.java new file mode 100644 index 00000000..ae685686 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/GoodsStatisticsMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.goods.entity.dos.Goods; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 商品统计数据处理层 + * + * @author Bulbasaur + * @since 2020/11/17 7:34 下午 + */ +public interface GoodsStatisticsMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberEvaluationStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberEvaluationStatisticsMapper.java new file mode 100644 index 00000000..4fe62595 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberEvaluationStatisticsMapper.java @@ -0,0 +1,64 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.member.entity.dos.MemberEvaluation; +import cn.lili.modules.member.entity.vo.MemberEvaluationListVO; +import cn.lili.modules.member.entity.vo.StoreRatingVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * 会员商品评价数据处理层 + * + * @author Bulbasaur + * @since 2020-02-25 14:10:16 + */ +public interface MemberEvaluationStatisticsMapper extends BaseMapper { + + + /** + * 会员评价分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 会员评价分页 + */ + @Select("select me.* from li_member_evaluation as me ${ew.customSqlSegment}") + IPage getMemberEvaluationList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 评价数量 + * + * @param goodsId 商品ID + * @return 会员评价 + */ + @Select("select grade,count(1) as num from li_member_evaluation Where goods_id=#{goodsId} and status='OPEN' GROUP BY grade") + List> getEvaluationNumber(String goodsId); + + /** + * 获取店铺评分 + * + * @param queryWrapper 查询条件 + * @return 店铺评分 + */ + @Select("SELECT round( AVG( delivery_score ), 2 ) AS delivery_score" + + ",round( AVG( description_score ), 2 ) AS description_score" + + ",round( AVG( service_score ), 2 ) AS service_score " + + "FROM li_member_evaluation ${ew.customSqlSegment}") + StoreRatingVO getStoreRatingVO(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 商品会员评价数量 + * + * @param queryWrapper 查询条件 + * @return 评价数量 + */ + @Select("SELECT goods_id,COUNT(goods_id) AS num FROM li_member_evaluation GROUP BY goods_id") + List> memberEvaluationNum(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberStatisticsDataMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberStatisticsDataMapper.java deleted file mode 100644 index 62673999..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberStatisticsDataMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.lili.modules.statistics.mapper; - -import cn.lili.modules.statistics.model.dos.MemberStatisticsData; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -/** - * 会员统计数据处理层 - * - * @author Bulbasaur - * @date 2020/11/17 7:34 下午 - */ -public interface MemberStatisticsDataMapper extends BaseMapper { - - - @Select("SELECT COUNT(0) FROM li_member ${ew.customSqlSegment}") - Integer customSqlQuery(@Param(Constants.WRAPPER) Wrapper queryWrapper); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberStatisticsMapper.java new file mode 100644 index 00000000..e578425d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/MemberStatisticsMapper.java @@ -0,0 +1,37 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.member.entity.vo.MemberDistributionVO; +import cn.lili.modules.statistics.entity.dos.MemberStatisticsData; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 会员统计数据处理层 + * + * @author Bulbasaur + * @since 2020/11/17 7:34 下午 + */ +public interface MemberStatisticsMapper extends BaseMapper { + + /** + * 获取会员统计数量 + * + * @param queryWrapper 查询条件 + * @return 会员统计数量 + */ + @Select("SELECT COUNT(0) FROM li_member ${ew.customSqlSegment}") + long customSqlQuery(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + /** + * 获取会员分布列表 + * @return 会员分布列表 + */ + @Select("select client_enum,count(0) as num from li_member group by client_enum") + List distribution(); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderComplaintStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderComplaintStatisticsMapper.java new file mode 100644 index 00000000..0b1d1637 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderComplaintStatisticsMapper.java @@ -0,0 +1,13 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.order.order.entity.dos.OrderComplaint; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 订单投诉数据处理层 + * + * @author paulG + * @since 2020/12/5 + **/ +public interface OrderComplaintStatisticsMapper extends BaseMapper { +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderStatisticsDataMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderStatisticsDataMapper.java deleted file mode 100644 index 894fba0b..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderStatisticsDataMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.lili.modules.statistics.mapper; - -import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.statistics.model.vo.OrderStatisticsDataVO; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - * 订单统计数据处理层 - * - * @author Bulbasaur - * @date 2020/11/17 7:34 下午 - */ -public interface OrderStatisticsDataMapper extends BaseMapper { - - @Select("SELECT DATE_FORMAT(create_time,'%Y-%m-%d') AS create_time,sum(flow_price) AS price FROM li_order " + - " ${ew.customSqlSegment}") - List getOrderStatisticsData(@Param(Constants.WRAPPER) Wrapper queryWrapper); - - @Select("SELECT count(0) FROM li_order ${ew.customSqlSegment}") - Integer count(@Param(Constants.WRAPPER) Wrapper queryWrapper); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderStatisticsMapper.java new file mode 100644 index 00000000..f1fff3c1 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/OrderStatisticsMapper.java @@ -0,0 +1,63 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; +import cn.lili.modules.statistics.entity.vo.OrderStatisticsDataVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 订单统计数据处理层 + * + * @author Bulbasaur + * @since 2020/11/17 7:34 下午 + */ +public interface OrderStatisticsMapper extends BaseMapper { + + /** + * 获取订单统计数据 + * + * @param queryWrapper 查询条件 + * @return 订单统计列表 + */ + @Select("SELECT DATE_FORMAT(create_time,'%Y-%m-%d') AS create_time,sum(flow_price) AS price FROM li_order " + + " ${ew.customSqlSegment}") + List getOrderStatisticsData(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 订单数量 + * + * @param queryWrapper 查询条件 + * @return 订单数量 + */ + @Select("SELECT count(0) FROM li_order ${ew.customSqlSegment}") + Integer count(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询订单简短信息分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 简短订单分页 + */ + @Select("select o.sn,o.flow_price,o.create_time,o.order_status,o.pay_status,o.payment_method,o.payment_time,o.member_name,o.store_name as store_name,o.store_id as store_id,o.client_type,o.order_type,o.deliver_status " + + ",GROUP_CONCAT(oi.goods_id) as group_goods_id," + + " GROUP_CONCAT(oi.sku_id) as group_sku_id," + + " GROUP_CONCAT(oi.num) as group_num" + + ",GROUP_CONCAT(oi.image) as group_images" + + ",GROUP_CONCAT(oi.goods_name) as group_name " + + ",GROUP_CONCAT(oi.after_sale_status) as group_after_sale_status" + + ",GROUP_CONCAT(oi.complain_status) as group_complain_status" + + ",GROUP_CONCAT(oi.comment_status) as group_comment_status" + + ",GROUP_CONCAT(oi.sn) as group_order_items_sn " + + ",GROUP_CONCAT(oi.goods_price) as group_goods_price " + + " FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ") + IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/PlatformViewDataMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/PlatformViewMapper.java similarity index 64% rename from framework/src/main/java/cn/lili/modules/statistics/mapper/PlatformViewDataMapper.java rename to framework/src/main/java/cn/lili/modules/statistics/mapper/PlatformViewMapper.java index b52ff7e6..6eeea405 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/mapper/PlatformViewDataMapper.java +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/PlatformViewMapper.java @@ -1,6 +1,6 @@ package cn.lili.modules.statistics.mapper; -import cn.lili.modules.statistics.model.dos.PlatformViewData; +import cn.lili.modules.statistics.entity.dos.PlatformViewData; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.Constants; @@ -11,10 +11,15 @@ import org.apache.ibatis.annotations.Select; * 平台流量数据 * * @author Bulbasaur - * @date 2020/11/17 7:34 下午 + * @since 2020/11/17 7:34 下午 */ -public interface PlatformViewDataMapper extends BaseMapper { - //UV流量统计 +public interface PlatformViewMapper extends BaseMapper { + /** + * UV流量统计 + * + * @param queryWrapper 查询条件 + * @return UV流量统计数量 + */ @Select("SELECT sum(uv_num) FROM li_s_platform_view_data ${ew.customSqlSegment}") Integer count(@Param(Constants.WRAPPER) QueryWrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/RefundOrderStatisticsDataMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/RefundOrderStatisticsMapper.java similarity index 70% rename from framework/src/main/java/cn/lili/modules/statistics/mapper/RefundOrderStatisticsDataMapper.java rename to framework/src/main/java/cn/lili/modules/statistics/mapper/RefundOrderStatisticsMapper.java index 1cd4d80d..035a0fb3 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/mapper/RefundOrderStatisticsDataMapper.java +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/RefundOrderStatisticsMapper.java @@ -1,7 +1,7 @@ package cn.lili.modules.statistics.mapper; import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.statistics.model.vo.RefundOrderStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.RefundOrderStatisticsDataVO; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -13,10 +13,17 @@ import org.apache.ibatis.annotations.Select; * 退款统计数据处理层 * * @author Bulbasaur - * @date 2020/12/10 11:22 + * @since 2020/12/10 11:22 */ -public interface RefundOrderStatisticsDataMapper extends BaseMapper { +public interface RefundOrderStatisticsMapper extends BaseMapper { + /** + * 退款统计 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 退款统计分页 + */ @Select("SELECT refund_sn,store_name,member_name,name,specs,final_price FROM li_store_flow ${ew.customSqlSegment}") IPage getRefundStatisticsData(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/SeckillStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/SeckillStatisticsMapper.java new file mode 100644 index 00000000..d191dacd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/SeckillStatisticsMapper.java @@ -0,0 +1,13 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.promotion.entity.dos.Seckill; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 秒杀活动统计 + * + * @author Chopper + * @since 2020/8/21 + */ +public interface SeckillStatisticsMapper extends BaseMapper { +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreFlowStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreFlowStatisticsMapper.java new file mode 100644 index 00000000..19dbc6f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreFlowStatisticsMapper.java @@ -0,0 +1,81 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.statistics.entity.vo.CategoryStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.GoodsStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.StoreStatisticsDataVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +/** + * 商品统计数据处理层 + * + * @author Bulbasaur + * @since 2020/11/17 7:34 下午 + */ +public interface StoreFlowStatisticsMapper extends BaseMapper { + + /** + * 商品统计 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 商品统计列表 + */ + @Select("SELECT goods_id,goods_name,SUM(final_price) AS price,SUM(num) AS num FROM li_store_flow ${ew.customSqlSegment}") + List getGoodsStatisticsData(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分类统计 + * + * @param queryWrapper 查询条件 + * @return 分类统计列表 + */ + @Select("SELECT category_id,category_name,SUM(price) AS price,SUM(num) AS num FROM li_store_flow ${ew.customSqlSegment}") + List getCateGoryStatisticsData(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + /** + * 店铺统计列表 + * + * @param page 分页 + * @param queryWrapper 查询参数 + * @return 店铺统计列表 + */ + @Select("SELECT store_id AS storeId,store_name AS storeName,SUM(final_price) AS price,SUM(num) AS num FROM li_store_flow ${ew.customSqlSegment}") + List getStoreStatisticsData(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 店铺统计付款人数 + * + * @param storeId 店铺id + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 付款人数 + */ + @Select("SELECT count(0) AS num FROM (SELECT count(0) FROM li_store_flow " + + " where store_id = #{storeId} and flow_type='PAY' and create_time >=#{startTime} and create_time < #{endTime}" + + " GROUP BY member_id) t") + Long countPayersByStore(String storeId, Date startTime, Date endTime); + + /** + * 统计付款人数 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 付款人数 + */ + @Select("SELECT count(0) AS num FROM (SELECT count(0) FROM li_store_flow " + + " where flow_type='PAY' and create_time >=#{startTime} and create_time < #{endTime}" + + " GROUP BY member_id) t") + Long countPayers(Date startTime, Date endTime); + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreStatisticsDataMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreStatisticsDataMapper.java deleted file mode 100644 index bc8dd21b..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreStatisticsDataMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.lili.modules.statistics.mapper; - -import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import cn.lili.modules.statistics.model.vo.StoreStatisticsDataVO; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - * 店铺统计数据处理层 - * - * @author Bulbasaur - * @date 2020/11/17 7:34 下午 - */ -public interface StoreStatisticsDataMapper extends BaseMapper { - - @Select("SELECT store_id AS storeId,store_name AS storeName,SUM(final_price) AS price,SUM(num) AS num FROM li_store_flow ${ew.customSqlSegment}") - List getStoreStatisticsData(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreStatisticsMapper.java b/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreStatisticsMapper.java new file mode 100644 index 00000000..6404593a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/mapper/StoreStatisticsMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.statistics.mapper; + +import cn.lili.modules.store.entity.dos.Store; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 店铺统计数据处理层 + * + * @author Bulbasaur + * @since 2020/11/17 7:34 下午 + */ +public interface StoreStatisticsMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/model/vo/OrderOverviewVO.java b/framework/src/main/java/cn/lili/modules/statistics/model/vo/OrderOverviewVO.java deleted file mode 100644 index cae22f65..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/model/vo/OrderOverviewVO.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.lili.modules.statistics.model.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 订单统计概述 - * - * @author Chopper - * @date 2021-03-03 10:27 - */ -@Data -public class OrderOverviewVO { - - @ApiModelProperty(value = "UV人次") - private Integer uvNum; - - //下单统计 - @ApiModelProperty(value = "下单数量") - private Long orderNum; - - @ApiModelProperty(value = "下单人数") - private Long orderMemberNum; - - @ApiModelProperty(value = "下单金额") - private Double orderAmount; - - //付款统计 - @ApiModelProperty(value = "付款订单数量") - private Long paymentOrderNum; - - @ApiModelProperty(value = "付款人数") - private Long paymentsNum; - - @ApiModelProperty(value = "付款金额") - private Double paymentAmount; - - - //退单统计 - @ApiModelProperty(value = "退单笔数") - private Long refundOrderNum; - - @ApiModelProperty(value = "退单金额") - private Double refundOrderPrice; - - // 转换率 - @ApiModelProperty(value = "下单转换率") - private String orderConversionRate; - - @ApiModelProperty(value = "付款转换率") - private String paymentsConversionRate; - - @ApiModelProperty(value = "整体转换率") - private String overallConversionRate; - - -} diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/AfterSaleStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/AfterSaleStatisticsService.java new file mode 100644 index 00000000..d1c11230 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/AfterSaleStatisticsService.java @@ -0,0 +1,33 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 售后统计业务层 + * + * @author Bulbasaur + * @since 2020/12/9 11:06 + */ +public interface AfterSaleStatisticsService extends IService { + + /** + * 获取待处理售后数量 + * + * @param serviceType 售后类型 + * @return 待处理售后数量 + */ + long applyNum(String serviceType); + + /** + * 获取统计的售后 + * + * @param statisticsQueryParam 统计搜索参数 + * @param pageVO 分页 + * @return 售后分页列表 + */ + IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/BillStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/BillStatisticsService.java new file mode 100644 index 00000000..07d6ea3f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/BillStatisticsService.java @@ -0,0 +1,22 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.store.entity.dos.Bill; +import cn.lili.modules.store.entity.enums.BillStatusEnum; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 结算单统计 + * + * @author Chopper + * @since 2020/11/17 4:28 下午 + */ +public interface BillStatisticsService extends IService { + + /** + * 商家待结算数量 + * + * @param billStatusEnum 结算单类型 + * @return 待结算商家数量 + */ + long billNum(BillStatusEnum billStatusEnum); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/DistributionCashStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/DistributionCashStatisticsService.java new file mode 100644 index 00000000..c7d6bad3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/DistributionCashStatisticsService.java @@ -0,0 +1,20 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.distribution.entity.dos.DistributionCash; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 分销佣金统计 + * + * @author pikachu + * @since 2020-03-14 23:04:56 + */ +public interface DistributionCashStatisticsService extends IService { + + /** + * 待处理分销员提现申请数量 + * + * @return 待处理分销员提现申请数量 + */ + long newDistributionCash(); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/GoodsStatisticsDataService.java b/framework/src/main/java/cn/lili/modules/statistics/service/GoodsStatisticsDataService.java deleted file mode 100644 index e45c6e33..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/service/GoodsStatisticsDataService.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.lili.modules.statistics.service; - -import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.statistics.model.dto.GoodsStatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.CategoryStatisticsDataVO; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - -/** - * 商品统计业务层 - * - * @author Bulbasaur - * @date 2020/12/9 11:06 - */ -public interface GoodsStatisticsDataService extends IService { - - /** - * 查询热卖商品 - * 查询TOP100的商品 - * - * @param goodsStatisticsQueryParam 查询参数 - * @param num 数量 - * @return - */ - List getGoodsStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam, Integer num); - - /** - * 查询行业统计 - * 根据商品一级分类ID查询 - * - * @param goodsStatisticsQueryParam 查询参数 - * @return - */ - List getCategoryStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/GoodsStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/GoodsStatisticsService.java new file mode 100644 index 00000000..d790047a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/GoodsStatisticsService.java @@ -0,0 +1,31 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.goods.entity.dos.Goods; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 商品统计业务层 + * + * @author Bulbasaur + * @since 2020/12/9 11:06 + */ +public interface GoodsStatisticsService extends IService { + + /** + * 获取所有的已上架的商品数量 + * + * @param goodsStatusEnum 商品状态枚举 + * @param goodsAuthEnum 商品审核枚举 + * @return 所有的已上架的商品数量 + */ + long goodsNum(GoodsStatusEnum goodsStatusEnum, GoodsAuthEnum goodsAuthEnum); + + /** + * 获取今天的已上架的商品数量 + * + * @return 今天的已上架的商品数量 + */ + long todayUpperNum(); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/IndexStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/IndexStatisticsService.java index 5ddbfa12..427a1d89 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/service/IndexStatisticsService.java +++ b/framework/src/main/java/cn/lili/modules/statistics/service/IndexStatisticsService.java @@ -1,6 +1,8 @@ package cn.lili.modules.statistics.service; -import cn.lili.modules.statistics.model.vo.*; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.*; import java.util.List; @@ -8,7 +10,7 @@ import java.util.List; * 首页统计数据业务层 * * @author Bulbasaur - * @date 2020/12/15 17:57 + * @since 2020/12/15 17:57 */ public interface IndexStatisticsService { @@ -36,16 +38,18 @@ public interface IndexStatisticsService { /** * 查询热卖商品TOP10 * + * @param statisticsQueryParam 商品统计查询参数 * @return 热卖商品TOP10 */ - List goodsStatisticsOfMonth(); + List goodsStatistics(GoodsStatisticsQueryParam statisticsQueryParam); /** * 查询热卖店铺TOP10 + * @param statisticsQueryParam 统计查询参数 * * @return 当月的热卖店铺TOP10 */ - List storeStatisticsOfMonth(); + List storeStatistics(StatisticsQueryParam statisticsQueryParam); } diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/MemberEvaluationStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/MemberEvaluationStatisticsService.java new file mode 100644 index 00000000..585c754c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/MemberEvaluationStatisticsService.java @@ -0,0 +1,28 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.member.entity.dos.MemberEvaluation; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 会员商品评价统计 + * + * @author Bulbasaur + * @since 2020-02-25 14:10:16 + */ +public interface MemberEvaluationStatisticsService extends IService { + + /** + * 获取今天新增的评价数量 + * + * @return 今日评价数量 + */ + long todayMemberEvaluation(); + + /** + * 获取等待回复评价数量 + * + * @return 等待回复评价数量 + */ + long getWaitReplyNum(); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/MemberStatisticsDataService.java b/framework/src/main/java/cn/lili/modules/statistics/service/MemberStatisticsService.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/statistics/service/MemberStatisticsDataService.java rename to framework/src/main/java/cn/lili/modules/statistics/service/MemberStatisticsService.java index 9d3e5011..95292cfc 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/service/MemberStatisticsDataService.java +++ b/framework/src/main/java/cn/lili/modules/statistics/service/MemberStatisticsService.java @@ -1,7 +1,8 @@ package cn.lili.modules.statistics.service; -import cn.lili.modules.statistics.model.dos.MemberStatisticsData; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; +import cn.lili.modules.member.entity.vo.MemberDistributionVO; +import cn.lili.modules.statistics.entity.dos.MemberStatisticsData; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Date; @@ -11,23 +12,23 @@ import java.util.List; * 会员统计业务层 * * @author Bulbasaur - * @date 2020/12/9 11:06 + * @since 2020/12/9 11:06 */ -public interface MemberStatisticsDataService extends IService { +public interface MemberStatisticsService extends IService { /** * 获取会员数量 * * @return 会员统计 */ - Integer getMemberCount(); + long getMemberCount(); /** * 获取今日新增会员数量 * * @return 今日新增会员数量 */ - Integer todayMemberNum(); + long todayMemberNum(); /** * 获取指定结束时间前的会员数量 @@ -35,7 +36,7 @@ public interface MemberStatisticsDataService extends IService statistics(StatisticsQueryParam statisticsQueryParam); + + + /** + * 查看会员数据分布 + * + * @return 会员数据分布 + */ + List distribution(); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/OrderComplaintStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/OrderComplaintStatisticsService.java new file mode 100644 index 00000000..95834e38 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/OrderComplaintStatisticsService.java @@ -0,0 +1,20 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.order.order.entity.dos.OrderComplaint; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 交易投诉统计 + * + * @author paulG + * @since 2020/12/4 + **/ +public interface OrderComplaintStatisticsService extends IService { + + /** + * 待处理投诉数量 + * + * @return 待处理投诉数量 + */ + long waitComplainNum(); +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/OrderStatisticsDataService.java b/framework/src/main/java/cn/lili/modules/statistics/service/OrderStatisticsDataService.java deleted file mode 100644 index ec68595a..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/service/OrderStatisticsDataService.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.lili.modules.statistics.service; - -import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.OrderOverviewVO; -import cn.lili.modules.statistics.model.vo.OrderStatisticsDataVO; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; -import java.util.Map; - -/** - * 订单统计业务层 - * - * @author Bulbasaur - * @date 2020/12/9 11:06 - */ -public interface OrderStatisticsDataService extends IService { - - /** - * 订单统计概览 - * - * @param statisticsQueryParam - * @return - */ - OrderOverviewVO overview(StatisticsQueryParam statisticsQueryParam); - - /** - * 查询订单统计金额 - * - * @return 订单统计 - */ - Map getStoreOrderStatisticsPrice(); - - - /** - * 查询今日付款统计 - */ - Map getOrderStatisticsPrice(); - - /** - * 获取订单总数量 - * @param orderStatus 订单状态 - * @return 订单总数量 - */ - Integer orderNum(String orderStatus); - - /** - * 图表统计 - * - * @return 订单总数量 - */ - List statisticsChart(StatisticsQueryParam statisticsQueryParam); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/OrderStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/OrderStatisticsService.java new file mode 100644 index 00000000..7fb074dd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/OrderStatisticsService.java @@ -0,0 +1,54 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.OrderOverviewVO; +import cn.lili.modules.statistics.entity.vo.OrderStatisticsDataVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 订单统计业务层 + * + * @author Bulbasaur + * @since 2020/12/9 11:06 + */ +public interface OrderStatisticsService extends IService { + + /** + * 订单统计概览 + * + * @param statisticsQueryParam + * @return + */ + OrderOverviewVO overview(StatisticsQueryParam statisticsQueryParam); + + /** + * 获取订单总数量 + * + * @param orderStatus 订单状态 + * @return 订单总数量 + */ + long orderNum(String orderStatus); + + /** + * 图表统计 + * + * @param statisticsQueryParam 统计查询参数 + * @return 订单总数量 + */ + List statisticsChart(StatisticsQueryParam statisticsQueryParam); + + /** + * 获取统计的订单 + * + * @param statisticsQueryParam + * @param pageVO + * @return + */ + IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/PlatformViewDataService.java b/framework/src/main/java/cn/lili/modules/statistics/service/PlatformViewService.java similarity index 70% rename from framework/src/main/java/cn/lili/modules/statistics/service/PlatformViewDataService.java rename to framework/src/main/java/cn/lili/modules/statistics/service/PlatformViewService.java index a1403c3a..789cb119 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/service/PlatformViewDataService.java +++ b/framework/src/main/java/cn/lili/modules/statistics/service/PlatformViewService.java @@ -1,10 +1,10 @@ package cn.lili.modules.statistics.service; import cn.lili.modules.member.entity.vo.MemberDistributionVO; -import cn.lili.modules.statistics.model.dos.PlatformViewData; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.OnlineMemberVO; -import cn.lili.modules.statistics.model.vo.PlatformViewVO; +import cn.lili.modules.statistics.entity.dos.PlatformViewData; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.OnlineMemberVO; +import cn.lili.modules.statistics.entity.vo.PlatformViewVO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -13,9 +13,9 @@ import java.util.List; * 平台PV统计 * * @author Bulbasaur - * @date 2020/12/9 11:06 + * @since 2020/12/9 11:06 */ -public interface PlatformViewDataService extends IService { +public interface PlatformViewService extends IService { /** diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/RefundOrderStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/RefundOrderStatisticsService.java index 55a63aec..685e27c9 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/service/RefundOrderStatisticsService.java +++ b/framework/src/main/java/cn/lili/modules/statistics/service/RefundOrderStatisticsService.java @@ -2,8 +2,8 @@ package cn.lili.modules.statistics.service; import cn.lili.common.vo.PageVO; import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.RefundOrderStatisticsDataVO; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.RefundOrderStatisticsDataVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 退款订单统计业务层 * * @author Bulbasaur - * @date 2020/12/9 11:06 + * @since 2020/12/9 11:06 */ public interface RefundOrderStatisticsService extends IService { @@ -20,6 +20,7 @@ public interface RefundOrderStatisticsService extends IService { * 查询订单统计分页 * * @param statisticsQueryParam 查询参数 + * @param pageVO 分页 * @return 退款统计 */ IPage getRefundOrderStatisticsData(PageVO pageVO, StatisticsQueryParam statisticsQueryParam); diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/SeckillStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/SeckillStatisticsService.java new file mode 100644 index 00000000..fdef0654 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/SeckillStatisticsService.java @@ -0,0 +1,22 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.promotion.entity.dos.Seckill; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 秒杀统计 + * + * @author Chopper + * @since 2020/11/18 9:45 上午 + */ +public interface SeckillStatisticsService extends IService { + + + /** + * 获取当前可参与的活动数量 + * + * @return 可参与活动数量 + */ + long getApplyNum(); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/StoreFlowStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/StoreFlowStatisticsService.java new file mode 100644 index 00000000..9f99d7dd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/StoreFlowStatisticsService.java @@ -0,0 +1,69 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.CategoryStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.GoodsStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.OrderOverviewVO; +import cn.lili.modules.statistics.entity.vo.StoreStatisticsDataVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 流水统计业务层 + * + * @author Bulbasaur + * @since 2020/12/9 11:06 + */ +public interface StoreFlowStatisticsService extends IService { + + /** + * 查询热卖商品 + * 查询TOP100的商品 + * + * @param goodsStatisticsQueryParam 查询参数 + * @param num 数量 + * @return + */ + List getGoodsStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam, Integer num); + + /** + * 查询行业统计 + * 根据商品一级分类ID查询 + * + * @param goodsStatisticsQueryParam 查询参数 + * @return + */ + List getCategoryStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam); + + /** + * 店铺流水 根据店铺 统计 + * + * @param page + * @param queryWrapper + * @return + */ + List getStoreStatisticsData(Page page, QueryWrapper queryWrapper); + + /** + * 查询今日付款统计 + * + * @return 订单统计金额 + */ + Map getOrderStatisticsPrice(); + + /** + * 订单统计,数据概览 + * + * @param dates + * @param orderOverviewVO + * @param statisticsQueryParam + */ + void overview(Date[] dates, OrderOverviewVO orderOverviewVO, StatisticsQueryParam statisticsQueryParam); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/service/StoreStatisticsService.java b/framework/src/main/java/cn/lili/modules/statistics/service/StoreStatisticsService.java new file mode 100644 index 00000000..1a90c9f6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/service/StoreStatisticsService.java @@ -0,0 +1,34 @@ +package cn.lili.modules.statistics.service; + +import cn.lili.modules.store.entity.dos.Store; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 店铺统计业务层 + * + * @author Bulbasaur + * @since 2020/12/9 11:06 + */ +public interface StoreStatisticsService extends IService { + + /** + * 获取待审核店铺数量 + * + * @return 待审核店铺数量 + */ + long auditNum(); + + /** + * 获取所有店铺数量 + * + * @return 店铺总数 + */ + long storeNum(); + + /** + * 获取今天的店铺数量 + * + * @return 今天的店铺数量 + */ + long todayStoreNum(); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/AfterSaleStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/AfterSaleStatisticsServiceImpl.java new file mode 100644 index 00000000..21456526 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/AfterSaleStatisticsServiceImpl.java @@ -0,0 +1,57 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.mapper.AfterSaleStatisticsMapper; +import cn.lili.modules.statistics.service.AfterSaleStatisticsService; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.Objects; + +/** + * 售后统计业务层实现 + * + * @author Bulbasaur + * @since 2020/12/9 11:30 + */ +@Service +public class AfterSaleStatisticsServiceImpl extends ServiceImpl implements AfterSaleStatisticsService { + + + @Override + public long applyNum(String serviceType) { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(AfterSale::getServiceStatus, AfterSaleStatusEnum.APPLY.name()); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(serviceType), AfterSale::getServiceType, serviceType); + queryWrapper.eq(CharSequenceUtil.equals(authUser.getRole().name(), UserEnums.STORE.name()), + AfterSale::getStoreId, authUser.getStoreId()); + return this.count(queryWrapper); + } + + + @Override + public IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + queryWrapper.between(AfterSale::getCreateTime, dates[0], dates[1]); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(statisticsQueryParam.getStoreId()), AfterSale::getStoreId, statisticsQueryParam.getStoreId()); + + return this.page(PageUtil.initPage(pageVO), queryWrapper); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/BillStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/BillStatisticsServiceImpl.java new file mode 100644 index 00000000..34ce48f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/BillStatisticsServiceImpl.java @@ -0,0 +1,37 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.modules.statistics.mapper.BillStatisticsMapper; +import cn.lili.modules.statistics.service.BillStatisticsService; +import cn.lili.modules.store.entity.dos.Bill; +import cn.lili.modules.store.entity.enums.BillStatusEnum; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 结算单统计 + * + * @author Chopper + * @since 2020/11/17 4:28 下午 + */ +@Service +public class BillStatisticsServiceImpl extends ServiceImpl implements BillStatisticsService { + + + @Override + public long billNum(BillStatusEnum billStatusEnum) { + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(Bill::getBillStatus, billStatusEnum.name()); + lambdaUpdateWrapper.eq(CharSequenceUtil.equals(Objects.requireNonNull(UserContext.getCurrentUser()).getRole().name(), UserEnums.STORE.name()), + Bill::getStoreId, UserContext.getCurrentUser().getStoreId()); + return this.count(lambdaUpdateWrapper); + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/DistributionCashStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/DistributionCashStatisticsServiceImpl.java new file mode 100644 index 00000000..25f5159f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/DistributionCashStatisticsServiceImpl.java @@ -0,0 +1,30 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.lili.modules.distribution.entity.dos.DistributionCash; +import cn.lili.modules.statistics.mapper.DistributionCashStatisticsMapper; +import cn.lili.modules.statistics.service.DistributionCashStatisticsService; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + + +/** + * 分销佣金统计层实现 + * + * @author pikachu + * @since 2020-03-126 18:04:56 + */ +@Service +public class DistributionCashStatisticsServiceImpl extends ServiceImpl + implements DistributionCashStatisticsService { + + + @Override + public long newDistributionCash() { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.eq("distribution_cash_status", WithdrawStatusEnum.APPLY.name()); + return this.count(queryWrapper); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/GoodsStatisticsDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/GoodsStatisticsDataServiceImpl.java deleted file mode 100644 index a8fd8eb9..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/GoodsStatisticsDataServiceImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.lili.modules.statistics.serviceimpl; - -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; -import cn.lili.modules.statistics.mapper.GoodsStatisticsDataMapper; -import cn.lili.modules.statistics.model.dto.GoodsStatisticsQueryParam; -import cn.lili.modules.statistics.model.enums.StatisticsQuery; -import cn.lili.modules.statistics.model.vo.CategoryStatisticsDataVO; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import cn.lili.modules.statistics.service.GoodsStatisticsDataService; -import cn.lili.modules.statistics.util.StatisticsDateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Date; -import java.util.List; - -/** - * 商品统计业务层实现 - * - * @author Bulbasaur - * @date 2020/12/9 11:30 - */ -@Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class GoodsStatisticsDataServiceImpl extends ServiceImpl implements GoodsStatisticsDataService { - - /** - * 商品统计 - */ - private final GoodsStatisticsDataMapper goodsStatisticsDataMapper; - - @Override - public List getGoodsStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam, Integer num) { - //获取查询条件 - QueryWrapper queryWrapper = getQueryWrapper(goodsStatisticsQueryParam); - //根据商品分组 - queryWrapper.groupBy("goods_id"); - queryWrapper.groupBy("goods_name"); - - queryWrapper.eq(!StringUtils.isEmpty(goodsStatisticsQueryParam.getStoreId()), "store_id", goodsStatisticsQueryParam.getStoreId()); - //查询前一百条记录 - Page page = new Page(1, num); - return goodsStatisticsDataMapper.getGoodsStatisticsData(page, queryWrapper); - } - - @Override - public List getCategoryStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { - //获取查询条件 - QueryWrapper queryWrapper = getQueryWrapper(goodsStatisticsQueryParam); - //根据分类分组 - queryWrapper.groupBy("category_id"); - return goodsStatisticsDataMapper.getCateGoryStatisticsData(queryWrapper); - } - - - private QueryWrapper getQueryWrapper(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { - - QueryWrapper queryWrapper = Wrappers.query(); - //判断搜索类型是:年、月 - Date[] date = StatisticsDateUtil.getDateArray(goodsStatisticsQueryParam); - queryWrapper.between("create_time", date[0], date[1]); - - //判断是按照数量统计还是按照金额统计 - if (goodsStatisticsQueryParam.getType().equals(StatisticsQuery.NUM.name())) { - queryWrapper.orderByDesc("num"); - } else { - queryWrapper.orderByDesc("price"); - } - //设置为付款查询 - queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); - return queryWrapper; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/GoodsStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/GoodsStatisticsServiceImpl.java new file mode 100644 index 00000000..87b52e31 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/GoodsStatisticsServiceImpl.java @@ -0,0 +1,56 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.modules.goods.entity.dos.Goods; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.statistics.mapper.GoodsStatisticsMapper; +import cn.lili.modules.statistics.service.GoodsStatisticsService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 商品统计业务层实现 + * + * @author Bulbasaur + * @since 2020/12/9 11:30 + */ +@Service +public class GoodsStatisticsServiceImpl extends ServiceImpl implements GoodsStatisticsService { + + @Override + public long goodsNum(GoodsStatusEnum goodsStatusEnum, GoodsAuthEnum goodsAuthEnum) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + + queryWrapper.eq(Goods::getDeleteFlag, false); + + if (goodsStatusEnum != null) { + queryWrapper.eq(Goods::getMarketEnable, goodsStatusEnum.name()); + } + if (goodsAuthEnum != null) { + queryWrapper.eq(Goods::getAuthFlag, goodsAuthEnum.name()); + } + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + queryWrapper.eq(CharSequenceUtil.equals(currentUser.getRole().name(), UserEnums.STORE.name()), + Goods::getStoreId, currentUser.getStoreId()); + + return this.count(queryWrapper); + } + + @Override + public long todayUpperNum() { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name()); + queryWrapper.ge(Goods::getCreateTime, DateUtil.beginOfDay(new DateTime())); + return this.count(queryWrapper); + } +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/IndexStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/IndexStatisticsServiceImpl.java index c2321ca7..0ce96a9b 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/IndexStatisticsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/IndexStatisticsServiceImpl.java @@ -1,119 +1,119 @@ package cn.lili.modules.statistics.serviceimpl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateTime; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.BeanUtil; -import cn.lili.modules.distribution.service.DistributionCashService; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; -import cn.lili.modules.goods.service.GoodsService; -import cn.lili.modules.member.service.MemberEvaluationService; import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.order.order.service.AfterSaleService; -import cn.lili.modules.order.order.service.OrderComplaintService; -import cn.lili.modules.promotion.service.SeckillService; -import cn.lili.modules.statistics.mapper.StoreStatisticsDataMapper; -import cn.lili.modules.statistics.model.dto.GoodsStatisticsQueryParam; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.enums.SearchTypeEnum; -import cn.lili.modules.statistics.model.enums.StatisticsQuery; -import cn.lili.modules.statistics.model.vo.*; -import cn.lili.modules.statistics.service.*; -import cn.lili.modules.store.entity.enums.BillStatusEnum; -import cn.lili.modules.store.service.BillService; -import cn.lili.modules.store.service.StoreService; import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.enums.SearchTypeEnum; +import cn.lili.modules.statistics.entity.vo.*; +import cn.lili.modules.statistics.service.*; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import cn.lili.modules.store.entity.enums.BillStatusEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; /** * 首页统计数据业务层实现 * * @author Bulbasaur - * @date 2020/12/15 17:57 + * @since 2020/12/15 17:57 */ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class IndexStatisticsServiceImpl implements IndexStatisticsService { /** * 订单统计 */ - private final OrderStatisticsDataService orderStatisticsDataService; + @Autowired + private OrderStatisticsService orderStatisticsService; /** * 会员统计 */ - private final MemberStatisticsDataService memberStatisticsDataService; + @Autowired + private MemberStatisticsService memberStatisticsService; /** * 商品统计 */ - private final GoodsStatisticsDataService goodsStatisticsDataService; + @Autowired + private GoodsStatisticsService goodsStatisticsService; /** - * 店铺统计 + * 商品统计 */ - private final StoreStatisticsDataMapper storeStatisticsDataMapper; - /** - * 商品 - */ - private final GoodsService goodsService; + @Autowired + private StoreFlowStatisticsService storeFlowStatisticsService; /** * 店铺 */ - private final StoreService storeService; + @Autowired + private StoreStatisticsService storeStatisticsService; /** * 店铺 */ - private final MemberEvaluationService memberEvaluationService; + @Autowired + private MemberEvaluationStatisticsService memberEvaluationStatisticsService; /** * 售后 */ - private final AfterSaleService afterSaleService; + @Autowired + private AfterSaleStatisticsService afterSaleStatisticsService; /** * 投诉 */ - private final OrderComplaintService orderComplaintService; + @Autowired + private OrderComplaintStatisticsService orderComplaintStatisticsService; /** * 分销员提现 */ - private final DistributionCashService distributionCashService; + @Autowired + private DistributionCashStatisticsService distributionCashStatisticsService; /** * 平台PV统计 */ - private final PlatformViewDataService platformViewDataService; + @Autowired + private PlatformViewService platformViewService; /** * 结算单 */ - private final BillService billService; + @Autowired + private BillStatisticsService billStatisticsService; /** * 秒杀活动 */ - private final SeckillService seckillService; + @Autowired + private SeckillStatisticsService seckillStatisticsService; @Override public IndexNoticeVO indexNotice() { IndexNoticeVO indexNoticeVO = new IndexNoticeVO(); //商品审核 - indexNoticeVO.setGoods(goodsService.goodsNum(GoodsStatusEnum.UPPER, GoodsAuthEnum.TOBEAUDITED)); + indexNoticeVO.setGoods(goodsStatisticsService.goodsNum(null, GoodsAuthEnum.TOBEAUDITED)); //店铺入驻审核 - indexNoticeVO.setStore(storeService.auditNum()); + indexNoticeVO.setStore(storeStatisticsService.auditNum()); //售后申请 - indexNoticeVO.setRefund(afterSaleService.applyNum(null)); + indexNoticeVO.setRefund(afterSaleStatisticsService.applyNum(null)); //投诉审核 - indexNoticeVO.setComplain(orderComplaintService.newComplainNum()); + indexNoticeVO.setComplain(orderComplaintStatisticsService.waitComplainNum()); //分销员提现审核 - indexNoticeVO.setDistributionCash(distributionCashService.newDistributionCash()); + indexNoticeVO.setDistributionCash(distributionCashStatisticsService.newDistributionCash()); //待处理商家结算 - indexNoticeVO.setWaitPayBill(billService.billNum(BillStatusEnum.CHECK)); + indexNoticeVO.setWaitPayBill(billStatisticsService.billNum(BillStatusEnum.CHECK)); return indexNoticeVO; } @@ -124,31 +124,31 @@ public class IndexStatisticsServiceImpl implements IndexStatisticsService { IndexStatisticsVO indexStatisticsVO = new IndexStatisticsVO(); //获取总订单数量 - indexStatisticsVO.setOrderNum(orderStatisticsDataService.orderNum(null)); + indexStatisticsVO.setOrderNum(orderStatisticsService.orderNum(null)); //获取总会员数量 - indexStatisticsVO.setMemberNum(memberStatisticsDataService.getMemberCount()); + indexStatisticsVO.setMemberNum(memberStatisticsService.getMemberCount()); //获取总上架商品数量 - indexStatisticsVO.setGoodsNum(goodsService.goodsNum(GoodsStatusEnum.UPPER, null)); + indexStatisticsVO.setGoodsNum(goodsStatisticsService.goodsNum(GoodsStatusEnum.UPPER, GoodsAuthEnum.PASS)); //获取总店铺数量 - indexStatisticsVO.setStoreNum(storeService.storeNum()); + indexStatisticsVO.setStoreNum(storeStatisticsService.storeNum()); //下单统计 - Map map = orderStatisticsDataService.getOrderStatisticsPrice(); + Map map = storeFlowStatisticsService.getOrderStatisticsPrice(); //今日下单数 - indexStatisticsVO.setTodayOrderNum(map.get("num") == null ? 0L : (Long)map.get("num")); + indexStatisticsVO.setTodayOrderNum(map.get("num") == null ? 0L : (Long) map.get("num")); //今日下单金额 indexStatisticsVO.setTodayOrderPrice(map.get("price") == null ? 0D : (Double) map.get("price")); //今日新增会员数量 - indexStatisticsVO.setTodayMemberNum(memberStatisticsDataService.todayMemberNum()); + indexStatisticsVO.setTodayMemberNum(memberStatisticsService.todayMemberNum()); //今日新增商品数量 - indexStatisticsVO.setTodayGoodsNum(goodsService.todayUpperNum()); + indexStatisticsVO.setTodayGoodsNum(goodsStatisticsService.todayUpperNum()); //今日新增店铺数量 - indexStatisticsVO.setTodayStoreNum(storeService.todayStoreNum()); + indexStatisticsVO.setTodayStoreNum(storeStatisticsService.todayStoreNum()); //今日新增评论数量 - indexStatisticsVO.setTodayMemberEvaluation(memberEvaluationService.todayMemberEvaluation()); + indexStatisticsVO.setTodayMemberEvaluation(memberEvaluationStatisticsService.todayMemberEvaluation()); //当前在线人数 - indexStatisticsVO.setCurrentNumberPeopleOnline(platformViewDataService.online()); + indexStatisticsVO.setCurrentNumberPeopleOnline(platformViewService.online()); //流量统计 @@ -156,19 +156,19 @@ public class IndexStatisticsServiceImpl implements IndexStatisticsService { //今日uv queryParam.setSearchType(SearchTypeEnum.TODAY.name()); - indexStatisticsVO.setTodayUV(platformViewDataService.countUv(queryParam)); + indexStatisticsVO.setTodayUV(platformViewService.countUv(queryParam)); -// 昨日访问数UV +// 昨日访问数UV queryParam.setSearchType(SearchTypeEnum.YESTERDAY.name()); - indexStatisticsVO.setYesterdayUV(platformViewDataService.countUv(queryParam)); + indexStatisticsVO.setYesterdayUV(platformViewService.countUv(queryParam)); -// 前七日访问数UV +// 前七日访问数UV queryParam.setSearchType(SearchTypeEnum.LAST_SEVEN.name()); - indexStatisticsVO.setLastSevenUV(platformViewDataService.countUv(queryParam)); + indexStatisticsVO.setLastSevenUV(platformViewService.countUv(queryParam)); -// 三十日访问数UV +// 三十日访问数UV queryParam.setSearchType(SearchTypeEnum.LAST_THIRTY.name()); - indexStatisticsVO.setLastThirtyUV(platformViewDataService.countUv(queryParam)); + indexStatisticsVO.setLastThirtyUV(platformViewService.countUv(queryParam)); return indexStatisticsVO; @@ -177,66 +177,67 @@ public class IndexStatisticsServiceImpl implements IndexStatisticsService { @Override public StoreIndexStatisticsVO storeIndexStatistics() { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); StoreIndexStatisticsVO storeIndexStatisticsVO = new StoreIndexStatisticsVO(); //商品总数量 - storeIndexStatisticsVO.setGoodsNum(goodsService.goodsNum(GoodsStatusEnum.UPPER, null)); + storeIndexStatisticsVO.setGoodsNum(goodsStatisticsService.goodsNum(GoodsStatusEnum.UPPER, null)); //订单总数量、订单总金额 - Map map = orderStatisticsDataService.getStoreOrderStatisticsPrice(); - storeIndexStatisticsVO.setOrderNum(Integer.parseInt(map.get("num").toString())); + Map map = storeFlowStatisticsService.getOrderStatisticsPrice(); + storeIndexStatisticsVO.setOrderNum(Convert.toInt(map.get("num").toString())); storeIndexStatisticsVO.setOrderPrice(map.get("price") != null ? Double.parseDouble(map.get("price").toString()) : 0.0); //访问量 StatisticsQueryParam queryParam = new StatisticsQueryParam(); queryParam.setSearchType(SearchTypeEnum.TODAY.name()); - queryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - PlatformViewVO platformViewVO = platformViewDataService.list(queryParam).get(0); + queryParam.setStoreId(storeId); + PlatformViewVO platformViewVO = platformViewService.list(queryParam).get(0); storeIndexStatisticsVO.setStoreUV(platformViewVO.getUvNum().intValue()); //待付款订单数量 - storeIndexStatisticsVO.setUnPaidOrder(orderStatisticsDataService.orderNum(OrderStatusEnum.UNPAID.name())); + storeIndexStatisticsVO.setUnPaidOrder(orderStatisticsService.orderNum(OrderStatusEnum.UNPAID.name())); //待发货订单数量 - storeIndexStatisticsVO.setUnDeliveredOrder(orderStatisticsDataService.orderNum(OrderStatusEnum.UNDELIVERED.name())); + storeIndexStatisticsVO.setUnDeliveredOrder(orderStatisticsService.orderNum(OrderStatusEnum.UNDELIVERED.name())); //待收货订单数量 - storeIndexStatisticsVO.setDeliveredOrder(orderStatisticsDataService.orderNum(OrderStatusEnum.DELIVERED.name())); - + storeIndexStatisticsVO.setDeliveredOrder(orderStatisticsService.orderNum(OrderStatusEnum.DELIVERED.name())); + //待自提数量 + storeIndexStatisticsVO.setSelfPickNum(orderStatisticsService.orderNum(OrderStatusEnum.STAY_PICKED_UP.name())); //待处理退货数量 - storeIndexStatisticsVO.setReturnGoods(afterSaleService.applyNum(AfterSaleTypeEnum.RETURN_GOODS.name())); + storeIndexStatisticsVO.setReturnGoods(afterSaleStatisticsService.applyNum(AfterSaleTypeEnum.RETURN_GOODS.name())); //待处理退款数量 - storeIndexStatisticsVO.setReturnMoney(afterSaleService.applyNum(AfterSaleTypeEnum.RETURN_MONEY.name())); + storeIndexStatisticsVO.setReturnMoney(afterSaleStatisticsService.applyNum(AfterSaleTypeEnum.RETURN_MONEY.name())); //待回复评价数量 - storeIndexStatisticsVO.setMemberEvaluation(memberEvaluationService.getWaitReplyNum()); - //待处理交易投诉数量 - storeIndexStatisticsVO.setComplaint(orderComplaintService.newComplainNum()); + storeIndexStatisticsVO.setMemberEvaluation(memberEvaluationStatisticsService.getWaitReplyNum()); + //待处理投诉数量 + storeIndexStatisticsVO.setComplaint(orderComplaintStatisticsService.waitComplainNum()); //待上架商品数量 - storeIndexStatisticsVO.setWaitUpper(goodsService.goodsNum(GoodsStatusEnum.DOWN, null)); + storeIndexStatisticsVO.setWaitUpper(goodsStatisticsService.goodsNum(GoodsStatusEnum.DOWN, null)); //待审核商品数量 - storeIndexStatisticsVO.setWaitAuth(goodsService.goodsNum(null, GoodsAuthEnum.TOBEAUDITED)); + storeIndexStatisticsVO.setWaitAuth(goodsStatisticsService.goodsNum(null, GoodsAuthEnum.TOBEAUDITED)); //可参与秒杀活动数量 - storeIndexStatisticsVO.setSeckillNum(seckillService.getApplyNum()); + storeIndexStatisticsVO.setSeckillNum(seckillStatisticsService.getApplyNum()); //待处理商家结算 - storeIndexStatisticsVO.setWaitPayBill(billService.billNum(BillStatusEnum.OUT)); + storeIndexStatisticsVO.setWaitPayBill(billStatisticsService.billNum(BillStatusEnum.OUT)); return storeIndexStatisticsVO; } @Override - public List goodsStatisticsOfMonth() { - //获取查询参数 - GoodsStatisticsQueryParam goodsStatisticsQueryParam = getGoodsStatisticsQueryParam(); + public List goodsStatistics(GoodsStatisticsQueryParam statisticsQueryParam) { //查询商品 - return goodsStatisticsDataService.getGoodsStatisticsData(goodsStatisticsQueryParam, 10); + return storeFlowStatisticsService.getGoodsStatisticsData(statisticsQueryParam, 10); } @Override - public List storeStatisticsOfMonth() { + public List storeStatistics(StatisticsQueryParam statisticsQueryParam) { QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.between("create_time", cn.hutool.core.date.DateUtil.beginOfYear(new DateTime()), - cn.hutool.core.date.DateUtil.endOfYear(new DateTime())); + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + Date startTime = dates[0], endTime = dates[1]; + queryWrapper.between("create_time", startTime, endTime); queryWrapper.orderByDesc("price"); @@ -247,7 +248,7 @@ public class IndexStatisticsServiceImpl implements IndexStatisticsService { //查询前十条记录 Page page = new Page(1, 10); - return storeStatisticsDataMapper.getStoreStatisticsData(page, queryWrapper); + return storeFlowStatisticsService.getStoreStatisticsData(page, queryWrapper); } @@ -277,7 +278,6 @@ public class IndexStatisticsServiceImpl implements IndexStatisticsService { if (UserContext.getCurrentUser().getRole().equals(UserEnums.STORE)) { goodsStatisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); } - goodsStatisticsQueryParam.setType(StatisticsQuery.PRICE.name()); DateTime dateTime = new DateTime(); goodsStatisticsQueryParam.setYear(dateTime.year()); goodsStatisticsQueryParam.setMonth(dateTime.monthBaseOne()); diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberEvaluationStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberEvaluationStatisticsServiceImpl.java new file mode 100644 index 00000000..8f4ae74c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberEvaluationStatisticsServiceImpl.java @@ -0,0 +1,43 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.modules.member.entity.dos.MemberEvaluation; +import cn.lili.modules.statistics.mapper.MemberEvaluationStatisticsMapper; +import cn.lili.modules.statistics.service.MemberEvaluationStatisticsService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 会员商品评价业务层实现 + * + * @author Bulbasaur + * @since 2020-02-25 14:10:16 + */ +@Service +public class MemberEvaluationStatisticsServiceImpl extends ServiceImpl implements MemberEvaluationStatisticsService { + + + @Override + public long todayMemberEvaluation() { + return this.count(new LambdaQueryWrapper().ge(MemberEvaluation::getCreateTime, DateUtil.beginOfDay(new DateTime()))); + } + + @Override + public long getWaitReplyNum() { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.eq(CharSequenceUtil.equals(Objects.requireNonNull(UserContext.getCurrentUser()).getRole().name(), UserEnums.STORE.name()), + "store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.eq("reply_status", false); + return this.count(queryWrapper); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberStatisticsDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberStatisticsDataServiceImpl.java deleted file mode 100644 index 645d36d7..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberStatisticsDataServiceImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.lili.modules.statistics.serviceimpl; - -import cn.hutool.core.date.DateUtil; -import cn.lili.common.enums.SwitchEnum; -import cn.lili.modules.statistics.mapper.MemberStatisticsDataMapper; -import cn.lili.modules.statistics.model.dos.MemberStatisticsData; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.service.MemberStatisticsDataService; -import cn.lili.modules.statistics.util.StatisticsDateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Date; -import java.util.List; - -/** - * 会员统计业务层实现 - * - * @author Bulbasaur - * @date 2020/12/9 18:33 - */ -@Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MemberStatisticsDataServiceImpl extends ServiceImpl implements MemberStatisticsDataService { - - /** - * 会员统计 - */ - private final MemberStatisticsDataMapper memberStatisticsDataMapper; - - @Override - public Integer getMemberCount() { - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("disabled", SwitchEnum.OPEN.name()); - return memberStatisticsDataMapper.customSqlQuery(queryWrapper); - } - - @Override - public Integer todayMemberNum() { - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.gt("create_time", DateUtil.beginOfDay(new Date())); - return memberStatisticsDataMapper.customSqlQuery(queryWrapper); - } - - @Override - public Integer memberCount(Date endTime) { - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.lt("create_time", endTime); - return memberStatisticsDataMapper.customSqlQuery(queryWrapper); - } - - @Override - public Integer activeQuantity(Date startTime) { - - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.ge("last_login_date", startTime); - return memberStatisticsDataMapper.customSqlQuery(queryWrapper); - } - - @Override - public Integer newlyAdded(Date startTime, Date endTime) { - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.between("create_time", startTime, endTime); - return memberStatisticsDataMapper.customSqlQuery(queryWrapper); - } - - @Override - public List statistics(StatisticsQueryParam statisticsQueryParam) { - Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); - Date startTime = dates[0], endTime = dates[1]; - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.between("create_date", startTime, endTime); - - return list(queryWrapper); - } -} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberStatisticsServiceImpl.java new file mode 100644 index 00000000..cf39dde3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/MemberStatisticsServiceImpl.java @@ -0,0 +1,97 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.hutool.core.date.DateUtil; +import cn.lili.modules.member.entity.vo.MemberDistributionVO; +import cn.lili.modules.statistics.entity.dos.MemberStatisticsData; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.enums.SearchTypeEnum; +import cn.lili.modules.statistics.mapper.MemberStatisticsMapper; +import cn.lili.modules.statistics.service.MemberStatisticsService; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 会员统计业务层实现 + * + * @author Bulbasaur + * @since 2020/12/9 18:33 + */ +@Service +public class MemberStatisticsServiceImpl extends ServiceImpl implements MemberStatisticsService { + + @Override + public long getMemberCount() { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("disabled", true); + return this.baseMapper.customSqlQuery(queryWrapper); + } + + @Override + public long todayMemberNum() { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.ge("create_time", DateUtil.beginOfDay(new Date())); + return this.baseMapper.customSqlQuery(queryWrapper); + } + + @Override + public long memberCount(Date endTime) { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.le("create_time", endTime); + return this.baseMapper.customSqlQuery(queryWrapper); + } + + @Override + public long activeQuantity(Date startTime) { + + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.ge("last_login_date", startTime); + return this.baseMapper.customSqlQuery(queryWrapper); + } + + @Override + public long newlyAdded(Date startTime, Date endTime) { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.between("create_time", startTime, endTime); + return this.baseMapper.customSqlQuery(queryWrapper); + } + + @Override + public List statistics(StatisticsQueryParam statisticsQueryParam) { + + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + Date startTime = dates[0]; + Date endTime = dates[1]; + + //如果统计今天,则自行构造数据 + if (statisticsQueryParam.getSearchType().equals(SearchTypeEnum.TODAY.name())) { + //构建数据,然后返回集合,提供给前端展示 + MemberStatisticsData memberStatisticsData = new MemberStatisticsData(); + memberStatisticsData.setMemberCount(this.memberCount(endTime)); + memberStatisticsData.setCreateDate(startTime); + memberStatisticsData.setActiveQuantity(this.activeQuantity(startTime)); + memberStatisticsData.setNewlyAdded(this.newlyAdded(startTime, endTime)); + List result = new ArrayList(); + result.add(memberStatisticsData); + return result; + } + + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.between("create_date", startTime, endTime); + + return list(queryWrapper); + } + + + @Override + public List distribution() { + return this.baseMapper.distribution(); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderComplaintStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderComplaintStatisticsServiceImpl.java new file mode 100644 index 00000000..7830ac73 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderComplaintStatisticsServiceImpl.java @@ -0,0 +1,34 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum; +import cn.lili.modules.order.order.entity.dos.OrderComplaint; +import cn.lili.modules.statistics.mapper.OrderComplaintStatisticsMapper; +import cn.lili.modules.statistics.service.OrderComplaintStatisticsService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 交易投诉业务层实现 + * + * @author paulG + * @since 2020/12/5 + **/ +@Service +public class OrderComplaintStatisticsServiceImpl extends ServiceImpl implements OrderComplaintStatisticsService { + + @Override + public long waitComplainNum() { + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.ne("complain_status", ComplaintStatusEnum.COMPLETE.name()); + queryWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), + "store_id", UserContext.getCurrentUser().getStoreId()); + return this.count(queryWrapper); + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsDataServiceImpl.java deleted file mode 100644 index fe0fd8df..00000000 --- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsDataServiceImpl.java +++ /dev/null @@ -1,261 +0,0 @@ -package cn.lili.modules.statistics.serviceimpl; - -import cn.lili.common.security.AuthUser; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.dos.StoreFlow; -import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; -import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.statistics.mapper.OrderStatisticsDataMapper; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.OrderOverviewVO; -import cn.lili.modules.statistics.model.vo.OrderStatisticsDataVO; -import cn.lili.modules.statistics.service.OrderStatisticsDataService; -import cn.lili.modules.statistics.service.PlatformViewDataService; -import cn.lili.modules.statistics.util.StatisticsDateUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; - -/** - * 订单统计业务层实现 - * - * @author Bulbasaur - * @date 2020/12/9 17:16 - */ -@Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class OrderStatisticsDataServiceImpl extends ServiceImpl implements OrderStatisticsDataService { - - //订单统计 - private final OrderStatisticsDataMapper orderStatisticsDataMapper; - //平台PV统计 - private final PlatformViewDataService platformViewDataService; - //订单 - private final OrderService orderService; - - @Override - public OrderOverviewVO overview(StatisticsQueryParam statisticsQueryParam) { - Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); - - OrderOverviewVO orderOverviewVO = new OrderOverviewVO(); - //访客数 - orderOverviewVO.setUvNum(platformViewDataService.countUv(statisticsQueryParam)); - if (orderOverviewVO.getUvNum() == null) { - orderOverviewVO.setUvNum(0); - } - - //下单统计 - initOrder(dates, orderOverviewVO); - - //付款统计 - initPayment(dates, orderOverviewVO); - - //退单统计 - initAfterSale(dates, orderOverviewVO); - - //数据运算(转换率,比例相关) - conversionRateOperation(orderOverviewVO); - return orderOverviewVO; - } - - // 运算转换率 - private void conversionRateOperation(OrderOverviewVO orderOverviewVO) { - - //下单转换率 订单数/UV - Double orderConversionRate = CurrencyUtil.div(orderOverviewVO.getOrderNum(), orderOverviewVO.getUvNum(), 4); - if (orderConversionRate > 1) { - orderConversionRate = 1d; - } - orderOverviewVO.setOrderConversionRate(CurrencyUtil.mul(orderConversionRate, 100) + "%"); - //付款转换率 付款订单数/订单数 - Double paymentsConversionRate = CurrencyUtil.div(orderOverviewVO.getPaymentOrderNum(), orderOverviewVO.getOrderNum(), 4); - if (paymentsConversionRate > 1) { - paymentsConversionRate = 1d; - } - orderOverviewVO.setPaymentsConversionRate(CurrencyUtil.mul(paymentsConversionRate, 100) + "%"); - //整体转换率 付款数/UV - Double overallConversionRate = CurrencyUtil.div(orderOverviewVO.getPaymentOrderNum(), orderOverviewVO.getUvNum(), 4); - if (overallConversionRate > 1) { - overallConversionRate = 1d; - } - orderOverviewVO.setOverallConversionRate(CurrencyUtil.mul(overallConversionRate, 100) + "%"); - } - - /** - * 订单统计-下单属性填充 - * - * @param dates - * @param orderOverviewVO - */ - private void initOrder(Date[] dates, OrderOverviewVO orderOverviewVO) { - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.between("create_time", dates[0], dates[1]); - queryWrapper.select("SUM(flow_price) AS price , COUNT(0) AS num"); - Map order = orderService.getMap(queryWrapper); - orderOverviewVO.setOrderNum(order != null && order.containsKey("num") ? (Long) order.get("num") : 0L); - orderOverviewVO.setOrderAmount(order != null && order.containsKey("price") ? (double) order.get("price") : 0L); - - queryWrapper = Wrappers.query(); - queryWrapper.between("create_time", dates[0], dates[1]); - queryWrapper.select("count(DISTINCT member_id) AS num"); - Map memberNum = orderService.getMap(queryWrapper); - - orderOverviewVO.setOrderMemberNum(memberNum != null && memberNum.containsKey("num") ? (Long) memberNum.get("num") : 0L); - - if (orderOverviewVO.getOrderAmount() == null) { - orderOverviewVO.setOrderAmount(0D); - } - } - - /** - * 订单统计-付款属性填充 - * - * @param dates - * @param orderOverviewVO - */ - private void initPayment(Date[] dates, OrderOverviewVO orderOverviewVO) { - //付款订单数,付款金额 - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.between("create_time", dates[0], dates[1]); - queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num"); - queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); - Map payment = this.getMap(queryWrapper); - - orderOverviewVO.setPaymentOrderNum(payment != null && payment.containsKey("num") ? (Long) payment.get("num") : 0L); - orderOverviewVO.setPaymentAmount(payment != null && payment.containsKey("price") ? (Double) payment.get("price") : 0D); - - //付款人数 - queryWrapper = Wrappers.query(); - queryWrapper.between("create_time", dates[0], dates[1]); - queryWrapper.select("COUNT(0) AS num"); - queryWrapper.groupBy("member_id"); - Map paymentMemberNum = this.getMap(queryWrapper); - - orderOverviewVO.setPaymentsNum(paymentMemberNum != null && paymentMemberNum.containsKey("num") ? (Long) paymentMemberNum.get("num") : 0L); - } - - /** - * 订单统计-付款属性填充 - * - * @param dates - * @param orderOverviewVO - */ - private void initAfterSale(Date[] dates, OrderOverviewVO orderOverviewVO) { - //付款订单数,付款金额 - QueryWrapper queryWrapper = Wrappers.query(); - queryWrapper.between("create_time", dates[0], dates[1]); - queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num"); - queryWrapper.eq("flow_type", FlowTypeEnum.REFUND.name()); - Map payment = this.getMap(queryWrapper); - orderOverviewVO.setRefundOrderNum(payment != null && payment.containsKey("num") ? (Long) payment.get("num") : 0L); - orderOverviewVO.setRefundOrderPrice(payment != null && payment.containsKey("price") ? (Double) payment.get("price") : 0D); - } - - - @Override - public Map getStoreOrderStatisticsPrice() { - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), - "store_id", UserContext.getCurrentUser().getStoreId()); - queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num"); - return this.getMap(queryWrapper); - } - - @Override - public Map getOrderStatisticsPrice() { - QueryWrapper queryWrapper = Wrappers.query(); - //支付订单 - queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); - - //商家查询,则增加商家判定 - AuthUser authUser = UserContext.getCurrentUser(); - if (authUser.getRole().equals(UserEnums.STORE)) { - queryWrapper.eq("store_id", authUser.getStoreId()); - } - //大于今天凌晨 - queryWrapper.gt("create_time", DateUtil.startOfTodDayTime()); - - queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num"); - return this.getMap(queryWrapper); - } - - @Override - public Integer orderNum(String orderStatus) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); - //queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); - queryWrapper.eq(StringUtils.isNotEmpty(orderStatus),Order::getOrderStatus,orderStatus); - queryWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), - Order::getStoreId, UserContext.getCurrentUser().getStoreId()); - return orderService.count(queryWrapper); - } - - @Override - public List statisticsChart(StatisticsQueryParam statisticsQueryParam) { - Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); - QueryWrapper queryWrapper = new QueryWrapper(); - //已支付 - queryWrapper.eq("pay_status", PayStatusEnum.PAID.name()); - //选择商家判定 - queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()), "seller_id", statisticsQueryParam.getStoreId()); -// 查询时间区间 - queryWrapper.between("create_time", dates[0], dates[1]); -// 格式化时间 - queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m-%d')"); - List orderStatisticsDataVOS = orderStatisticsDataMapper.getOrderStatisticsData(queryWrapper); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(dates[0]); - - List result = new ArrayList<>(); - //时间判定,将数据填充好 - //如果当前的时间,在结束时间之前 - while (calendar.getTime().before(dates[1])) { - OrderStatisticsDataVO item = null; - //判定是否已经有这一天的数据 - for (OrderStatisticsDataVO orderStatisticsDataVO : orderStatisticsDataVOS) { - if (orderStatisticsDataVO.getCreateTime().equals(calendar.getTime())) { - item = orderStatisticsDataVO; - } - } - //如果数据不存在,则进行数据填充 - if (item == null) { - item = new OrderStatisticsDataVO(); - item.setPrice(0d); - item.setCreateTime(calendar.getTime()); - } - result.add(item); - //增加时间 - calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1); - } - return result; - } - - private QueryWrapper getQueryWrapper(StatisticsQueryParam statisticsQueryParam) { - - QueryWrapper queryWrapper = Wrappers.query(); - - Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); - queryWrapper.between("create_time", dates[0], dates[1]); - - //设置店铺ID - queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()), "store_id", statisticsQueryParam.getStoreId()); - - - //设置为付款查询 - queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); - - return queryWrapper; - } - -} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsServiceImpl.java new file mode 100644 index 00000000..b39266e9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsServiceImpl.java @@ -0,0 +1,179 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.utils.StringUtils; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; +import cn.lili.modules.order.order.entity.enums.PayStatusEnum; +import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.OrderOverviewVO; +import cn.lili.modules.statistics.entity.vo.OrderStatisticsDataVO; +import cn.lili.modules.statistics.mapper.OrderStatisticsMapper; +import cn.lili.modules.statistics.service.OrderStatisticsService; +import cn.lili.modules.statistics.service.PlatformViewService; +import cn.lili.modules.statistics.service.StoreFlowStatisticsService; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 订单统计业务层实现 + * + * @author Bulbasaur + * @since 2020/12/9 17:16 + */ +@Service +public class OrderStatisticsServiceImpl extends ServiceImpl implements OrderStatisticsService { + + /** + * 平台PV统计 + */ + @Autowired + private PlatformViewService platformViewService; + + @Autowired + private StoreFlowStatisticsService storeFlowStatisticsService; + + @Override + public OrderOverviewVO overview(StatisticsQueryParam statisticsQueryParam) { + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + + OrderOverviewVO orderOverviewVO = new OrderOverviewVO(); + + /** + * 组织统计初始化 + */ + storeFlowStatisticsService.overview(dates, orderOverviewVO, statisticsQueryParam); + //访客数 + Integer uv = platformViewService.countUv(statisticsQueryParam); + if (uv != null) { + orderOverviewVO.setUvNum(uv.longValue()); + } + + //数据运算(转换率,比例相关) + conversionRateOperation(orderOverviewVO); + return orderOverviewVO; + } + + /** + * 运算转换率 + * + * @param orderOverviewVO 订单统计视图 + */ + private void conversionRateOperation(OrderOverviewVO orderOverviewVO) { + + //下单转换率 订单数/UV + Double orderConversionRate = CurrencyUtil.div(orderOverviewVO.getOrderNum(), orderOverviewVO.getUvNum(), 4); + if (orderConversionRate > 1) { + orderConversionRate = 1d; + } + orderOverviewVO.setOrderConversionRate(CurrencyUtil.mul(orderConversionRate, 100) + "%"); + //付款转换率 付款订单数/订单数 + Double paymentsConversionRate = CurrencyUtil.div(orderOverviewVO.getPaymentOrderNum(), orderOverviewVO.getOrderNum(), 4); + if (paymentsConversionRate > 1) { + paymentsConversionRate = 1d; + } + orderOverviewVO.setPaymentsConversionRate(CurrencyUtil.mul(paymentsConversionRate, 100) + "%"); + //整体转换率 付款数/UV + Double overallConversionRate = CurrencyUtil.div(orderOverviewVO.getPaymentOrderNum(), orderOverviewVO.getUvNum(), 4); + if (overallConversionRate > 1) { + overallConversionRate = 1d; + } + orderOverviewVO.setOverallConversionRate(CurrencyUtil.mul(overallConversionRate, 100) + "%"); + } + + @Override + public long orderNum(String orderStatus) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CharSequenceUtil.isNotEmpty(orderStatus), Order::getOrderStatus, orderStatus); + queryWrapper.eq(CharSequenceUtil.equals(Objects.requireNonNull(UserContext.getCurrentUser()).getRole().name(), UserEnums.STORE.name()), + Order::getStoreId, UserContext.getCurrentUser().getStoreId()); + return this.count(queryWrapper); + } + + @Override + public List statisticsChart(StatisticsQueryParam statisticsQueryParam) { + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + QueryWrapper queryWrapper = new QueryWrapper(); + //已支付 + queryWrapper.eq("pay_status", PayStatusEnum.PAID.name()); + //选择商家判定 + queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()), "store_id", statisticsQueryParam.getStoreId()); +// 查询时间区间 + queryWrapper.between("create_time", dates[0], dates[1]); +// 格式化时间 + queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m-%d')"); + List orderStatisticsDataVOS = this.baseMapper.getOrderStatisticsData(queryWrapper); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(dates[0]); + + List result = new ArrayList<>(); + //时间判定,将数据填充好 + //如果当前的时间,在结束时间之前 + while (calendar.getTime().before(dates[1])) { + OrderStatisticsDataVO item = null; + //判定是否已经有这一天的数据 + for (OrderStatisticsDataVO orderStatisticsDataVO : orderStatisticsDataVOS) { + if (orderStatisticsDataVO.getCreateTime().equals(calendar.getTime())) { + item = orderStatisticsDataVO; + } + } + //如果数据不存在,则进行数据填充 + if (item == null) { + item = new OrderStatisticsDataVO(); + item.setPrice(0d); + item.setCreateTime(calendar.getTime()); + } + result.add(item); + //增加时间 + calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1); + } + return result; + } + + @Override + public IPage getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + queryWrapper.between("o.create_time", dates[0], dates[1]); + queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()), + "o.store_id", statisticsQueryParam.getStoreId()); + + queryWrapper.eq("o.delete_flag", false); + queryWrapper.groupBy("o.id"); + queryWrapper.orderByDesc("o.id"); + return this.baseMapper.queryByParams(PageUtil.initPage(pageVO), queryWrapper); + } + + private QueryWrapper getQueryWrapper(StatisticsQueryParam statisticsQueryParam) { + + QueryWrapper queryWrapper = Wrappers.query(); + + Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam); + queryWrapper.between("create_time", dates[0], dates[1]); + + //设置店铺ID + queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()), "store_id", statisticsQueryParam.getStoreId()); + + + //设置为付款查询 + queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); + + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewServiceImpl.java similarity index 85% rename from framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewDataServiceImpl.java rename to framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewServiceImpl.java index 48cd985a..5d824068 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewDataServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewServiceImpl.java @@ -1,32 +1,33 @@ package cn.lili.modules.statistics.serviceimpl; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.StatisticsProperties; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.DateUtil; -import cn.lili.config.properties.StatisticsProperties; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; import cn.lili.modules.member.entity.vo.MemberDistributionVO; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.statistics.mapper.PlatformViewDataMapper; -import cn.lili.modules.statistics.model.dos.PlatformViewData; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.enums.SearchTypeEnum; -import cn.lili.modules.statistics.model.vo.OnlineMemberVO; -import cn.lili.modules.statistics.model.vo.PlatformViewVO; -import cn.lili.modules.statistics.service.PlatformViewDataService; +import cn.lili.modules.statistics.entity.dos.PlatformViewData; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.enums.SearchTypeEnum; +import cn.lili.modules.statistics.entity.vo.OnlineMemberVO; +import cn.lili.modules.statistics.entity.vo.PlatformViewVO; +import cn.lili.modules.statistics.mapper.PlatformViewMapper; +import cn.lili.modules.statistics.service.MemberStatisticsService; +import cn.lili.modules.statistics.service.PlatformViewService; import cn.lili.modules.statistics.util.StatisticsDateUtil; import cn.lili.modules.statistics.util.StatisticsSuffix; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -37,29 +38,39 @@ import java.util.List; * * @author Chopper * @version v1.0 - * @Description: * @since v7.0 * 2021/1/18 12:07 */ @Service -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class PlatformViewDataServiceImpl extends ServiceImpl implements PlatformViewDataService { - //在线人数统计 - private final StatisticsProperties statisticsProperties; - //会员 - private final MemberService memberService; - //平台流量统计 - private final PlatformViewDataMapper platformViewDataMapper; - //缓存 - private final Cache cache; +public class PlatformViewServiceImpl extends ServiceImpl implements PlatformViewService { + /** + * 在线人数统计 + */ + @Autowired + private StatisticsProperties statisticsProperties; + /** + * 会员 + */ + @Autowired + private MemberStatisticsService memberStatisticsService; + /** + * 缓存 + */ + @Autowired + private Cache cache; + /** + * 平台流量统计 + */ + @Resource + private PlatformViewMapper platformViewMapper; @Override public Long online() { Object object = cache.get(CachePrefix.ONLINE_NUM.getPrefix()); if (null != object) { - return (Long) cache.get(CachePrefix.ONLINE_NUM.getPrefix()); + return (Long) object; } //这里统计的是有效的accessToken ,如果需要数据精确,需要调整accessToken的有效时间,开发人员建议2小时误差较为合适 Long num = Long.valueOf(cache.keys(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + "*").size()); @@ -72,9 +83,9 @@ public class PlatformViewDataServiceImpl extends ServiceImpl) cache.get(CachePrefix.MEMBER_DISTRIBUTION.getPrefix()); + return (List) object; } - List memberDistributionVOS = memberService.distribution(); + List memberDistributionVOS = memberStatisticsService.distribution(); //统计总数 int count = 0; @@ -120,7 +131,7 @@ public class PlatformViewDataServiceImpl extends ServiceImpl implements RefundOrderStatisticsService { - - //退款统计 - private final RefundOrderStatisticsDataMapper refundOrderStatisticsDataMapper; +public class RefundOrderStatisticsServiceImpl extends ServiceImpl implements RefundOrderStatisticsService { @Override public IPage getRefundOrderStatisticsData(PageVO pageVO, StatisticsQueryParam statisticsQueryParam) { QueryWrapper queryWrapper = getQueryWrapper(statisticsQueryParam); - return refundOrderStatisticsDataMapper.getRefundStatisticsData(PageUtil.initPage(pageVO), queryWrapper); + return this.baseMapper.getRefundStatisticsData(PageUtil.initPage(pageVO), queryWrapper); } @Override diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/SeckillStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/SeckillStatisticsServiceImpl.java new file mode 100644 index 00000000..c3ff5396 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/SeckillStatisticsServiceImpl.java @@ -0,0 +1,32 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.lili.modules.promotion.entity.dos.Seckill; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.modules.statistics.mapper.SeckillStatisticsMapper; +import cn.lili.modules.statistics.service.SeckillStatisticsService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 秒杀活动统计 + * + * @author Chopper + * @since 2020/8/21 + */ +@Service +public class SeckillStatisticsServiceImpl extends ServiceImpl implements SeckillStatisticsService { + + + @Override + public long getApplyNum() { + QueryWrapper queryWrapper = Wrappers.query(); + //秒杀申请时间未超过当前时间 + queryWrapper.ge("apply_end_time", cn.hutool.core.date.DateUtil.date()); + queryWrapper.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)); + return this.count(queryWrapper); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java new file mode 100644 index 00000000..376514cc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java @@ -0,0 +1,218 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.enums.StatisticsQuery; +import cn.lili.modules.statistics.entity.vo.CategoryStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.GoodsStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.OrderOverviewVO; +import cn.lili.modules.statistics.entity.vo.StoreStatisticsDataVO; +import cn.lili.modules.statistics.mapper.StoreFlowStatisticsMapper; +import cn.lili.modules.statistics.service.OrderStatisticsService; +import cn.lili.modules.statistics.service.StoreFlowStatisticsService; +import cn.lili.modules.statistics.util.StatisticsDateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 商品统计业务层实现 + * + * @author Bulbasaur + * @since 2020/12/9 11:30 + */ +@Service +public class StoreFlowStatisticsServiceImpl extends ServiceImpl implements StoreFlowStatisticsService { + + + @Autowired + private OrderStatisticsService orderStatisticsService; + + @Override + public List getGoodsStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam, Integer num) { + //获取查询条件 + QueryWrapper queryWrapper = getQueryWrapper(goodsStatisticsQueryParam); + //根据商品分组 + queryWrapper.groupBy("goods_id"); + queryWrapper.groupBy("goods_name"); + + queryWrapper.eq(!StringUtils.isEmpty(goodsStatisticsQueryParam.getStoreId()), "store_id", goodsStatisticsQueryParam.getStoreId()); + //查询前X记录 + Page page = new Page(1, num); + return this.baseMapper.getGoodsStatisticsData(page, queryWrapper); + } + + @Override + public List getCategoryStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { + //获取查询条件 + QueryWrapper queryWrapper = getQueryWrapper(goodsStatisticsQueryParam); + //根据分类分组 + queryWrapper.groupBy("category_id"); + return this.baseMapper.getCateGoryStatisticsData(queryWrapper); + } + + @Override + public List getStoreStatisticsData(Page page, QueryWrapper queryWrapper) { + return this.baseMapper.getStoreStatisticsData(page, queryWrapper); + } + + @Override + public Map getOrderStatisticsPrice() { + QueryWrapper queryWrapper = Wrappers.query(); + //支付订单 + queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); + + //商家查询,则增加商家判定 + AuthUser authUser = UserContext.getCurrentUser(); + if (authUser.getRole().equals(UserEnums.STORE)) { + queryWrapper.eq("store_id", authUser.getStoreId()); + } + //大于今天凌晨 + queryWrapper.ge("create_time", cn.lili.common.utils.DateUtil.startOfTodDayTime()); + + queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num"); + return this.getMap(queryWrapper); + } + + + @Override + public void overview(Date[] dates, OrderOverviewVO orderOverviewVO, StatisticsQueryParam statisticsQueryParam) { + //下单统计 + initOrder(dates, orderOverviewVO, statisticsQueryParam); + + //付款统计 + initPayment(dates, orderOverviewVO, statisticsQueryParam); + + //退单统计 + initAfterSale(dates, orderOverviewVO, statisticsQueryParam); + } + + /** + * 订单统计-下单属性填充 + * + * @param dates + * @param orderOverviewVO + */ + private void initOrder(Date[] dates, OrderOverviewVO orderOverviewVO, StatisticsQueryParam statisticsQueryParam) { + //构建查询条件 + QueryWrapper queryWrapper = Wrappers.query(); + //时间区间 + queryWrapper.between("create_time", dates[0], dates[1]); + //如果有店铺id传入,则查询店铺 + if (StringUtils.isNotEmpty(statisticsQueryParam.getStoreId())) { + queryWrapper.eq("store_id", statisticsQueryParam.getStoreId()); + } + //查询流水金额和订单数量 + queryWrapper.select("SUM(flow_price) AS price , COUNT(0) AS num"); + //获取查询结果 + Map order = orderStatisticsService.getMap(queryWrapper); + //赋予订单数和流水金额 + orderOverviewVO.setOrderNum(order != null && order.containsKey("num") ? (Long) order.get("num") : 0L); + orderOverviewVO.setOrderAmount(order != null && order.containsKey("price") ? (double) order.get("price") : 0L); + + //查询下单人数 + queryWrapper = Wrappers.query(); + //时间区间 + queryWrapper.between("create_time", dates[0], dates[1]); + //如果有店铺id传入,则查询店铺 + if (StringUtils.isNotEmpty(statisticsQueryParam.getStoreId())) { + queryWrapper.eq("store_id", statisticsQueryParam.getStoreId()); + } + //查询下单人数的sql + queryWrapper.select("count(DISTINCT member_id) AS num"); + //获取查询结果 + Map memberNum = this.getMap(queryWrapper); + //写入下单人数 + orderOverviewVO.setOrderMemberNum(memberNum != null && memberNum.containsKey("num") ? (Long) memberNum.get("num") : 0L); + } + + /** + * 订单统计-付款属性填充 + * + * @param dates + * @param orderOverviewVO + */ + private void initPayment(Date[] dates, OrderOverviewVO orderOverviewVO, StatisticsQueryParam statisticsQueryParam) { + //付款订单数,付款金额 + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.between("create_time", dates[0], dates[1]); + //如果有店铺id传入,则查询店铺 + if (StringUtils.isNotEmpty(statisticsQueryParam.getStoreId())) { + queryWrapper.eq("store_id", statisticsQueryParam.getStoreId()); + } + queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num"); + queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); + Map payment = this.getMap(queryWrapper); + + orderOverviewVO.setPaymentOrderNum(payment != null && payment.containsKey("num") ? (Long) payment.get("num") : 0L); + orderOverviewVO.setPaymentAmount(payment != null && payment.containsKey("price") ? (Double) payment.get("price") : 0D); + + + //如果有店铺id传入,则查询店铺 + if (StringUtils.isNotEmpty(statisticsQueryParam.getStoreId())) { + orderOverviewVO.setPaymentsNum(baseMapper.countPayersByStore(statisticsQueryParam.getStoreId(), dates[0], dates[1])); + } else { + orderOverviewVO.setPaymentsNum(baseMapper.countPayers(dates[0], dates[1])); + } + } + + /** + * 订单统计-付款属性填充 + * + * @param dates + * @param orderOverviewVO + */ + private void initAfterSale(Date[] dates, OrderOverviewVO orderOverviewVO, StatisticsQueryParam statisticsQueryParam) { + //付款订单数,付款金额 + QueryWrapper queryWrapper = Wrappers.query(); + queryWrapper.between("create_time", dates[0], dates[1]); + queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num"); + //如果有店铺id传入,则查询店铺 + if (StringUtils.isNotEmpty(statisticsQueryParam.getStoreId())) { + queryWrapper.eq("store_id", statisticsQueryParam.getStoreId()); + } + queryWrapper.eq("flow_type", FlowTypeEnum.REFUND.name()); + Map payment = this.getMap(queryWrapper); + orderOverviewVO.setRefundOrderNum(payment != null && payment.containsKey("num") ? (Long) payment.get("num") : 0L); + orderOverviewVO.setRefundOrderPrice(payment != null && payment.containsKey("price") ? (Double) payment.get("price") : 0D); + } + + + /** + * 组织查询条件 + * + * @param goodsStatisticsQueryParam + * @return + */ + private QueryWrapper getQueryWrapper(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { + + QueryWrapper queryWrapper = Wrappers.query(); + //判断搜索类型是:年、月 + Date[] date = StatisticsDateUtil.getDateArray(goodsStatisticsQueryParam); + queryWrapper.between("create_time", date[0], date[1]); + + //判断是按照数量统计还是按照金额统计 + if (goodsStatisticsQueryParam.getType().equals(StatisticsQuery.PRICE.name())) { + queryWrapper.orderByDesc("price"); + } else { + queryWrapper.orderByDesc("num"); + } + //设置为付款查询 + queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name()); + return queryWrapper; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreStatisticsServiceImpl.java new file mode 100644 index 00000000..cba2e6e6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreStatisticsServiceImpl.java @@ -0,0 +1,46 @@ +package cn.lili.modules.statistics.serviceimpl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.lili.modules.statistics.mapper.StoreStatisticsMapper; +import cn.lili.modules.statistics.service.StoreStatisticsService; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.modules.store.entity.enums.StoreStatusEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 商品统计业务层实现 + * + * @author Bulbasaur + * @since 2020/12/9 11:30 + */ +@Service +public class StoreStatisticsServiceImpl extends ServiceImpl implements StoreStatisticsService { + + + @Override + public long auditNum() { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Store::getStoreDisable, StoreStatusEnum.APPLYING.name()); + return this.count(queryWrapper); + } + + @Override + public long storeNum() { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name()); + return this.count(queryWrapper); + } + + @Override + public long todayStoreNum() { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name()); + queryWrapper.ge(Store::getCreateTime, DateUtil.beginOfDay(new DateTime())); + return this.count(queryWrapper); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java index 54ade392..0d785817 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java +++ b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java @@ -1,8 +1,10 @@ package cn.lili.modules.statistics.util; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.StringUtils; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.enums.SearchTypeEnum; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.enums.SearchTypeEnum; import java.util.Calendar; import java.util.Date; @@ -11,7 +13,7 @@ import java.util.Date; * 统计缓存后缀工具 * * @author Chopper - * @date 2021-01-15 15:30 + * @since 2021-01-15 15:30 */ public class StatisticsDateUtil { @@ -26,7 +28,7 @@ public class StatisticsDateUtil { Date[] dateArray = new Date[2]; Calendar calendar = Calendar.getInstance(); - // 时间归到今天凌晨0点 + //时间归到今天凌晨0点 calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); @@ -72,6 +74,8 @@ public class StatisticsDateUtil { //获取过去七天 dateArray[1] = calendar.getTime(); break; + default: + throw new ServiceException(ResultCode.ERROR); } return dateArray; } @@ -88,7 +92,14 @@ public class StatisticsDateUtil { Date[] dateArray = new Date[2]; Calendar calendar = Calendar.getInstance(); - calendar.set(year, month, 0); + + //时间归到今天凌晨0点 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + calendar.set(year, month, 1); dateArray[1] = calendar.getTime(); calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); dateArray[0] = calendar.getTime(); @@ -117,4 +128,30 @@ public class StatisticsDateUtil { } } + + /** + * 根据一个日期,获取这一天的开始时间和结束时间 + * + * @param queryDate + * @return + */ + public static Date[] getDateArray(Date queryDate) { + + Date[] dateArray = new Date[2]; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(queryDate); + //时间归到今天凌晨0点 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + dateArray[0] = calendar.getTime(); + + calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1); + calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 1); + + dateArray[1] = calendar.getTime(); + return dateArray; + } + } diff --git a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsSuffix.java b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsSuffix.java index 1f83aae9..f6826cd9 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsSuffix.java +++ b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsSuffix.java @@ -6,7 +6,7 @@ import java.util.Calendar; * 统计缓存后缀工具 * * @author Chopper - * @date 2021-01-15 15:30 + * @since 2021-01-15 15:30 */ public class StatisticsSuffix { @@ -16,7 +16,7 @@ public class StatisticsSuffix { * * @return */ - public static String suffix() { // 取得系统当前时间 + public static String suffix() { //取得系统当前时间 Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; @@ -30,7 +30,7 @@ public class StatisticsSuffix { * * @return */ - public static String suffix(Calendar calendar) { // 取得系统当前时间 + public static String suffix(Calendar calendar) { //取得系统当前时间 int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DAY_OF_MONTH); diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java index 23dd4d19..02d2fe2c 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/Bill.java @@ -1,9 +1,9 @@ package cn.lili.modules.store.entity.dos; import cn.lili.modules.store.entity.enums.BillStatusEnum; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -12,31 +12,21 @@ import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 结算单 * * @author Chopper - * @date 2020/11/17 4:27 下午 + * @since 2020/11/17 4:27 下午 */ @Data -@Entity -@Table(name = "li_bill") @TableName("li_bill") @ApiModel(value = "结算单") -public class Bill { +public class Bill extends BaseIdEntity { private static final long serialVersionUID = 1L; - @Id - @TableId - @TableField - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id ; @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @@ -86,11 +76,6 @@ public class Bill { @ApiModelProperty(value = "支行联行号") private String bankCode; - ////开始算钱啦 - //billPrice=orderPrice-refundPrice - // -commissionPrice+refundCommissionPrice - // -distributionCommission+distributionRefundCommission - // +siteCouponCommission-siteCouponRefundCommission @ApiModelProperty(value = "结算周期内订单付款总金额") private Double orderPrice; @@ -115,6 +100,22 @@ public class Bill { @ApiModelProperty(value = "退货平台优惠券补贴返还") private Double siteCouponRefundCommission; + @ApiModelProperty(value = "积分商品结算价格") + private Double pointSettlementPrice; + + @ApiModelProperty(value = "砍价商品结算价格") + private Double kanjiaSettlementPrice; + + + /** + * 开始算钱啦 + * billPrice(最终结算金额) = + * orderPrice(结算周期内订单付款总金额) - refundPrice(退单金额) + * - commissionPrice(平台收取佣金) + refundCommissionPrice(退单产生退还佣金金额) + * - distributionCommission(分销返现支出) + distributionRefundCommission(分销订单退还,返现佣金返还) + * + siteCouponCommission(平台优惠券补贴) - siteCouponRefundCommission(退货平台优惠券补贴返还) + * + kanjiaSettlementPrice(砍价商品结算价格) + pointSettlementPrice(pointSettlementPrice) + */ @ApiModelProperty(value = "最终结算金额") private Double billPrice; diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java index 98058968..17184bf0 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java @@ -1,25 +1,21 @@ package cn.lili.modules.store.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import cn.lili.modules.store.entity.enums.FreightTemplateEnum; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; /** * 运费模板 - * @author Chopper - * @date 2020/11/17 4:27 下午 * + * @author Chopper + * @since 2020/11/17 4:27 下午 */ @Data -@Entity -@Table(name = "li_freight_template") @TableName("li_freight_template") @ApiModel(value = "运费模板") public class FreightTemplate extends BaseEntity { @@ -35,7 +31,7 @@ public class FreightTemplate extends BaseEntity { * @see FreightTemplateEnum */ @NotEmpty(message = "计价方式不能为空") - @ApiModelProperty(value = "计价方式:按件、按重量", allowableValues = "WEIGHT, NUM") + @ApiModelProperty(value = "计价方式:按件、按重量", allowableValues = "WEIGHT,NUM,FREE") private String pricingMethod; diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplateChild.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplateChild.java index 8cbe4ef9..52302320 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplateChild.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplateChild.java @@ -1,24 +1,19 @@ package cn.lili.modules.store.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 运费模板子配置 * * @author Chopper - * @date 2020/11/17 4:27 下午 + * @since 2020/11/17 4:27 下午 */ @Data -@Entity -@Table(name = "li_freight_template_child") @TableName("li_freight_template_child") @ApiModel(value = "运费模板子配置") public class FreightTemplateChild extends BaseEntity { @@ -41,11 +36,9 @@ public class FreightTemplateChild extends BaseEntity { private Double continuedPrice; @ApiModelProperty(value = "地址,示例参数:上海,江苏,浙江") - @Column(columnDefinition = "TEXT") private String area; @ApiModelProperty(value = "地区ID,示例参数:1,2,3,4") - @Column(columnDefinition = "TEXT") private String areaId; } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java index c271a186..6ff831b7 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java @@ -1,6 +1,6 @@ package cn.lili.modules.store.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import cn.lili.common.utils.BeanUtil; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.store.entity.dto.AdminStoreApplyDTO; @@ -13,8 +13,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; @@ -24,11 +22,9 @@ import java.util.Date; * 店铺 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @Data -@Entity -@Table(name = "li_store") @TableName("li_store") @ApiModel(value = "店铺") @NoArgsConstructor @@ -86,7 +82,7 @@ public class Store extends BaseEntity { @ApiModelProperty(value = "服务评分") private Double serviceScore; - @ApiModelProperty(value = "物流描述") + @ApiModelProperty(value = "物流评分") private Double deliveryScore; @ApiModelProperty(value = "商品数量") @@ -95,6 +91,35 @@ public class Store extends BaseEntity { @ApiModelProperty(value = "收藏数量") private Integer collectionNum; + @ApiModelProperty(value = "腾讯云智服唯一标识") + private String yzfSign; + + @ApiModelProperty(value = "腾讯云智服小程序唯一标识") + private String yzfMpSign; + + @ApiModelProperty(value = "udesk IM标识") + private String merchantEuid; + + public Boolean getPageShow() { + if(pageShow == null){ + return false; + } + return pageShow; + } + + public Boolean getSelfPickFlag() { + if(selfPickFlag == null){ + return false; + } + return selfPickFlag; + } + + @ApiModelProperty(value = "默认页面是否开启") + private Boolean pageShow; + + @ApiModelProperty(value = "是否开启自提") + private Boolean selfPickFlag; + public Store(Member member) { this.memberId = member.getId(); this.memberName = member.getUsername(); @@ -103,11 +128,13 @@ public class Store extends BaseEntity { deliveryScore = 5.0; serviceScore = 5.0; descriptionScore = 5.0; - goodsNum=0; - collectionNum=0; + goodsNum = 0; + collectionNum = 0; + this.selfPickFlag = false; + this.pageShow = false; } - public Store(Member member,AdminStoreApplyDTO adminStoreApplyDTO) { + public Store(Member member, AdminStoreApplyDTO adminStoreApplyDTO) { BeanUtil.copyProperties(adminStoreApplyDTO, this); this.memberId = member.getId(); @@ -117,8 +144,10 @@ public class Store extends BaseEntity { deliveryScore = 5.0; serviceScore = 5.0; descriptionScore = 5.0; - goodsNum=0; - collectionNum=0; + goodsNum = 0; + collectionNum = 0; + this.selfPickFlag = false; + this.pageShow = false; } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreAddress.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreAddress.java index b2b91782..60e40df7 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreAddress.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreAddress.java @@ -1,25 +1,21 @@ package cn.lili.modules.store.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; /** * 店铺自提点 * * @author Bulbasaur - * @date 2020/12/7 15:09 + * @since 2020/12/7 15:09 */ @Data -@Entity @TableName("li_store_address") -@Table(name = "li_store_address") @ApiModel(value = "店铺自提点") public class StoreAddress extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreDetail.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreDetail.java index e1ac24c8..bf4538a0 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreDetail.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreDetail.java @@ -4,9 +4,10 @@ package cn.lili.modules.store.entity.dos; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.lili.common.validation.Mobile; +import cn.lili.common.validation.Phone; import cn.lili.modules.store.entity.dto.AdminStoreApplyDTO; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -16,36 +17,26 @@ import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.*; +import javax.validation.constraints.Email; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; import java.util.Date; /** * 店铺详细 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @Data -@Entity -@Table(name = "li_store_detail") @TableName("li_store_detail") @ApiModel(value = "店铺详细") @NoArgsConstructor -public class StoreDetail { +public class StoreDetail extends BaseIdEntity { private static final long serialVersionUID = 4949782642253898816L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @NotBlank(message = "店铺不能为空") @ApiModelProperty(value = "店铺id") private String storeId; @@ -93,7 +84,7 @@ public class StoreDetail { private String linkName; @NotBlank(message = "手机号不能为空") - @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") + @Phone @ApiModelProperty(value = "联系人电话") private String linkPhone; @@ -101,7 +92,6 @@ public class StoreDetail { @ApiModelProperty(value = "营业执照号") private String licenseNum; - @Size(min = 1, max = 200, message = "法定经营范围长度为1-200位字符") @ApiModelProperty(value = "法定经营范围") private String scope; @@ -145,7 +135,6 @@ public class StoreDetail { @NotBlank(message = "店铺经营类目不能为空") @ApiModelProperty(value = "店铺经营类目") - @Column(columnDefinition = "TEXT") private String goodsManagementCategory; @ApiModelProperty(value = "结算周期") @@ -168,6 +157,7 @@ public class StoreDetail { private String ddCode; //店铺退货收件地址 + @ApiModelProperty(value = "收货人姓名") private String salesConsigneeName; @@ -184,13 +174,27 @@ public class StoreDetail { private String salesConsigneeDetail; - public StoreDetail(Store store, AdminStoreApplyDTO adminStoreApplyDTO){ - this.storeId=store.getId(); + //店铺发货地址 + @ApiModelProperty(value = "发货人姓名") + private String salesConsignorName; + + @ApiModelProperty(value = "发件人手机") + private String salesConsignorMobile; + + @ApiModelProperty(value = "发件人地址Id, ','分割") + private String salesConsignorAddressId; + + @ApiModelProperty(value = "发件人地址名称, ','分割") + private String salesConsignorAddressPath; + + @ApiModelProperty(value = "发件人详细地址") + private String salesConsignorDetail; + + public StoreDetail(Store store, AdminStoreApplyDTO adminStoreApplyDTO) { + this.storeId = store.getId(); //设置店铺公司信息、设置店铺银行信息、设置店铺其他信息 BeanUtil.copyProperties(adminStoreApplyDTO, this); - this.settlementDay= DateUtil.date(); - this.stockWarning=10; + this.settlementDay = DateUtil.date(); + this.stockWarning = 10; } - - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java index b88b84b3..872f140c 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java @@ -1,6 +1,7 @@ package cn.lili.modules.store.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.modules.store.entity.dto.StoreLogisticsCustomerDTO; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,19 +9,15 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotNull; /** * 店铺-物流公司设置 * * @author Chopper - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ @Data -@Entity -@Table(name = "li_store_logistics") @TableName("li_store_logistics") @ApiModel(value = "店铺-物流公司") @AllArgsConstructor @@ -34,7 +31,43 @@ public class StoreLogistics extends BaseEntity { @ApiModelProperty(value = "物流公司ID") @NotNull - private String LogisticsId; + private String logisticsId; + + @ApiModelProperty(value = "客户代码") + private String customerName; + + @ApiModelProperty(value = "客户密码") + private String customerPwd; + + @ApiModelProperty(value = "密钥") + private String monthCode; + + @ApiModelProperty(value = "归属网点/网点编码") + private String sendSite; + + @ApiModelProperty(value = "收件快递员") + private String sendStaff; + + @ApiModelProperty(value = "是否使用电子面单") + private boolean faceSheetFlag; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "快递类型") + private String expType; + + public StoreLogistics(StoreLogisticsCustomerDTO storeLogisticsCustomerDTO){ + this.customerName=storeLogisticsCustomerDTO.getCustomerName(); + this.customerPwd=storeLogisticsCustomerDTO.getCustomerPwd(); + this.sendSite=storeLogisticsCustomerDTO.getSendSite(); + this.sendStaff=storeLogisticsCustomerDTO.getSendStaff(); + this.monthCode=storeLogisticsCustomerDTO.getMonthCode(); + this.faceSheetFlag=storeLogisticsCustomerDTO.isFaceSheetFlag(); + this.payType = storeLogisticsCustomerDTO.getPayType(); + this.expType = storeLogisticsCustomerDTO.getExpType(); + } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/AdminStoreApplyDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/AdminStoreApplyDTO.java index a8d63597..40020336 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/AdminStoreApplyDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/AdminStoreApplyDTO.java @@ -1,6 +1,6 @@ package cn.lili.modules.store.entity.dto; -import com.baomidou.mybatisplus.annotation.TableField; +import cn.lili.common.validation.Mobile; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; @@ -11,7 +11,7 @@ import javax.validation.constraints.*; * 后台添加店铺信息DTO * * @author Bulbasaur - * @date 2020/12/12 11:35 + * @since 2020/12/12 11:35 */ @Data public class AdminStoreApplyDTO { @@ -40,7 +40,7 @@ public class AdminStoreApplyDTO { private String goodsManagementCategory; @ApiModelProperty(value = "是否自营") - private boolean selfOperated; + private Boolean selfOperated; @ApiModelProperty(value = "地址名称, ','分割") private String storeAddressPath; @@ -57,6 +57,7 @@ public class AdminStoreApplyDTO { @ApiModelProperty(value = "公司名称") private String companyName; + @Mobile @ApiModelProperty(value = "公司电话") private String companyPhone; @@ -98,7 +99,6 @@ public class AdminStoreApplyDTO { @ApiModelProperty(value = "营业执照号") private String licenseNum; - @Size(min = 1, max = 200, message = "法定经营范围长度为1-200位字符") @ApiModelProperty(value = "法定经营范围") private String scope; diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/BillDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/BillDTO.java index 36e0c602..b3ba6aff 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/BillDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/BillDTO.java @@ -3,14 +3,13 @@ package cn.lili.modules.store.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Column; import java.io.Serializable; /** * 结算单传输对象 * * @author Chopper - * @date 2020/11/17 4:26 下午 + * @since 2020/11/17 4:26 下午 */ @Data public class BillDTO implements Serializable { @@ -18,42 +17,33 @@ public class BillDTO implements Serializable { private static final long serialVersionUID = 4441580387361184989L; - @Column(name = "order_price") @ApiModelProperty(value = "结算周期内订单付款总金额") private Double orderPrice; - @Column(name = "refund_price") @ApiModelProperty(value = "退单金额") private Double refundPrice; - @Column(name = "commission_price") @ApiModelProperty(value = "平台收取佣金") private Double commissionPrice; - @Column(name = "refund_commission_price") @ApiModelProperty(value = "退单产生退还佣金金额") private Double refundCommissionPrice; - @Column(name = "distribution_commission") @ApiModelProperty(value = "分销返现支出") private Double distributionCommission; - @Column(name = "distribution_refund_commission") @ApiModelProperty(value = "分销订单退还,返现佣金返还") private Double distributionRefundCommission; - @Column(name = "site_coupon_commission") @ApiModelProperty(value = "平台优惠券补贴") private Double siteCouponCommission; - @Column(name = "site_coupon_refund_commission") @ApiModelProperty(value = "退货平台优惠券补贴返还") private Double siteCouponRefundCommission; - @Column(name = "site_coupon_price") @ApiModelProperty(value = "平台优惠券 使用金额") private Double siteCouponPrice; - @Column(name = "site_coupon_point") + @ApiModelProperty(value = "平台优惠券 返点") private Double siteCouponPoint; diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/BillSearchParams.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/BillSearchParams.java index 1ca3b421..5e0b190e 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/BillSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/BillSearchParams.java @@ -15,7 +15,7 @@ import org.springframework.format.annotation.DateTimeFormat; * 结算单搜索参数 * * @author Chopper - * @date 2021/3/17 6:08 下午 + * @since 2021/3/17 6:08 下午 */ @Data public class BillSearchParams extends PageVO { @@ -51,6 +51,10 @@ public class BillSearchParams extends PageVO { //创建时间 if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(endDate)) { wrapper.between("create_time", startDate, endDate); + } else if (StringUtils.isNotEmpty(startDate)) { + wrapper.ge("create_time", startDate); + } else if (StringUtils.isNotEmpty(endDate)) { + wrapper.le("create_time", endDate); } //账单号 wrapper.eq(StringUtils.isNotEmpty(sn), "sn", sn); @@ -58,7 +62,7 @@ public class BillSearchParams extends PageVO { wrapper.eq(StringUtils.isNotEmpty(billStatus), "bill_status", billStatus); //店铺名称 wrapper.eq(StringUtils.isNotEmpty(storeName), "store_name", storeName); - // 按卖家查询 + //按卖家查询 wrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), "store_id", UserContext.getCurrentUser().getStoreId()); return wrapper; diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/FreightTemplateChildDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/FreightTemplateChildDTO.java index ae6bc9b1..81aeb8eb 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/FreightTemplateChildDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/FreightTemplateChildDTO.java @@ -14,7 +14,7 @@ import javax.validation.constraints.NotEmpty; * 模版详细配置 * * @author pikachu - * @date 2018-08-22 15:10:51 + * @since 2018-08-22 15:10:51 */ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreAfterSaleAddressDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreAfterSaleAddressDTO.java index a6c48a8f..36e3c869 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreAfterSaleAddressDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreAfterSaleAddressDTO.java @@ -7,7 +7,7 @@ import lombok.Data; * 店铺售后收件地址 * * @author pikachu - * @date 2020-08-22 15:10:51 + * @since 2020-08-22 15:10:51 */ @Data public class StoreAfterSaleAddressDTO { diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreBankDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreBankDTO.java index f846dcf5..5309cdeb 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreBankDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreBankDTO.java @@ -2,6 +2,7 @@ package cn.lili.modules.store.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; @@ -10,28 +11,27 @@ import javax.validation.constraints.Size; * 店铺-银行信息 * * @author Bulbasaur - * @date 2020/12/7 15:54 + * @since 2020/12/7 15:54 */ @Data public class StoreBankDTO { - //结算银行信息 - @Size(min = 1, max = 200) + @Length(min = 1, max = 200) @NotBlank(message = "结算银行开户行名称不能为空") @ApiModelProperty(value = "结算银行开户行名称") private String settlementBankAccountName; - @Size(min = 1, max = 200) + @Length(min = 1, max = 200) @NotBlank(message = "结算银行开户账号不能为空") @ApiModelProperty(value = "结算银行开户账号") private String settlementBankAccountNum; - @Size(min = 1, max = 200) + @Length(min = 1, max = 200) @NotBlank(message = "结算银行开户支行名称不能为空") @ApiModelProperty(value = "结算银行开户支行名称") private String settlementBankBranchName; - @Size(min = 1, max = 50) + @Length(min = 1, max = 50) @NotBlank(message = "结算银行支行联行号不能为空") @ApiModelProperty(value = "结算银行支行联行号") private String settlementBankJointName; diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreCompanyDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreCompanyDTO.java index d2d48d31..c6761160 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreCompanyDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreCompanyDTO.java @@ -1,5 +1,6 @@ package cn.lili.modules.store.entity.dto; +import cn.lili.common.validation.Mobile; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; @@ -10,32 +11,33 @@ import javax.validation.constraints.*; * 店铺-公司信息 * * @author Bulbasaur - * @date 2020/12/7 15:50 + * @since 2020/12/7 15:50 */ @Data public class StoreCompanyDTO { //公司基本信息 + @Size(min = 2, max = 100) @NotBlank(message = "公司名称不能为空") @ApiModelProperty(value = "公司名称") private String companyName; - @Size(min = 2, max = 100) - @NotBlank(message = "地址不能为空") - @ApiModelProperty(value = "地址名称, ','分割") - private String addressPath; + @ApiModelProperty(value = "公司地址地区Id") + private String companyAddressIdPath; - @Size(min = 2, max = 100) - @NotBlank(message = "地址ID不能为空") - @ApiModelProperty(value = "地址id,','分割 ") - private String addressIdPath; + @ApiModelProperty(value = "公司地址地区") + private String companyAddressPath; @Size(min = 1, max = 200) @NotBlank(message = "公司地址不能为空") @ApiModelProperty(value = "公司地址") private String companyAddress; + @Mobile + @ApiModelProperty(value = "公司电话") + private String companyPhone; + @Email @ApiModelProperty(value = "电子邮箱") private String companyEmail; @@ -59,6 +61,7 @@ public class StoreCompanyDTO { private String linkPhone; //营业执照信息 + @Size(min = 18, max = 18) @ApiModelProperty(value = "营业执照号") private String licenseNum; @@ -72,6 +75,7 @@ public class StoreCompanyDTO { private String licencePhoto; //法人信息 + @Size(min = 2, max = 20) @NotBlank(message = "法人姓名不能为空") @ApiModelProperty(value = "法人姓名") diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreDeliverGoodsAddressDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreDeliverGoodsAddressDTO.java new file mode 100644 index 00000000..23e5c87d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreDeliverGoodsAddressDTO.java @@ -0,0 +1,30 @@ +package cn.lili.modules.store.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 店铺发货地址 + * + * @author chc + * @since 2022-4-12 10:14:05 + */ +@Data +public class StoreDeliverGoodsAddressDTO { + + @ApiModelProperty(value = "发货人姓名") + private String salesConsignorName; + + @ApiModelProperty(value = "发货人手机号") + private String salesConsignorMobile; + + @ApiModelProperty(value = "地址Id, ','分割") + private String salesConsignorAddressId; + + @ApiModelProperty(value = "地址名称, ','分割") + private String salesConsignorAddressPath; + + @ApiModelProperty(value = "详细地址") + private String salesConsignorDetail; + +} diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java index 16273681..4c460945 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java @@ -1,9 +1,12 @@ package cn.lili.modules.store.entity.dto; -import cn.lili.modules.store.entity.dos.StoreDetail; +import cn.lili.common.validation.Phone; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; @@ -11,16 +14,148 @@ import javax.validation.constraints.Size; * 店铺修改DTO * * @author pikachu - * @date 2020-08-22 15:10:51 + * @since 2020-08-22 15:10:51 */ @Data -public class StoreEditDTO extends StoreDetail { +public class StoreEditDTO { + + + @ApiModelProperty(value = "唯一标识", hidden = true) + private String id; + + @NotBlank(message = "店铺不能为空") + @ApiModelProperty(value = "店铺id") + private String storeId; + + @Size(min = 2, max = 200, message = "店铺名称长度为2-200位") + @NotBlank(message = "店铺名称不能为空") + @ApiModelProperty(value = "店铺名称") + private String storeName; + + @NotBlank(message = "公司名称不能为空") + @Size(min = 2, max = 100, message = "公司名称错误") + @ApiModelProperty(value = "公司名称") + private String companyName; + + @NotBlank(message = "公司地址不能为空") + @Size(min = 1, max = 200, message = "公司地址,长度为1-200字符") + @ApiModelProperty(value = "公司地址") + private String companyAddress; + + @ApiModelProperty(value = "公司地址地区Id") + private String companyAddressIdPath; + + @ApiModelProperty(value = "公司地址地区") + private String companyAddressPath; + + @ApiModelProperty(value = "公司电话") + private String companyPhone; + + @ApiModelProperty(value = "电子邮箱") + private String companyEmail; + + @Min(value = 1, message = "员工总数,至少一位") + @ApiModelProperty(value = "员工总数") + private Integer employeeNum; + + @Min(value = 1, message = "注册资金,至少一位") + @ApiModelProperty(value = "注册资金") + private Double registeredCapital; + + @NotBlank(message = "联系人姓名为空") + @Length(min = 2, max = 20, message = "联系人长度为:2-20位字符") + @ApiModelProperty(value = "联系人姓名") + private String linkName; + + @NotBlank(message = "手机号不能为空") + @Phone + @ApiModelProperty(value = "联系人电话") + private String linkPhone; + + @Size(min = 18, max = 18, message = "营业执照长度为18位字符") + @ApiModelProperty(value = "营业执照号") + private String licenseNum; + + @ApiModelProperty(value = "法定经营范围") + private String scope; + + @NotBlank(message = "营业执照电子版不能为空") + @ApiModelProperty(value = "营业执照电子版") + private String licencePhoto; + + @NotBlank(message = "法人姓名不能为空") + @Size(min = 2, max = 20, message = "法人姓名长度为2-20位字符") + @ApiModelProperty(value = "法人姓名") + private String legalName; + + @NotBlank(message = "法人身份证不能为空") + @Size(min = 18, max = 18, message = "法人身份证号长度为18位") + @ApiModelProperty(value = "法人身份证") + private String legalId; + + @NotBlank(message = "法人身份证不能为空") + @ApiModelProperty(value = "法人身份证照片") + private String legalPhoto; + + @Size(min = 1, max = 200, message = "结算银行开户行名称长度为1-200位") + @NotBlank(message = "结算银行开户行名称不能为空") + @ApiModelProperty(value = "结算银行开户行名称") + private String settlementBankAccountName; + + @Size(min = 1, max = 200, message = "结算银行开户账号长度为1-200位") + @NotBlank(message = "结算银行开户账号不能为空") + @ApiModelProperty(value = "结算银行开户账号") + private String settlementBankAccountNum; + + @Size(min = 1, max = 200, message = "结算银行开户支行名称长度为1-200位") + @NotBlank(message = "结算银行开户支行名称不能为空") + @ApiModelProperty(value = "结算银行开户支行名称") + private String settlementBankBranchName; + + @Size(min = 1, max = 50, message = "结算银行支行联行号长度为1-200位") + @NotBlank(message = "结算银行支行联行号不能为空") + @ApiModelProperty(value = "结算银行支行联行号") + private String settlementBankJointName; + + @NotBlank(message = "店铺经营类目不能为空") + @ApiModelProperty(value = "店铺经营类目") + private String goodsManagementCategory; + + @ApiModelProperty(value = "结算周期") + private String settlementCycle; + + + @ApiModelProperty(value = "库存预警数量") + private Integer stockWarning; + + /** + * 同城配送达达店铺编码 + */ + @ApiModelProperty(value = "同城配送达达店铺编码") + @TableField(value = "dd_code") + private String ddCode; + + //店铺退货收件地址 + @ApiModelProperty(value = "收货人姓名") + private String salesConsigneeName; + + @ApiModelProperty(value = "收件人手机") + private String salesConsigneeMobile; + + @ApiModelProperty(value = "地址Id, ','分割") + private String salesConsigneeAddressId; + + @ApiModelProperty(value = "地址名称, ','分割") + private String salesConsigneeAddressPath; + + @ApiModelProperty(value = "详细地址") + private String salesConsigneeDetail; @ApiModelProperty(value = "店铺状态") private String storeDisable; @ApiModelProperty(value = "是否自营", required = true) - private Integer selfOperated; + private Boolean selfOperated; @ApiModelProperty(value = "经纬度") private String storeCenter; @@ -42,4 +177,10 @@ public class StoreEditDTO extends StoreDetail { @ApiModelProperty(value = "详细地址") private String storeAddressDetail; + @ApiModelProperty(value = "腾讯云智服唯一标识") + private String yzfSign; + + @ApiModelProperty(value = "腾讯云智服小程序唯一标识") + private String yzfMpSign; + } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreLogisticsCustomerDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreLogisticsCustomerDTO.java new file mode 100644 index 00000000..b5fc8589 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreLogisticsCustomerDTO.java @@ -0,0 +1,41 @@ +package cn.lili.modules.store.entity.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商家使用电子面单客户号DTO + * + * @author chc + * @since 2022-4-13 10:00:58 + */ +@Data +@ApiModel +public class StoreLogisticsCustomerDTO { + + @ApiModelProperty(value = "客户代码") + private String customerName; + + @ApiModelProperty(value = "客户密码") + private String customerPwd; + + @ApiModelProperty(value = "密钥") + private String monthCode; + + @ApiModelProperty(value = "归属网点/网点编码") + private String sendSite; + + @ApiModelProperty(value = "收件快递员") + private String sendStaff; + + @ApiModelProperty(value = "是否使用电子面单") + private boolean faceSheetFlag; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "快递类型") + private String expType; + +} diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreOtherInfoDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreOtherInfoDTO.java index db5e79cd..08d35795 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreOtherInfoDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreOtherInfoDTO.java @@ -11,7 +11,7 @@ import javax.validation.constraints.Size; * 店铺入驻其他信息 * * @author Bulbasaur - * @date 2020/12/7 16:16 + * @since 2020/12/7 16:16 */ @Data public class StoreOtherInfoDTO { @@ -37,4 +37,16 @@ public class StoreOtherInfoDTO { @ApiModelProperty(value = "店铺经营类目") private String goodsManagementCategory; + @NotBlank(message = "地址不能为空") + @ApiModelProperty(value = "地址名称, ','分割") + private String storeAddressPath; + + @NotBlank(message = "地址ID不能为空") + @ApiModelProperty(value = "地址id,','分割 ") + private String storeAddressIdPath; + + @NotBlank(message = "地址详情") + @ApiModelProperty(value = "地址详情") + private String storeAddressDetail; + } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettingDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettingDTO.java index c24b13de..dff11df5 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettingDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettingDTO.java @@ -9,7 +9,7 @@ import javax.validation.constraints.NotEmpty; * 店铺设置 * * @author Bulbasaur - * @date 2020/12/16 15:15 + * @since 2020/12/16 15:15 */ @Data public class StoreSettingDTO { @@ -31,6 +31,12 @@ public class StoreSettingDTO { @NotEmpty @ApiModelProperty(value = "经纬度") - private String center; + private String storeCenter; + + @ApiModelProperty(value = "默认页面是否开启") + private Boolean pageShow; + + @ApiModelProperty(value = "是否开启自提") + private Boolean selfPickFlag; } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettlementDay.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettlementDay.java index eda6eba8..0302f69c 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettlementDay.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreSettlementDay.java @@ -9,7 +9,7 @@ import java.util.Date; * 店铺结算日 * * @author Chopper - * @date 2021/2/20 3:24 下午 + * @since 2021/2/20 3:24 下午 */ @Data public class StoreSettlementDay { diff --git a/framework/src/main/java/cn/lili/modules/store/entity/enums/BillStatusEnum.java b/framework/src/main/java/cn/lili/modules/store/entity/enums/BillStatusEnum.java index 627c0368..348b5c1b 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/enums/BillStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/enums/BillStatusEnum.java @@ -4,12 +4,21 @@ package cn.lili.modules.store.entity.enums; * 结算单状态 * * @author Chopper - * @date 2020/11/17 4:27 下午 + * @since 2020/11/17 4:27 下午 */ public enum BillStatusEnum { + /** + * "已出账" + */ OUT("已出账"), + /** + * "已核对" + */ CHECK("已核对"), + /** + * "已完成" + */ COMPLETE("已完成"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java b/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java index d4a3c720..6c14bd4c 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java @@ -4,15 +4,16 @@ package cn.lili.modules.store.entity.enums; * 模版枚举 * * @author Chopper - * @date 2020/12/23 15:59 + * @since 2020/12/23 15:59 */ public enum FreightTemplateEnum { /** * 重量 * 件数 + * 包邮 */ - WEIGHT, NUM + WEIGHT, NUM, FREE } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/enums/StoreStatusEnum.java b/framework/src/main/java/cn/lili/modules/store/entity/enums/StoreStatusEnum.java index c50aef58..7beb62f9 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/enums/StoreStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/enums/StoreStatusEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.store.entity.enums; * 店铺状态枚举 * * @author pikachu - * @date 2020年3月07日 上午11:04:25 + * @since 2020年3月07日 上午11:04:25 */ public enum StoreStatusEnum { /** diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/BillListVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/BillListVO.java index ab7d25f6..496d82ee 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/BillListVO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/BillListVO.java @@ -11,7 +11,7 @@ import java.util.Date; * 结算单VO * * @author pikachu - * @date 2020年3月07日 上午11:04:25 + * @since 2020年3月07日 上午11:04:25 */ @Data public class BillListVO { diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/FreightTemplateVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/FreightTemplateVO.java index fc9ab7a7..6b618ad9 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/FreightTemplateVO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/FreightTemplateVO.java @@ -12,7 +12,7 @@ import java.util.List; * 店铺运费模板 * * @author Bulbasaur - * @date 2020/11/24 14:29 + * @since 2020/11/24 14:29 */ @Data public class FreightTemplateVO extends FreightTemplate { diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java index ffbcae0c..230709a2 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java @@ -8,13 +8,13 @@ import lombok.Data; * 店铺基本信息DTO * * @author Bulbasaur - * @date 2020/12/7 14:43 + * @since 2020/12/7 14:43 */ @Data public class StoreBasicInfoVO { @ApiModelProperty(value = "店铺ID") - private Long storeId; + private String storeId; @ApiModelProperty(value = "店铺名称") private String storeName; @@ -42,4 +42,23 @@ public class StoreBasicInfoVO { @ApiModelProperty(value = "是否自营") private String selfOperated; + + @ApiModelProperty(value = "商品数量") + private Integer goodsNum; + + @ApiModelProperty(value = "收藏数量") + private Integer collectionNum; + + @ApiModelProperty(value = "腾讯云智服唯一标识") + private String yzfSign; + + @ApiModelProperty(value = "腾讯云智服小程序唯一标识") + private String yzfMpSign; + + @ApiModelProperty(value = "udesk标识") + private String merchantEuid; + + @ApiModelProperty + private String pageShow; + } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreDetailVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreDetailVO.java index 8fd392bd..69b6c6a5 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreDetailVO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreDetailVO.java @@ -3,13 +3,15 @@ package cn.lili.modules.store.entity.vos; import cn.lili.modules.store.entity.dto.StoreEditDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; /** * 店铺详细VO * * @author pikachu - * @date 2020-03-09 21:53:20 + * @since 2020-03-09 21:53:20 */ +@EqualsAndHashCode(callSuper = true) @Data public class StoreDetailVO extends StoreEditDTO { diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreFlowPayDownloadVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreFlowPayDownloadVO.java new file mode 100644 index 00000000..e55b1532 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreFlowPayDownloadVO.java @@ -0,0 +1,61 @@ +package cn.lili.modules.store.entity.vos; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 店铺流水下载 + * @author Bulbasaur + * @date: 2021/8/13 4:14 下午 + * + */ +@Data +public class StoreFlowPayDownloadVO { + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间", hidden = true) + private Date createTime; + + @ApiModelProperty(value = "订单sn") + private String orderSn; + + @ApiModelProperty(value = "店铺名称 ") + private String storeName; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "销售量") + private Integer num; + + @ApiModelProperty(value = "流水金额") + private Double finalPrice; + + @ApiModelProperty(value = "平台收取交易佣金") + private Double commissionPrice; + + @ApiModelProperty(value = "平台优惠券 使用金额") + private Double siteCouponPrice; + + @ApiModelProperty(value = "单品分销返现支出") + private Double distributionRebate; + + @ApiModelProperty(value = "积分活动商品结算价格") + private Double pointSettlementPrice; + + @ApiModelProperty(value = "砍价活动商品结算价格") + private Double kanjiaSettlementPrice; + + @ApiModelProperty(value = "最终结算金额") + private Double billPrice; +} diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreFlowRefundDownloadVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreFlowRefundDownloadVO.java new file mode 100644 index 00000000..f76c92a4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreFlowRefundDownloadVO.java @@ -0,0 +1,18 @@ +package cn.lili.modules.store.entity.vos; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 店铺流水下载 + * + * @author Bulbasaur + * @date: 2021/8/13 4:14 下午 + */ +@Data +public class StoreFlowRefundDownloadVO extends StoreFlowPayDownloadVO { + + @ApiModelProperty(value = "售后SN") + private String refundSn; + +} diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreManagementCategoryVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreManagementCategoryVO.java index e7277c8d..922d33d1 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreManagementCategoryVO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreManagementCategoryVO.java @@ -9,14 +9,14 @@ import lombok.NoArgsConstructor; /** * 店铺经营范围 * @author Bulbasaur - * @date 2020/12/11 16:18 + * @since 2020/12/11 16:18 */ @Data @NoArgsConstructor public class StoreManagementCategoryVO extends Category { @ApiModelProperty(value = "已选择") - private boolean selected; + private Boolean selected; public StoreManagementCategoryVO(Category category) { BeanUtil.copyProperties(this, category); diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreOtherVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreOtherVO.java new file mode 100644 index 00000000..a6956f3d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreOtherVO.java @@ -0,0 +1,32 @@ +package cn.lili.modules.store.entity.vos; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 店铺其他信息 + * @author Bulbasaur + * @date: 2021/8/11 3:42 下午 + * + */ +@Data +public class StoreOtherVO { + + @ApiModelProperty(value = "公司名称") + private String companyName; + + @ApiModelProperty(value = "公司地址") + private String companyAddress; + + @ApiModelProperty(value = "公司地址地区") + private String companyAddressPath; + + @ApiModelProperty(value = "营业执照电子版") + private String licencePhoto; + + @ApiModelProperty(value = "法定经营范围") + private String scope; + + @ApiModelProperty(value = "员工总数") + private Integer employeeNum; +} diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreSearchParams.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreSearchParams.java index b9cabbc3..be73062e 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreSearchParams.java @@ -2,6 +2,7 @@ package cn.lili.modules.store.entity.vos; import cn.hutool.core.date.DateUtil; import cn.lili.common.utils.StringUtils; +import cn.lili.common.vo.PageVO; import cn.lili.modules.store.entity.enums.StoreStatusEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.ApiModelProperty; @@ -13,10 +14,10 @@ import java.io.Serializable; * 店铺搜索参数VO * * @author pikachu - * @date 2020-03-07 17:02:05 + * @since 2020-03-07 17:02:05 */ @Data -public class StoreSearchParams implements Serializable { +public class StoreSearchParams extends PageVO implements Serializable { private static final long serialVersionUID = 6916054310764833369L; @@ -48,9 +49,9 @@ public class StoreSearchParams implements Serializable { if (StringUtils.isNotEmpty(storeDisable)) { queryWrapper.eq("store_disable", storeDisable); } else { - queryWrapper.eq("store_disable", StoreStatusEnum.OPEN.name()).or().eq("store_disable", StoreStatusEnum.CLOSED.name()); + queryWrapper.and(Wrapper -> Wrapper.eq("store_disable", StoreStatusEnum.OPEN.name()).or().eq("store_disable", StoreStatusEnum.CLOSED.name())); } - // 按时间查询 + //按时间查询 if (StringUtils.isNotEmpty(startDate)) { queryWrapper.ge("create_time", DateUtil.parse(startDate)); } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreVO.java index cf45db28..90980742 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreVO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreVO.java @@ -8,7 +8,7 @@ import lombok.Data; * 店铺VO * * @author pikachu - * @date 2020-03-07 17:02:05 + * @since 2020-03-07 17:02:05 */ @Data public class StoreVO extends Store { diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java index cc14d1e7..8d0c4724 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/BillMapper.java @@ -4,6 +4,7 @@ package cn.lili.modules.store.mapper; import cn.lili.modules.store.entity.dos.Bill; import cn.lili.modules.store.entity.vos.BillListVO; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; @@ -14,20 +15,42 @@ import org.apache.ibatis.annotations.Select; * 结算单数据处理层 * * @author Chopper - * @date 2020/11/17 4:27 下午 + * @since 2020/11/17 4:27 下午 */ public interface BillMapper extends BaseMapper { + /** + * 查询结算单分页 + * + * @param page 分页 + * @param queryWrapper 查询条件 + * @return 结算单分页 + */ @Select("select b.id,b.sn,b.start_time,b.end_time,b.bill_status,b.store_name,b.bill_price,b.create_time from li_bill as b ${ew.customSqlSegment}") IPage queryBillPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - @Select("SELECT SUM( final_price ) AS orderPrice,SUM( commission_price ) AS commissionPrice" + - ",SUM( distribution_rebate ) AS distributionCommission,SUM( site_coupon_commission ) AS siteCouponCommission" + - ",SUM( bill_price ) AS billPrice FROM li_store_flow WHERE store_id=#{storeId} AND flow_type=#{flowType}") - Bill getOrderBill(String storeId, String flowType); + /** + * 查询订单结算 + * + * @param queryWrapper 查询条件 + * @return 结算单 + */ + @Select("SELECT IFNULL(SUM( final_price ),0) AS orderPrice,IFNULL(SUM( commission_price ),0) AS commissionPrice" + + ",IFNULL(SUM( distribution_rebate ),0) AS distributionCommission,IFNULL(SUM( site_coupon_commission ),0) AS siteCouponCommission" + + ",IFNULL(SUM( point_settlement_price ),0) AS pointSettlementPrice " + + ",IFNULL(SUM( kanjia_settlement_price ),0) AS kanjiaSettlementPrice " + + ",IFNULL(SUM( bill_price ),0) AS billPrice " + + "FROM li_store_flow ${ew.customSqlSegment}") + Bill getOrderBill(@Param(Constants.WRAPPER) QueryWrapper queryWrapper); - @Select("SELECT SUM( final_price ) AS refundPrice,SUM( commission_price ) AS refundCommissionPrice" + - ",SUM( distribution_rebate ) AS distributionRefundCommission,SUM( site_coupon_commission ) AS siteCouponRefundCommission" + - ",SUM( bill_price ) AS billPrice FROM li_store_flow WHERE store_id=#{storeId} AND flow_type=#{flowType}") - Bill getRefundBill(String storeId, String flowType); + /** + * 查询退款结算单 + * + * @param queryWrapper 查询条件 + * @return 结算单 + */ + @Select("SELECT IFNULL(SUM( final_price ),0) AS refundPrice,IFNULL(SUM( commission_price ),0) AS refundCommissionPrice" + + ",IFNULL(SUM( distribution_rebate ),0) AS distributionRefundCommission,IFNULL(SUM( site_coupon_commission ),0) AS siteCouponRefundCommission" + + ",IFNULL(SUM( final_price ),0) AS billPrice FROM li_store_flow ${ew.customSqlSegment}") + Bill getRefundBill(@Param(Constants.WRAPPER) QueryWrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateChildMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateChildMapper.java index 6b1fba54..e4f939ae 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateChildMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateChildMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 店铺配送子模板数据处理层 * * @author Bulbasaur - * @date 2020-03-07 09:18:56 + * @since 2020-03-07 09:18:56 */ public interface FreightTemplateChildMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateMapper.java index 2b612969..459d1dc3 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/FreightTemplateMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 店铺配送模板数据处理层 * * @author Bulbasaur - * @date 2020-03-07 09:18:56 + * @since 2020-03-07 09:18:56 */ public interface FreightTemplateMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/StoreAddressMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/StoreAddressMapper.java index a0b7f31c..19b02bac 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/StoreAddressMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/StoreAddressMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 店铺地址(自提点)数据处理层 * * @author Bulbasaur - * @date 2020-03-07 09:18:56 + * @since 2020-03-07 09:18:56 */ public interface StoreAddressMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java index 0b91d1fe..ade17620 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java @@ -3,13 +3,12 @@ package cn.lili.modules.store.mapper; import cn.hutool.core.date.DateTime; import cn.lili.modules.store.entity.dos.StoreDetail; import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; import cn.lili.modules.store.entity.dto.StoreSettlementDay; import cn.lili.modules.store.entity.vos.StoreBasicInfoVO; import cn.lili.modules.store.entity.vos.StoreDetailVO; -import com.baomidou.mybatisplus.core.conditions.Wrapper; +import cn.lili.modules.store.entity.vos.StoreOtherVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; @@ -19,28 +18,85 @@ import java.util.List; * 店铺详细数据处理层 * * @author pikachu - * @date 2020-03-07 09:18:56 + * @since 2020-03-07 09:18:56 */ public interface StoreDetailMapper extends BaseMapper { - @Select("select s.store_logo,s.member_name,s.store_name,s.store_disable,s.self_operated,s.store_address_detail,s.store_address_path,s.store_address_id_path,s.store_center,s.store_desc,d.* " + - "from li_store s inner join li_store_detail d on s.id=d.store_id where s.id=#{storeId}") + /** + * 获取店铺详情VO + * + * @param storeId 店铺ID + * @return 店铺详情VO + */ + @Select("select s.store_logo,s.member_name,s.store_name,s.store_disable,s.self_operated,s.store_address_detail,s.store_address_path,s.store_address_id_path,s.store_center,s.store_desc,s.yzf_sign,s.yzf_mp_sign," + + "d.* from li_store s inner join li_store_detail d on s.id=d.store_id where s.id=#{storeId}") StoreDetailVO getStoreDetail(String storeId); - @Select("select s.member_name,s.store_name,s.store_disable,s.self_operated,s.store_center,s.store_logo,s.store_desc,d.* " + + /** + * 根据会员ID获取店铺详情 + * + * @param memberId 会员ID + * @return 店铺详情 + */ + @Select("select s.member_name,s.store_name,s.store_disable,s.self_operated,s.store_center,s.store_logo,s.store_desc,s.store_address_detail,s.store_address_path,s.store_address_id_path,d.* " + "from li_store s inner join li_store_detail d on s.id=d.store_id where s.member_id=#{memberId}") StoreDetailVO getStoreDetailByMemberId(String memberId); - @Select("SELECT s.id as storeId,s.* FROM li_store s LEFT JOIN li_store_detail sd ON s.id=sd.store_id WHERE s.id=#{storeId}") + /** + * 获取店铺基础信息DTO + * + * @param storeId 店铺ID + * @return 店铺基础信息DTO + */ + @Select("SELECT s.id as storeId,s.* FROM li_store s WHERE s.id=#{storeId}") StoreBasicInfoVO getStoreBasicInfoDTO(String storeId); + /** + * 获取店铺售后地址DTO + * + * @param storeId 店铺ID + * @return 店铺售后地址DTO + */ @Select("select s.sales_consignee_name,s.sales_consignee_mobile,s.sales_consignee_address_id,s.sales_consignee_address_path,s.sales_consignee_detail " + "from li_store_detail s where s.store_id=#{storeId}") StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO(String storeId); - @Select("SELECT store_id,settlement_day FROM li_store_detail ${ew.customSqlSegment}") - List getSettlementStore(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 获取待结算店铺列表 + * + * @param day 结算日 + * @return 待结算店铺列表 + */ + @Select("SELECT store_id,settlement_day FROM li_store_detail " + + "WHERE settlement_cycle LIKE concat(#{day},',%') " + + "OR settlement_cycle LIKE concat('%,',#{day},',%') " + + "OR settlement_cycle LIKE concat('%,',#{day})"+ + "OR settlement_cycle = #{day}") + List getSettlementStore(int day); + /** + * 修改店铺的结算日 + * + * @param storeId 店铺ID + * @param dateTime 结算日 + */ @Update("UPDATE li_store_detail SET settlement_day=#{dateTime} WHERE store_id=#{storeId}") void updateSettlementDay(String storeId, DateTime dateTime); + + /** + * 查看店铺营业执照信息 + * @param storeId 店铺ID + * @return 店铺营业执照 + */ + @Select("SELECT * FROM li_store_detail WHERE store_id=#{storeId}") + StoreOtherVO getLicencePhoto(String storeId); + + /*** + * 获取店铺发货地址 + * @param storeId 店铺ID + * @return 店铺发货地址DTO + */ + @Select("select s.sales_consignor_name,s.sales_consignor_mobile,s.sales_consignor_address_id,s.sales_consignor_address_path,s.sales_consignor_detail "+ + "from li_store_detail s where s.store_id=#{storeId}") + StoreDeliverGoodsAddressDTO getStoreDeliverGoodsAddressDto(String storeId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/StoreMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/StoreMapper.java index af894ec2..7d115b53 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/StoreMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/StoreMapper.java @@ -8,12 +8,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; /** * 店铺数据处理层 * * @author pikachu - * @date2020-03-07 09:18:56 + * @since2020-03-07 09:18:56 */ public interface StoreMapper extends BaseMapper { @@ -37,4 +38,13 @@ public interface StoreMapper extends BaseMapper { IPage getStoreList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 修改店铺收藏数据 + * + * @param storeId 店铺id + * @param num 收藏数量 + */ + @Update("update li_store set collection_num = collection_num + #{num} where id = #{storeId}") + void updateCollection(String storeId, Integer num); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/service/BillService.java b/framework/src/main/java/cn/lili/modules/store/service/BillService.java index 2d0e40ee..5ffc1a8e 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/BillService.java +++ b/framework/src/main/java/cn/lili/modules/store/service/BillService.java @@ -1,22 +1,21 @@ package cn.lili.modules.store.service; -import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.hutool.core.date.DateTime; import cn.lili.modules.store.entity.dos.Bill; import cn.lili.modules.store.entity.dto.BillSearchParams; -import cn.lili.modules.store.entity.enums.BillStatusEnum; import cn.lili.modules.store.entity.vos.BillListVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.cache.annotation.CacheConfig; +import javax.servlet.http.HttpServletResponse; import java.util.Date; /** * 结算单业务层 * * @author Chopper - * @date 2020/11/17 4:28 下午 + * @since 2020/11/17 4:28 下午 */ @CacheConfig(cacheNames = "bill") public interface BillService extends IService { @@ -26,8 +25,9 @@ public interface BillService extends IService { * * @param storeId 商家ID * @param startTime 开始时间 + * @param endTime 结束时间 */ - void createBill(String storeId, Date startTime); + void createBill(String storeId, Date startTime, DateTime endTime); /** @@ -39,24 +39,6 @@ public interface BillService extends IService { */ void immediatelyBill(String storeId, Long endTime); - /** - * 根据结算单ID获取商家流水 - * - * @param pageVO 分页 - * @param id 结算单ID - * @return 商家流水 - */ - IPage getStoreFlow(String id, String type, PageVO pageVO); - - /** - * 根据结算单ID获取商家流水 - * - * @param pageVO 分页 - * @param id 结算单ID - * @return 商家流水 - */ - IPage getDistributionFlow(String id, PageVO pageVO); - /** * 获取结算单分页 * @@ -82,10 +64,9 @@ public interface BillService extends IService { boolean complete(String id); /** - * 商家待结算数量 - * - * @return 待结算商家数量 + * 下载结算单 + * @response response + * @param id 结算单ID */ - Integer billNum(BillStatusEnum billStatusEnum); - + void download(HttpServletResponse response, String id); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateChildService.java b/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateChildService.java index 12aaf05f..bb34cdf3 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateChildService.java +++ b/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateChildService.java @@ -9,14 +9,15 @@ import java.util.List; * 配送子模板业务层 * * @author Bulbasaur - * @date 2020-03-07 09:24:33 + * @since 2020-03-07 09:24:33 */ public interface FreightTemplateChildService extends IService { /** - * 获取当前商家的运费模板列表 + * 获取当前商家的运费模板子内容列表 * - * @return 运费模板列表 + * @param freightTemplateId 运费模板ID + * @return 运费模板子内容列表 */ List getFreightTemplateChild(String freightTemplateId); diff --git a/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java b/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java index cecc0ba2..c5d60b89 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java +++ b/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java @@ -5,6 +5,9 @@ import cn.lili.modules.store.entity.dos.FreightTemplate; import cn.lili.modules.store.entity.vos.FreightTemplateVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import java.util.List; @@ -12,16 +15,18 @@ import java.util.List; * 店铺地址(自提点)详细业务层 * * @author Bulbasaur - * @date 2020-03-07 09:24:33 + * @since 2020-03-07 09:24:33 */ +@CacheConfig(cacheNames = "{freightTemplate}") public interface FreightTemplateService extends IService { /** * 获取当前商家的运费模板列表 * + * @param pageVO 分页 * @return 运费模板列表 */ - IPage getFreightTemplate(PageVO pageVo); + IPage getFreightTemplate(PageVO pageVO); /** * 获取商家的运费模板 @@ -37,10 +42,12 @@ public interface FreightTemplateService extends IService { * @param id 运费模板ID * @return 运费模板 */ + @Cacheable(key = "#id") FreightTemplateVO getFreightTemplate(String id); /** * 添加商家运费模板 + * 运费模板分为卖家包邮、运费计算两种类型 * * @param freightTemplateVO 运费模板 * @return 运费模板 @@ -53,6 +60,7 @@ public interface FreightTemplateService extends IService { * @param freightTemplateVO 运费模板 * @return 运费模板 */ + @CacheEvict(key = "#freightTemplateVO.id") FreightTemplateVO editFreightTemplate(FreightTemplateVO freightTemplateVO); /** @@ -62,6 +70,7 @@ public interface FreightTemplateService extends IService { * @param id 运费模板ID * @return 操作状态 */ + @CacheEvict(key = "#id") boolean removeFreightTemplate(String id); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/service/StoreAddressService.java b/framework/src/main/java/cn/lili/modules/store/service/StoreAddressService.java index 3c808f46..fc7598fe 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/StoreAddressService.java +++ b/framework/src/main/java/cn/lili/modules/store/service/StoreAddressService.java @@ -9,16 +9,17 @@ import com.baomidou.mybatisplus.extension.service.IService; * 店铺地址(自提点)详细业务层 * * @author Bulbasaur - * @date 2020-03-07 09:24:33 + * @since 2020-03-07 09:24:33 */ public interface StoreAddressService extends IService { /** * 获取当前商家的自提点列表 * + * @param pageVo 分页 * @return 自提点列表 */ - IPage getStoreAddress(PageVO pageVo); + IPage getStoreAddress(String storeId, PageVO pageVo); /** * 添加商家自提点 @@ -26,7 +27,7 @@ public interface StoreAddressService extends IService { * @param storeAddress 自提点 * @return 自提点 */ - StoreAddress addStoreAddress(StoreAddress storeAddress); + StoreAddress addStoreAddress(String storeId, StoreAddress storeAddress); /** * 修改商家自提点 @@ -34,7 +35,7 @@ public interface StoreAddressService extends IService { * @param storeAddress 自提点 * @return 自提点 */ - StoreAddress editStoreAddress(StoreAddress storeAddress); + StoreAddress editStoreAddress(String storeId, StoreAddress storeAddress); /** * 删除商家自提点 diff --git a/framework/src/main/java/cn/lili/modules/store/service/StoreDetailService.java b/framework/src/main/java/cn/lili/modules/store/service/StoreDetailService.java index 8f01b0e8..134f97ae 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/StoreDetailService.java +++ b/framework/src/main/java/cn/lili/modules/store/service/StoreDetailService.java @@ -1,10 +1,13 @@ package cn.lili.modules.store.service; +import cn.hutool.core.date.DateTime; +import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dos.StoreDetail; -import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; -import cn.lili.modules.store.entity.dto.StoreSettingDTO; +import cn.lili.modules.store.entity.dto.*; import cn.lili.modules.store.entity.vos.StoreBasicInfoVO; import cn.lili.modules.store.entity.vos.StoreDetailVO; +import cn.lili.modules.store.entity.vos.StoreManagementCategoryVO; +import cn.lili.modules.store.entity.vos.StoreOtherVO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -13,7 +16,7 @@ import java.util.List; * 店铺详细业务层 * * @author pikachu - * @date 2020-03-07 09:24:33 + * @since 2020-03-07 09:24:33 */ public interface StoreDetailService extends IService { /** @@ -67,6 +70,7 @@ public interface StoreDetailService extends IService { /** * 获取某一个店铺的退货收件地址信息 * + * @param id 店铺ID * @return 店铺售后收件地址 */ StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO(String id); @@ -74,16 +78,88 @@ public interface StoreDetailService extends IService { /** * 修改当前登录店铺售后收件地址 * + * @param storeAfterSaleAddressDTO 店铺售后DTO * @return 店铺售后收件地址 */ boolean editStoreAfterSaleAddressDTO(StoreAfterSaleAddressDTO storeAfterSaleAddressDTO); + + /** * 修改店铺库存预警数量 + * * @param stockWarning 库存预警数量 * @return 操作状态 */ boolean updateStockWarning(Integer stockWarning); - List goodsManagementCategory(String storeId); + /** + * 获取店铺经营范围 + * + * @param storeId 店铺ID + * @return 店铺经营范围 + */ + List goodsManagementCategory(String storeId); + + /** + * 获取店铺其他信息 + * + * @param storeId 店铺ID + * @return 店铺其他信息 + */ + StoreOtherVO getStoreOtherVO(String storeId); + + /** + * 更新店铺内所有商品信息 + * + * @param store 店铺信息 + */ + void updateStoreGoodsInfo(Store store); + + /** + * 修改店铺udesk字段设置 + * + * @param merchantEuid 店铺客服信息 + */ + Boolean editMerchantEuid(String merchantEuid); + + /** + * 获取待结算店铺列表 + * + * @param day 结算日 + * @return 待结算店铺列表 + */ + List getSettlementStore(int day); + + /** + * 修改店铺的结算日 + * + * @param storeId 店铺ID + * @param dateTime 结算日 + */ + void updateSettlementDay(String storeId, DateTime dateTime); + + + /** + * 获取当前登录店铺发件地址 + * + * @return 店铺售后发件地址 + */ + StoreDeliverGoodsAddressDTO getStoreDeliverGoodsAddressDto(); + + /** + * 获取某一个店铺的发货寄件地址信息 + * + * @param id 店铺ID + * @return 店铺发件地址 + */ + StoreDeliverGoodsAddressDTO getStoreDeliverGoodsAddressDto(String id); + + /** + * 修改当前登录店铺发件地址 + * + * @param storeDeliverGoodsAddressDto 店铺发货信息DTO + * @return 店铺售后发件地址 + */ + boolean editStoreDeliverGoodsAddressDTO(StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDto); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/service/StoreService.java b/framework/src/main/java/cn/lili/modules/store/service/StoreService.java index 8731846a..4cf9263a 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/StoreService.java +++ b/framework/src/main/java/cn/lili/modules/store/service/StoreService.java @@ -1,6 +1,8 @@ package cn.lili.modules.store.service; import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.member.entity.dto.CollectionDTO; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dto.*; import cn.lili.modules.store.entity.vos.StoreSearchParams; @@ -8,11 +10,13 @@ import cn.lili.modules.store.entity.vos.StoreVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * 店铺业务层 * * @author pikachu - * @date 2020/11/18 11:45 上午 + * @since 2020/11/18 11:45 上午 */ public interface StoreService extends IService { @@ -21,7 +25,6 @@ public interface StoreService extends IService { * 用于展示店铺列表 * * @param entity - * @param page * @return */ IPage findByConditionPage(StoreSearchParams entity, PageVO page); @@ -38,6 +41,7 @@ public interface StoreService extends IService { * 用于后台添加店铺 * * @param adminStoreApplyDTO 后台添加店铺信息 + * @return 店铺 */ Store add(AdminStoreApplyDTO adminStoreApplyDTO); @@ -45,6 +49,7 @@ public interface StoreService extends IService { * 编辑店铺 * * @param storeEditDTO 店铺修改信息 + * @return 店铺 */ Store edit(StoreEditDTO storeEditDTO); @@ -53,6 +58,7 @@ public interface StoreService extends IService { * * @param id 店铺ID * @param passed 审核结果 + * @return 操作结果 */ boolean audit(String id, Integer passed); @@ -98,35 +104,31 @@ public interface StoreService extends IService { */ boolean applyThirdStep(StoreOtherInfoDTO storeOtherInfoDTO); - /** - * 获取待审核店铺数量 - * @return 待审核店铺数量 - */ - Integer auditNum(); - - /** - * 获取所有店铺数量 - * - * @return 店铺总数 - */ - Integer storeNum(); - - /** - * 获取今天的店铺数量 - * - * @return 今天的店铺数量 - */ - Integer todayStoreNum(); /** * 更新店铺商品数量 + * * @param storeId 店铺ID + * @param num 商品数量 */ - void updateStoreGoodsNum(String storeId); + void updateStoreGoodsNum(String storeId, Long num); /** * 更新店铺收藏数量 - * @param goodsId 店铺ID + * + * @param collectionDTO 收藏信息 */ - void updateStoreCollectionNum(String goodsId); + void updateStoreCollectionNum(CollectionDTO collectionDTO); + + /** + * 重新生成所有店铺 + */ + void storeToClerk(); + + /** + * 店铺获取该会员的访问记录 + * @param memberId 会员Id + * @return + */ + List getToMemberHistory(String memberId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java index e3e6f5ce..8d081926 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java @@ -1,16 +1,17 @@ package cn.lili.modules.store.serviceimpl; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.CurrencyUtil; -import cn.lili.common.utils.PageUtil; import cn.lili.common.utils.SnowFlake; -import cn.lili.common.utils.StringUtils; -import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO; import cn.lili.modules.order.order.entity.enums.FlowTypeEnum; import cn.lili.modules.order.order.service.StoreFlowService; import cn.lili.modules.store.entity.dos.Bill; @@ -18,55 +19,67 @@ import cn.lili.modules.store.entity.dto.BillSearchParams; import cn.lili.modules.store.entity.enums.BillStatusEnum; import cn.lili.modules.store.entity.vos.BillListVO; import cn.lili.modules.store.entity.vos.StoreDetailVO; +import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO; +import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO; import cn.lili.modules.store.mapper.BillMapper; import cn.lili.modules.store.service.BillService; import cn.lili.modules.store.service.StoreDetailService; +import cn.lili.mybatis.util.PageUtil; 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.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; import java.util.Date; +import java.util.List; /** * 结算单业务层实现 * * @author Chopper - * @date 2020/11/17 4:28 下午 + * @since 2020/11/17 4:28 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class BillServiceImpl extends ServiceImpl implements BillService { - //店铺详情 - private final StoreDetailService storeDetailService; - //商家流水 + /** + * 店铺详情 + */ + @Autowired + private StoreDetailService storeDetailService; + /** + * 商家流水 + */ + @Autowired private StoreFlowService storeFlowService; - //结算单 - private final BillMapper billMapper; @Override - public void createBill(String storeId, Date startTime) { + public void createBill(String storeId, Date startTime, DateTime endTime) { //获取结算店铺 StoreDetailVO store = storeDetailService.getStoreDetailVO(storeId); Bill bill = new Bill(); - //结算基础信息 + /** + * @TODO 结算单基础信息 + */ bill.setStartTime(startTime); - bill.setEndTime(DateUtil.yesterday()); + bill.setEndTime(endTime); bill.setBillStatus(BillStatusEnum.OUT.name()); bill.setStoreId(storeId); bill.setStoreName(store.getStoreName()); - //设置结算信息 + /** + * @TODO 结算单基础信息 + */ bill.setBankAccountName(store.getSettlementBankAccountName()); bill.setBankAccountNumber(store.getSettlementBankAccountNum()); bill.setBankCode(store.getSettlementBankJointName()); @@ -75,31 +88,51 @@ public class BillServiceImpl extends ServiceImpl implements Bi //店铺结算单号 bill.setSn(SnowFlake.createStr("B")); - //入账结算信息 - Bill orderBill = billMapper.getOrderBill(storeId, FlowTypeEnum.PAY.name()); - Double orderPrice = 0D; - if (orderBill != null) { - bill.setOrderPrice(orderBill.getOrderPrice()); - bill.setCommissionPrice(orderBill.getCommissionPrice()); - bill.setDistributionCommission(orderBill.getDistributionCommission()); - bill.setSiteCouponCommission(orderBill.getSiteCouponCommission()); - orderPrice=orderBill.getBillPrice(); - } - - //退款结算信息 - Bill refundBill = billMapper.getRefundBill(storeId, FlowTypeEnum.REFUND.name()); + Bill refundBill = this.baseMapper.getRefundBill(new QueryWrapper().eq("store_id", storeId).eq("flow_type", FlowTypeEnum.REFUND.name()).between("create_time", startTime, endTime)); + //店铺退款金额 Double refundPrice = 0D; - if(refundBill!=null){ - bill.setRefundPrice(refundBill.getRefundPrice()); - bill.setRefundCommissionPrice(refundBill.getRefundCommissionPrice()); - bill.setDistributionRefundCommission(refundBill.getDistributionRefundCommission()); - bill.setSiteCouponRefundCommission(refundBill.getSiteCouponRefundCommission()); - refundPrice=refundBill.getBillPrice(); + if (refundBill != null) { + //退单金额 + bill.setRefundPrice(refundBill.getRefundPrice() != null ? refundBill.getRefundPrice() : 0D); + //退单产生退还佣金金额 + bill.setRefundCommissionPrice(refundBill.getRefundCommissionPrice() != null ? refundBill.getRefundCommissionPrice() : 0D); + //分销订单退还,返现佣金返还 + bill.setDistributionRefundCommission(refundBill.getDistributionRefundCommission() != null ? refundBill.getDistributionRefundCommission() : 0D); + //退货平台优惠券补贴返还 + bill.setSiteCouponRefundCommission(refundBill.getSiteCouponRefundCommission() != null ? refundBill.getSiteCouponRefundCommission() : 0D); + //退款金额=店铺最终退款结算金额 + refundPrice = refundBill.getBillPrice() != null ? refundBill.getBillPrice() : 0D; } - //最终结算金额=入款结算金额-退款结算金额 - Double finalPrice = CurrencyUtil.sub(orderPrice, refundPrice); + + /** + * @TODO 入账结算信息 + */ + Bill orderBill = this.baseMapper.getOrderBill(new QueryWrapper().eq("store_id", storeId).eq("flow_type", FlowTypeEnum.PAY.name()).between("create_time", startTime, endTime)); + //店铺入款结算金额 + double orderPrice = 0D; + + if (orderBill != null) { + //结算周期内订单付款总金额 + bill.setOrderPrice(orderBill.getOrderPrice() != null ? orderBill.getOrderPrice() : 0D); + //平台收取佣金 + bill.setCommissionPrice(orderBill.getCommissionPrice() != null ? orderBill.getCommissionPrice() : 0D); + //分销返现支出 + bill.setDistributionCommission(orderBill.getDistributionCommission() != null ? orderBill.getDistributionCommission() : 0D); + //平台优惠券补贴 + bill.setSiteCouponCommission(orderBill.getSiteCouponCommission() != null ? orderBill.getSiteCouponCommission() : 0D); + //积分商品结算价格 + bill.setPointSettlementPrice(orderBill.getPointSettlementPrice() != null ? orderBill.getPointSettlementPrice() : 0D); + //砍价商品结算价格 + bill.setKanjiaSettlementPrice(orderBill.getKanjiaSettlementPrice() != null ? orderBill.getKanjiaSettlementPrice() : 0D); + + //入款结算金额= 店铺支付结算金额 + 平台优惠券补贴 + 分销订单退还,返现佣金返还+退单产生退还佣金金额 + orderPrice = CurrencyUtil.add(orderBill.getBillPrice() == null ? 0 : orderBill.getBillPrice(), bill.getSiteCouponCommission() == null ? 0 : bill.getSiteCouponCommission(), bill.getDistributionRefundCommission() == null ? 0 : bill.getDistributionRefundCommission(), bill.getRefundCommissionPrice() == null ? 0 : bill.getRefundCommissionPrice()); + } + //最终结算金额=入款结算金额-退款结算金额-退货平台优惠券补贴返还 + Double finalPrice = CurrencyUtil.sub(orderPrice, refundPrice, bill.getSiteCouponRefundCommission() == null ? 0 : bill.getSiteCouponRefundCommission()); + //店铺最终结算金额=最终结算金额 bill.setBillPrice(finalPrice); //添加结算单 @@ -117,41 +150,29 @@ public class BillServiceImpl extends ServiceImpl implements Bi @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void immediatelyBill(String storeId, Long endTime) { -// Long now = DateUtil.getDateline(); -// //TODO 需要获取真实店铺 -// StoreDetailVO store = new StoreDetailVO(); -// Long startTime = store.getLastBillTime().getTime(); +// Long now = DateUtil.getDateline(); +// //TODO 需要获取真实店铺 +// StoreDetailVO store = new StoreDetailVO(); +// Long startTime = store.getLastBillTime().getTime(); // -// store.setLastBillTime(new Date(now)); -//// TODO store.save 保存新的结束时间 +// store.setLastBillTime(new Date(now)); +//// TODO store.save 保存新的结束时间 // -// // TODO 获取结算周期内的结算详情 -// BillDTO billDTO = new BillDTO(); +// //TODO 获取结算周期内的结算详情 +// BillDTO billDTO = new BillDTO(); // -// //如果没有需要结算单,那么就可以直接返回,也不需要保存新的结算单 -// if (billDTO.getOrderPrice() == 0 && billDTO.getRefundPrice() == 0) { -// return; -// } +// //如果没有需要结算单,那么就可以直接返回,也不需要保存新的结算单 +// if (billDTO.getOrderPrice() == 0 && billDTO.getRefundPrice() == 0) { +// return; +// } // -// this.createBill(storeId, startTime, endTime); - } - - @Override - public IPage getStoreFlow(String id, String type, PageVO pageVO) { - Bill bill = this.getById(id); - return storeFlowService.getStoreFlow(bill.getStoreId(), type, false, pageVO, bill.getStartTime(), bill.getCreateTime()); - } - - @Override - public IPage getDistributionFlow(String id, PageVO pageVO) { - Bill bill = this.getById(id); - return storeFlowService.getStoreFlow(bill.getStoreId(), null, true, pageVO, bill.getStartTime(), bill.getCreateTime()); +// this.createBill(storeId, startTime, endTime); } @Override public IPage billPage(BillSearchParams billSearchParams) { QueryWrapper queryWrapper = billSearchParams.queryWrapper(); - return billMapper.queryBillPage(PageUtil.initPage(billSearchParams), queryWrapper); + return this.baseMapper.queryBillPage(PageUtil.initPage(billSearchParams), queryWrapper); } @Override @@ -184,21 +205,83 @@ public class BillServiceImpl extends ServiceImpl implements Bi } LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.eq(Bill::getId, id); + lambdaUpdateWrapper.set(Bill::getPayTime, new Date()); lambdaUpdateWrapper.set(Bill::getBillStatus, BillStatusEnum.COMPLETE.name()); return this.update(lambdaUpdateWrapper); } - public Integer billNum(BillStatusEnum billStatusEnum) { - LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); - lambdaUpdateWrapper.eq(Bill::getBillStatus, billStatusEnum.name()); - lambdaUpdateWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), - Bill::getStoreId, UserContext.getCurrentUser().getStoreId()); - return this.count(lambdaUpdateWrapper); - } + @Override + public void download(HttpServletResponse response, String id) { - @Autowired - public void setStoreFlowService(StoreFlowService storeFlowService) { - this.storeFlowService = storeFlowService; + Bill bill = this.getById(id); + ExcelWriter writer = ExcelUtil.getWriterWithSheet("入账订单"); + writer.setSheet("入账订单"); + writer.addHeaderAlias("createTime", "入账时间"); + writer.setColumnWidth(0, 20); + writer.addHeaderAlias("orderSn", "订单编号"); + writer.setColumnWidth(1, 35); + writer.addHeaderAlias("storeName", "店铺名称"); + writer.setColumnWidth(2, 20); + writer.addHeaderAlias("goodsName", "商品名称"); + writer.setColumnWidth(3, 70); + writer.addHeaderAlias("num", "销售量"); + writer.addHeaderAlias("finalPrice", "订单金额"); + writer.addHeaderAlias("commissionPrice", "平台分佣"); + writer.addHeaderAlias("siteCouponPrice", "平台优惠券"); + writer.setColumnWidth(7, 12); + writer.addHeaderAlias("distributionRebate", "分销金额"); + writer.addHeaderAlias("pointSettlementPrice", "积分结算金额"); + writer.setColumnWidth(9, 12); + writer.addHeaderAlias("kanjiaSettlementPrice", "砍价结算金额"); + writer.setColumnWidth(10, 12); + writer.addHeaderAlias("billPrice", "应结金额"); + writer.setColumnWidth(11, 20); + + + List storeFlowList = storeFlowService.getStoreFlowPayDownloadVO(StoreFlowQueryDTO.builder().type(FlowTypeEnum.PAY.name()).bill(bill).build()); + writer.write(storeFlowList, true); + + writer.setSheet("退款订单"); + writer.addHeaderAlias("createTime", "入账时间"); + writer.setColumnWidth(0, 20); + writer.addHeaderAlias("orderSn", "订单编号"); + writer.setColumnWidth(1, 35); + writer.addHeaderAlias("refundSn", "售后单号"); + writer.setColumnWidth(2, 35); + writer.addHeaderAlias("storeName", "店铺名称"); + writer.setColumnWidth(3, 20); + writer.addHeaderAlias("goodsName", "商品名称"); + writer.setColumnWidth(4, 70); + writer.addHeaderAlias("num", "销售量"); + writer.addHeaderAlias("finalPrice", "退款金额"); + writer.addHeaderAlias("commissionPrice", "平台分佣"); + writer.addHeaderAlias("siteCouponPrice", "平台优惠券"); + writer.setColumnWidth(8, 12); + writer.addHeaderAlias("distributionRebate", "分销金额"); + writer.addHeaderAlias("pointSettlementPrice", "积分结算金额"); + writer.setColumnWidth(10, 12); + writer.addHeaderAlias("kanjiaSettlementPrice", "砍价结算金额"); + writer.setColumnWidth(11, 12); + writer.addHeaderAlias("billPrice", "结算金额"); + writer.setColumnWidth(12, 20); + + + List storeFlowRefundDownloadVOList = storeFlowService.getStoreFlowRefundDownloadVO(StoreFlowQueryDTO.builder().type(FlowTypeEnum.REFUND.name()).bill(bill).build()); + writer.write(storeFlowRefundDownloadVOList, true); + + ServletOutputStream out = null; + try { + //设置公共属性,列表名称 + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(bill.getStoreName() + "-" + bill.getSn(), "UTF8") + ".xls"); + out = response.getOutputStream(); + writer.flush(out, true); + } catch (Exception e) { + log.error("下载结算单错误", e); + } finally { + writer.close(); + IoUtil.close(out); + } } } diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java index b36965cb..4b32fba8 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java @@ -6,8 +6,6 @@ import cn.lili.modules.store.service.FreightTemplateChildService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,31 +15,26 @@ import java.util.List; * 配送子模板业务层实现 * * @author Bulbasaur - * @date 2020-03-07 09:24:33 + * @since 2020-03-07 09:24:33 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FreightTemplateServiceChildImpl extends ServiceImpl implements FreightTemplateChildService { - //配送子模板数据层 - private final FreightTemplateChildMapper freightTemplateChildMapper; - @Override public List getFreightTemplateChild(String freightTemplateId) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(FreightTemplateChild::getFreightTemplateId, freightTemplateId); - return freightTemplateChildMapper.selectList(lambdaQueryWrapper); + return this.baseMapper.selectList(lambdaQueryWrapper); } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public boolean addFreightTemplateChild(List freightTemplateChildren) { return this.saveBatch(freightTemplateChildren); } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public boolean removeFreightTemplate(String freightTemplateId) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(FreightTemplateChild::getFreightTemplateId, freightTemplateId); diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java index 49136efa..7b4943bf 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java @@ -1,13 +1,12 @@ package cn.lili.modules.store.serviceimpl; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.BeanUtil; -import cn.lili.common.utils.PageUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.store.entity.dos.FreightTemplate; import cn.lili.modules.store.entity.dos.FreightTemplateChild; @@ -15,11 +14,11 @@ import cn.lili.modules.store.entity.vos.FreightTemplateVO; import cn.lili.modules.store.mapper.FreightTemplateMapper; import cn.lili.modules.store.service.FreightTemplateChildService; import cn.lili.modules.store.service.FreightTemplateService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -32,19 +31,20 @@ import java.util.List; * 店铺运费模板业务层实现 * * @author Bulbasaur - * @date 2020/11/22 16:00 + * @since 2020/11/22 16:00 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FreightTemplateServiceImpl extends ServiceImpl implements FreightTemplateService { - - //配送模板 - private final FreightTemplateMapper freightTemplateMapper; - //配送子模板 - private final FreightTemplateChildService freightTemplateChildService; - //缓存 - private final Cache cache; + /** + * 配送子模板 + */ + @Autowired + private FreightTemplateChildService freightTemplateChildService; + /** + * 缓存 + */ + @Autowired + private Cache cache; @Override @@ -57,8 +57,8 @@ public class FreightTemplateServiceImpl extends ServiceImpl(); //查询运费模板 LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(FreightTemplate::getStoreId, UserContext.getCurrentUser().getId()); - List freightTemplates = freightTemplateMapper.selectList(lambdaQueryWrapper); + lambdaQueryWrapper.eq(FreightTemplate::getStoreId, storeId); + List freightTemplates = this.baseMapper.selectList(lambdaQueryWrapper); if (!freightTemplates.isEmpty()) { //如果模板不为空则查询子模板信息 for (FreightTemplate freightTemplate : freightTemplates) { @@ -78,18 +78,16 @@ public class FreightTemplateServiceImpl extends ServiceImpl getFreightTemplate(PageVO pageVo) { - //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(FreightTemplate::getStoreId, UserContext.getCurrentUser().getId()); - return freightTemplateMapper.selectPage(PageUtil.initPage(pageVo), lambdaQueryWrapper); + lambdaQueryWrapper.eq(FreightTemplate::getStoreId, UserContext.getCurrentUser().getStoreId()); + return this.baseMapper.selectPage(PageUtil.initPage(pageVo), lambdaQueryWrapper); } @Override public FreightTemplateVO getFreightTemplate(String id) { FreightTemplateVO freightTemplateVO = new FreightTemplateVO(); //获取运费模板 - FreightTemplate freightTemplate = freightTemplateMapper.selectById(id); + FreightTemplate freightTemplate = this.getById(id); if (freightTemplate != null) { //复制属性 BeanUtils.copyProperties(freightTemplate, freightTemplateVO); @@ -106,26 +104,30 @@ public class FreightTemplateServiceImpl extends ServiceImpl list = new ArrayList<>(); - for (FreightTemplateChild freightTemplateChild : freightTemplateVO.getFreightTemplateChildList()) { - freightTemplateChild.setFreightTemplateId(freightTemplate.getId()); - list.add(freightTemplateChild); + //如果子运费模板不为空则进行新增 + if (freightTemplateVO.getFreightTemplateChildList() != null) { + for (FreightTemplateChild freightTemplateChild : freightTemplateVO.getFreightTemplateChildList()) { + freightTemplateChild.setFreightTemplateId(freightTemplate.getId()); + list.add(freightTemplateChild); + } + //添加运费模板子内容 + freightTemplateChildService.addFreightTemplateChild(list); } - //添加运费模板子内容 - freightTemplateChildService.addFreightTemplateChild(list); + //更新缓存 cache.remove(CachePrefix.SHIP_TEMPLATE.getPrefix() + tokenUser.getStoreId()); return freightTemplateVO; } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public FreightTemplateVO editFreightTemplate(FreightTemplateVO freightTemplateVO) { //获取当前登录商家账号 AuthUser tokenUser = UserContext.getCurrentUser(); @@ -136,7 +138,7 @@ public class FreightTemplateServiceImpl extends ServiceImpl implements StoreAddressService { - private final StoreAddressMapper storeAddressMapper; - @Override - public IPage getStoreAddress(PageVO pageVo) { + public IPage getStoreAddress(String storeId, PageVO pageVo) { //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(StoreAddress::getStoreId, UserContext.getCurrentUser().getStoreId()); - return storeAddressMapper.selectPage(PageUtil.initPage(pageVo), lambdaQueryWrapper); + lambdaQueryWrapper.eq(StoreAddress::getStoreId, storeId); + return this.page(PageUtil.initPage(pageVo), lambdaQueryWrapper); } @Override - public StoreAddress addStoreAddress(StoreAddress storeAddress) { + public StoreAddress addStoreAddress(String storeId, StoreAddress storeAddress) { //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); - storeAddress.setStoreId(tokenUser.getId()); + storeAddress.setStoreId(storeId); //添加自提点 - storeAddressMapper.insert(storeAddress); + this.save(storeAddress); return storeAddress; } @Override - public StoreAddress editStoreAddress(StoreAddress storeAddress) { + public StoreAddress editStoreAddress(String storeId, StoreAddress storeAddress) { //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); - storeAddress.setStoreId(tokenUser.getId()); + storeAddress.setStoreId(storeId); //添加自提点 - storeAddressMapper.updateById(storeAddress); + this.updateById(storeAddress); return storeAddress; } @Override public Boolean removeStoreAddress(String id) { - storeAddressMapper.deleteById(id); - return true; + return this.removeById(id); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreDetailServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreDetailServiceImpl.java index 8eb75ddb..20445779 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreDetailServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreDetailServiceImpl.java @@ -1,58 +1,89 @@ package cn.lili.modules.store.serviceimpl; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.map.MapUtil; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.BeanUtil; import cn.lili.modules.goods.entity.dos.Category; import cn.lili.modules.goods.service.CategoryService; +import cn.lili.modules.goods.service.GoodsService; +import cn.lili.modules.search.utils.EsIndexUtil; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dos.StoreDetail; import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; import cn.lili.modules.store.entity.dto.StoreSettingDTO; +import cn.lili.modules.store.entity.dto.StoreSettlementDay; import cn.lili.modules.store.entity.vos.StoreBasicInfoVO; import cn.lili.modules.store.entity.vos.StoreDetailVO; import cn.lili.modules.store.entity.vos.StoreManagementCategoryVO; +import cn.lili.modules.store.entity.vos.StoreOtherVO; import cn.lili.modules.store.mapper.StoreDetailMapper; import cn.lili.modules.store.service.StoreDetailService; import cn.lili.modules.store.service.StoreService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.GoodsTagsEnum; +import cn.lili.rocketmq.tags.StoreTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * 店铺详细业务层实现 * * @author pikachu - * @date 2020-03-07 16:18:56 + * @since 2020-03-07 16:18:56 */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreDetailServiceImpl extends ServiceImpl implements StoreDetailService { - //店铺详情数据层 - private final StoreDetailMapper storeDetailMapper; - //店铺 - private final StoreService storeService; - //分类 - private final CategoryService categoryService; + /** + * 店铺 + */ + @Autowired + private StoreService storeService; + /** + * 分类 + */ + @Autowired + private CategoryService categoryService; + + @Autowired + private GoodsService goodsService; + + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Autowired + private Cache cache; @Override public StoreDetailVO getStoreDetailVO(String storeId) { - return storeDetailMapper.getStoreDetail(storeId); + StoreDetailVO storeDetailVO = (StoreDetailVO) cache.get(CachePrefix.STORE.getPrefix() + storeId); + if (storeDetailVO == null) { + storeDetailVO = this.baseMapper.getStoreDetail(storeId); + cache.put(CachePrefix.STORE.getPrefix() + storeId, storeDetailVO, 7200L); + } + return storeDetailVO; } @Override public StoreDetailVO getStoreDetailVOByMemberId(String memberId) { - return storeDetailMapper.getStoreDetailByMemberId(memberId); + return this.baseMapper.getStoreDetailByMemberId(memberId); } @Override @@ -64,26 +95,112 @@ public class StoreDetailServiceImpl extends ServiceImpl updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap( + MapUtil.builder(new HashMap()).put("storeId", store.getId()).build(), + MapUtil.builder(new HashMap()).put("storeName", store.getStoreName()).put("selfOperated", store.getSelfOperated()).build()); + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name(); + //发送mq消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback()); + } + + @Override + public Boolean editMerchantEuid(String merchantEuid) { + AuthUser tokenUser = Objects.requireNonNull(UserContext.getCurrentUser()); + Store store = storeService.getById(tokenUser.getStoreId()); + store.setMerchantEuid(merchantEuid); + this.removeCache(store.getId()); return storeService.updateById(store); } + /** + * 获取待结算店铺列表 + * + * @param day 结算日 + * @return 待结算店铺列表 + */ + @Override + public List getSettlementStore(int day) { + return this.baseMapper.getSettlementStore(day); + } + + @Override + public StoreDeliverGoodsAddressDTO getStoreDeliverGoodsAddressDto() { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser().getStoreId()); + return this.baseMapper.getStoreDeliverGoodsAddressDto(storeId); + } + + @Override + public StoreDeliverGoodsAddressDTO getStoreDeliverGoodsAddressDto(String id) { + StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDto = this.baseMapper.getStoreDeliverGoodsAddressDto(id); + if (storeDeliverGoodsAddressDto == null) { + storeDeliverGoodsAddressDto = new StoreDeliverGoodsAddressDTO(); + } + return storeDeliverGoodsAddressDto; + } + + @Override + public boolean editStoreDeliverGoodsAddressDTO(StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDto) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser().getStoreId()); + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.set(StoreDetail::getSalesConsignorName, storeDeliverGoodsAddressDto.getSalesConsignorName()); + lambdaUpdateWrapper.set(StoreDetail::getSalesConsignorMobile, storeDeliverGoodsAddressDto.getSalesConsignorMobile()); + lambdaUpdateWrapper.set(StoreDetail::getSalesConsignorAddressId, storeDeliverGoodsAddressDto.getSalesConsignorAddressId()); + lambdaUpdateWrapper.set(StoreDetail::getSalesConsignorAddressPath, storeDeliverGoodsAddressDto.getSalesConsignorAddressPath()); + lambdaUpdateWrapper.set(StoreDetail::getSalesConsignorDetail, storeDeliverGoodsAddressDto.getSalesConsignorDetail()); + lambdaUpdateWrapper.eq(StoreDetail::getStoreId, storeId); + + + this.removeCache(storeId); + return this.update(lambdaUpdateWrapper); + } + + /** + * 修改店铺的结算日 + * + * @param storeId 店铺ID + * @param dateTime 结算日 + */ + @Override + public void updateSettlementDay(String storeId, DateTime dateTime) { + this.removeCache(storeId); + this.baseMapper.updateSettlementDay(storeId, dateTime); + } + @Override public StoreBasicInfoVO getStoreBasicInfoDTO(String storeId) { - return storeDetailMapper.getStoreBasicInfoDTO(storeId); + return this.baseMapper.getStoreBasicInfoDTO(storeId); } @Override public StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO() { - return storeDetailMapper.getStoreAfterSaleAddressDTO(UserContext.getCurrentUser().getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return this.baseMapper.getStoreAfterSaleAddressDTO(storeId); } + @Override public StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO(String id) { - StoreAfterSaleAddressDTO storeAfterSaleAddressDTO = storeDetailMapper.getStoreAfterSaleAddressDTO(id); + StoreAfterSaleAddressDTO storeAfterSaleAddressDTO = this.baseMapper.getStoreAfterSaleAddressDTO(id); if (storeAfterSaleAddressDTO == null) { storeAfterSaleAddressDTO = new StoreAfterSaleAddressDTO(); } @@ -92,37 +209,43 @@ public class StoreDetailServiceImpl extends ServiceImpl lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.set(StoreDetail::getSalesConsigneeName, storeAfterSaleAddressDTO.getSalesConsigneeName()); lambdaUpdateWrapper.set(StoreDetail::getSalesConsigneeAddressId, storeAfterSaleAddressDTO.getSalesConsigneeAddressId()); lambdaUpdateWrapper.set(StoreDetail::getSalesConsigneeAddressPath, storeAfterSaleAddressDTO.getSalesConsigneeAddressPath()); lambdaUpdateWrapper.set(StoreDetail::getSalesConsigneeDetail, storeAfterSaleAddressDTO.getSalesConsigneeDetail()); lambdaUpdateWrapper.set(StoreDetail::getSalesConsigneeMobile, storeAfterSaleAddressDTO.getSalesConsigneeMobile()); - lambdaUpdateWrapper.eq(StoreDetail::getStoreId, UserContext.getCurrentUser().getStoreId()); + lambdaUpdateWrapper.eq(StoreDetail::getStoreId, storeId); + + this.removeCache(storeId); return this.update(lambdaUpdateWrapper); } + @Override public boolean updateStockWarning(Integer stockWarning) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.set(StoreDetail::getStockWarning, stockWarning); - lambdaUpdateWrapper.eq(StoreDetail::getStoreId, UserContext.getCurrentUser().getStoreId()); + lambdaUpdateWrapper.eq(StoreDetail::getStoreId, storeId); + this.removeCache(storeId); return this.update(lambdaUpdateWrapper); } @Override - public List goodsManagementCategory(String storeId) { + public List goodsManagementCategory(String storeId) { //获取顶部分类列表 List categoryList = categoryService.firstCategory(); //获取店铺信息 - StoreDetail storeDetail = this.getById(storeId); + StoreDetail storeDetail = this.getOne(new LambdaQueryWrapper().eq(StoreDetail::getStoreId, storeId)); //获取店铺分类 String[] storeCategoryList = storeDetail.getGoodsManagementCategory().split(","); List list = new ArrayList<>(); for (Category category : categoryList) { StoreManagementCategoryVO storeManagementCategoryVO = new StoreManagementCategoryVO(category); - for (String storeCategory:storeCategoryList) { + for (String storeCategory : storeCategoryList) { if (storeCategory.equals(category.getId())) { storeManagementCategoryVO.setSelected(true); } @@ -132,4 +255,19 @@ public class StoreDetailServiceImpl extends ServiceImpl implements StoreService { - //店铺 - private final StoreMapper storeMapper; - //会员 + /** + * 会员 + */ + @Autowired private MemberService memberService; - //商品 + + /** + * 店员 + */ + @Autowired + private ClerkService clerkService; + /** + * 商品 + */ + @Autowired private GoodsService goodsService; - //商品SKU + + @Autowired private GoodsSkuService goodsSkuService; - //店铺详情 + /** + * 店铺详情 + */ + @Autowired private StoreDetailService storeDetailService; - //页面 - private PageDataService pageDataService; - //店铺收藏 - private final StoreCollectionService storeCollectionService; + + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Autowired + private FootprintService footprintService; + + @Autowired + private Cache cache; @Override public IPage findByConditionPage(StoreSearchParams storeSearchParams, PageVO page) { - return storeMapper.getStoreList(PageUtil.initPage(page), storeSearchParams.queryWrapper()); + return this.baseMapper.getStoreList(PageUtil.initPage(page), storeSearchParams.queryWrapper()); } @Override public StoreVO getStoreDetail() { - StoreVO storeVO = storeMapper.getStoreDetail(UserContext.getCurrentUser().getStoreId()); - storeVO.setNickName(UserContext.getCurrentUser().getNickName()); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + StoreVO storeVO = this.baseMapper.getStoreDetail(currentUser.getStoreId()); + storeVO.setNickName(currentUser.getNickName()); return storeVO; } @Override + @Transactional(rollbackFor = Exception.class) public Store add(AdminStoreApplyDTO adminStoreApplyDTO) { //判断店铺名称是否存在 - QueryWrapper queryWrapper = Wrappers.query(); + QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.eq("store_name", adminStoreApplyDTO.getStoreName()); if (this.getOne(queryWrapper) != null) { throw new ServiceException(ResultCode.STORE_NAME_EXIST_ERROR); @@ -96,34 +126,35 @@ public class StoreServiceImpl extends ServiceImpl implements throw new ServiceException(ResultCode.USER_NOT_EXIST); } //判断是否拥有店铺 - if (SwitchEnum.OPEN.name().equals(member.getHaveStore())) { + if (Boolean.TRUE.equals(member.getHaveStore())) { throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); } //添加店铺 - Store store=new Store(member,adminStoreApplyDTO); + Store store = new Store(member, adminStoreApplyDTO); this.save(store); //判断是否存在店铺详情,如果没有则进行新建,如果存在则进行修改 - StoreDetail storeDetail = new StoreDetail(store,adminStoreApplyDTO); + StoreDetail storeDetail = new StoreDetail(store, adminStoreApplyDTO); storeDetailService.save(storeDetail); //设置会员-店铺信息 memberService.update(new LambdaUpdateWrapper() - .eq(Member::getId,member.getId()) - .set(Member::getHaveStore,SwitchEnum.OPEN.name()) - .set(Member::getStoreId,store.getId())); + .eq(Member::getId, member.getId()) + .set(Member::getHaveStore, true) + .set(Member::getStoreId, store.getId())); return store; } @Override + @Transactional(rollbackFor = Exception.class) public Store edit(StoreEditDTO storeEditDTO) { if (storeEditDTO != null) { //判断店铺名是否唯一 Store storeTmp = getOne(new QueryWrapper().eq("store_name", storeEditDTO.getStoreName())); - if (storeTmp != null && !StringUtils.equals(storeTmp.getId(), storeEditDTO.getStoreId())) { + if (storeTmp != null && !CharSequenceUtil.equals(storeTmp.getId(), storeEditDTO.getStoreId())) { throw new ServiceException(ResultCode.STORE_NAME_EXIST_ERROR); } //修改店铺详细信息 @@ -145,13 +176,21 @@ public class StoreServiceImpl extends ServiceImpl implements if (store != null) { BeanUtil.copyProperties(storeEditDTO, store); store.setId(storeEditDTO.getStoreId()); - this.updateById(store); + boolean result = this.updateById(store); + if (result) { + storeDetailService.updateStoreGoodsInfo(store); + } + String destination = rocketmqCustomProperties.getStoreTopic() + ":" + StoreTagsEnum.EDIT_STORE_SETTING.name(); + //发送订单变更mq消息 + rocketMQTemplate.asyncSend(destination, store, RocketmqSendCallbackBuilder.commonCallback()); } + + cache.remove(CachePrefix.STORE.getPrefix() + storeEditDTO.getStoreId()); return store; } /** - * 修改店铺详细细腻 + * 修改店铺详细信息 * * @param storeEditDTO 修改店铺信息 */ @@ -162,19 +201,34 @@ public class StoreServiceImpl extends ServiceImpl implements } @Override + @Transactional(rollbackFor = Exception.class) public boolean audit(String id, Integer passed) { - Store store = storeMapper.selectById(id); + Store store = this.getById(id); if (store == null) { throw new ServiceException(ResultCode.STORE_NOT_EXIST); } if (passed == 0) { store.setStoreDisable(StoreStatusEnum.OPEN.value()); - //添加店铺页面 - pageDataService.addStorePageData(store.getId()); + //修改会员 表示已有店铺 + Member member = memberService.getById(store.getMemberId()); + member.setHaveStore(true); + member.setStoreId(id); + memberService.updateById(member); + //创建店员 + ClerkAddDTO clerkAddDTO = new ClerkAddDTO(); + clerkAddDTO.setMemberId(member.getId()); + clerkAddDTO.setIsSuper(true); + clerkAddDTO.setShopkeeper(true); + clerkAddDTO.setStoreId(id); + clerkService.saveClerk(clerkAddDTO); + //设定商家的结算日 + storeDetailService.update(new LambdaUpdateWrapper() + .eq(StoreDetail::getStoreId, id) + .set(StoreDetail::getSettlementDay, new DateTime())); } else { store.setStoreDisable(StoreStatusEnum.REFUSED.value()); } - + cache.remove(CachePrefix.STORE.getPrefix() + store.getId()); return this.updateById(store); } @@ -182,12 +236,25 @@ public class StoreServiceImpl extends ServiceImpl implements public boolean disable(String id) { Store store = this.getById(id); if (store != null) { - store.setStoreDisable(StoreStatusEnum.CLOSED.value()); + LambdaUpdateWrapper storeLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + storeLambdaUpdateWrapper.eq(Store::getId, id); + storeLambdaUpdateWrapper.set(Store::getStoreDisable, StoreStatusEnum.CLOSED.value()); + boolean update = this.update(storeLambdaUpdateWrapper); //下架所有此店铺商品 - goodsService.underStoreGoods(id); - return this.updateById(store); + if (update) { + goodsService.underStoreGoods(id); + } + + //删除店员token + clerkService.list(new LambdaQueryWrapper().eq(Clerk::getStoreId, id)).forEach(clerk -> { + cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.STORE, clerk.getMemberId())); + cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.STORE, clerk.getMemberId())); + }); + + return update; } + throw new ServiceException(ResultCode.STORE_NOT_EXIST); } @@ -205,20 +272,39 @@ public class StoreServiceImpl extends ServiceImpl implements public boolean applyFirstStep(StoreCompanyDTO storeCompanyDTO) { //获取当前操作的店铺 Store store = getStoreByMember(); - //如果没有申请过店铺,新增店铺 - if (!Optional.ofNullable(store).isPresent()) { - Member member = memberService.getById(UserContext.getCurrentUser().getId()); + + //店铺为空,则新增店铺 + if (store == null) { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + Member member = memberService.getById(authUser.getId()); + //根据会员创建店铺 store = new Store(member); + BeanUtil.copyProperties(storeCompanyDTO, store); this.save(store); StoreDetail storeDetail = new StoreDetail(); storeDetail.setStoreId(store.getId()); BeanUtil.copyProperties(storeCompanyDTO, storeDetail); return storeDetailService.save(storeDetail); + } else { + + //校验迪纳普状态 + checkStoreStatus(store); + //复制参数 修改已存在店铺 + BeanUtil.copyProperties(storeCompanyDTO, store); + this.updateById(store); + //判断是否存在店铺详情,如果没有则进行新建,如果存在则进行修改 + StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId()); + //如果店铺详情为空,则new ,否则复制对象,然后保存即可。 + if (storeDetail == null) { + storeDetail = new StoreDetail(); + storeDetail.setStoreId(store.getId()); + BeanUtil.copyProperties(storeCompanyDTO, storeDetail); + return storeDetailService.save(storeDetail); + } else { + BeanUtil.copyProperties(storeCompanyDTO, storeDetail); + return storeDetailService.updateById(storeDetail); + } } - //判断是否存在店铺详情,如果没有则进行新建,如果存在则进行修改 - StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId()); - BeanUtil.copyProperties(storeCompanyDTO, storeDetail); - return storeDetailService.updateById(storeDetail); } @Override @@ -226,6 +312,8 @@ public class StoreServiceImpl extends ServiceImpl implements //获取当前操作的店铺 Store store = getStoreByMember(); + //校验店铺状态 + checkStoreStatus(store); StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId()); //设置店铺的银行信息 BeanUtil.copyProperties(storeBankDTO, storeDetail); @@ -236,6 +324,11 @@ public class StoreServiceImpl extends ServiceImpl implements public boolean applyThirdStep(StoreOtherInfoDTO storeOtherInfoDTO) { //获取当前操作的店铺 Store store = getStoreByMember(); + + //校验店铺状态 + checkStoreStatus(store); + BeanUtil.copyProperties(storeOtherInfoDTO, store); + StoreDetail storeDetail = storeDetailService.getStoreDetail(store.getId()); //设置店铺的其他信息 BeanUtil.copyProperties(storeOtherInfoDTO, storeDetail); @@ -246,91 +339,77 @@ public class StoreServiceImpl extends ServiceImpl implements //修改店铺详细信息 storeDetailService.updateById(storeDetail); //设置店铺名称,修改店铺信息 - store.setStoreName(storeOtherInfoDTO.getStoreName()); store.setStoreDisable(StoreStatusEnum.APPLYING.name()); - store.setStoreCenter(storeOtherInfoDTO.getStoreCenter()); - store.setStoreDesc(storeOtherInfoDTO.getStoreDesc()); - store.setStoreLogo(storeOtherInfoDTO.getStoreLogo()); return this.updateById(store); } - @Override - public Integer auditNum() { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(Store::getStoreDisable, StoreStatusEnum.APPLYING.name()); - return this.count(queryWrapper); + /** + * 申请店铺时 对店铺状态进行校验判定 + * + * @param store 店铺 + */ + private void checkStoreStatus(Store store) { + + //如果店铺状态为已开启、已关闭、申请中,则抛出异常 + if (store.getStoreDisable().equals(StoreStatusEnum.OPEN.name()) + || store.getStoreDisable().equals(StoreStatusEnum.CLOSED.name()) + || store.getStoreDisable().equals(StoreStatusEnum.APPLYING.name()) + ) { + throw new ServiceException(ResultCode.STORE_STATUS_ERROR); + } + } @Override - public Integer storeNum() { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name()); - return this.count(queryWrapper); - } - - @Override - public Integer todayStoreNum() { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name()); - queryWrapper.gt(Store::getCreateTime, DateUtil.beginOfDay(new DateTime())); - return this.count(queryWrapper); - } - - @Override - public void updateStoreGoodsNum(String storeId) { - //获取店铺已上架已审核通过商品数量 - Integer goodsNum=goodsService.count(new LambdaQueryWrapper() - .eq(Goods::getStoreId,storeId) - .eq(Goods::getIsAuth, GoodsAuthEnum.PASS.name()) - .eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name())); + public void updateStoreGoodsNum(String storeId, Long num) { //修改店铺商品数量 this.update(new LambdaUpdateWrapper() - .set(Store::getGoodsNum,goodsNum) - .eq(Store::getId,storeId)); + .set(Store::getGoodsNum, num) + .eq(Store::getId, storeId)); } @Override - public void updateStoreCollectionNum(String goodsId) { - String storeId=goodsSkuService.getById(goodsId).getStoreId(); - //获取店铺收藏数量 - Integer collectionNum=storeCollectionService.count(new LambdaQueryWrapper() - .eq(StoreCollection::getStoreId,storeId)); - //修改店铺收藏数量 - this.update(new LambdaUpdateWrapper() - .set(Store::getCollectionNum,collectionNum) - .eq(Store::getId,storeId)); + public void updateStoreCollectionNum(CollectionDTO collectionDTO) { + baseMapper.updateCollection(collectionDTO.getId(), collectionDTO.getNum()); + } + + @Override + public void storeToClerk() { + //清空店铺信息方便重新导入不会有重复数据 + clerkService.remove(new LambdaQueryWrapper().eq(Clerk::getShopkeeper, true)); + List clerkList = new ArrayList<>(); + //遍历已开启的店铺 + for (Store store : this.list(new LambdaQueryWrapper().eq(Store::getDeleteFlag, false).eq(Store::getStoreDisable, + StoreStatusEnum.OPEN.name()))) { + clerkList.add(new Clerk(store)); + } + clerkService.saveBatch(clerkList); + } + + @Override + public List getToMemberHistory(String memberId) { + AuthUser currentUser = UserContext.getCurrentUser(); + List skuIdList = new ArrayList<>(); + for (FootPrint footPrint : + footprintService.list(new LambdaUpdateWrapper().eq(FootPrint::getStoreId, currentUser.getStoreId()).eq(FootPrint::getMemberId, memberId))) { + if (footPrint.getSkuId() != null) { + skuIdList.add(footPrint.getSkuId()); + } + } + return goodsSkuService.getGoodsSkuByIdFromCache(skuIdList); } /** * 获取当前登录操作的店铺 * - * @return + * @return 店铺信息 */ private Store getStoreByMember() { - LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(Store::getMemberId, UserContext.getCurrentUser().getId()); - return this.getOne(lambdaQueryWrapper); - } - - @Autowired - public void setGoodsService(GoodsService goodsService) { - this.goodsService = goodsService; - } - @Autowired - public void setGoodsSkuService(GoodsSkuService goodsSkuService) { - this.goodsSkuService = goodsSkuService; - } - @Autowired - public void setPageDataService(PageDataService pageDataService) { - this.pageDataService = pageDataService; - } - @Autowired - public void setMemberService(MemberService memberService) { - this.memberService = memberService; - } - @Autowired - public void setStoreDetailService(StoreDetailService storeDetailService) { - this.storeDetailService = storeDetailService; + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (UserContext.getCurrentUser() != null) { + lambdaQueryWrapper.eq(Store::getMemberId, UserContext.getCurrentUser().getId()); + } + return this.getOne(lambdaQueryWrapper, false); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/aop/syslog/annotation/SystemLogPoint.java b/framework/src/main/java/cn/lili/modules/system/aspect/annotation/SystemLogPoint.java similarity index 89% rename from framework/src/main/java/cn/lili/common/aop/syslog/annotation/SystemLogPoint.java rename to framework/src/main/java/cn/lili/modules/system/aspect/annotation/SystemLogPoint.java index 1928d019..9718fd6f 100644 --- a/framework/src/main/java/cn/lili/common/aop/syslog/annotation/SystemLogPoint.java +++ b/framework/src/main/java/cn/lili/modules/system/aspect/annotation/SystemLogPoint.java @@ -1,4 +1,4 @@ -package cn.lili.common.aop.syslog.annotation; +package cn.lili.modules.system.aspect.annotation; import java.lang.annotation.*; diff --git a/framework/src/main/java/cn/lili/common/aop/syslog/interceptor/SystemLogAspect.java b/framework/src/main/java/cn/lili/modules/system/aspect/interceptor/SystemLogAspect.java similarity index 83% rename from framework/src/main/java/cn/lili/common/aop/syslog/interceptor/SystemLogAspect.java rename to framework/src/main/java/cn/lili/modules/system/aspect/interceptor/SystemLogAspect.java index e5b7f90d..c9fa4e4c 100644 --- a/framework/src/main/java/cn/lili/common/aop/syslog/interceptor/SystemLogAspect.java +++ b/framework/src/main/java/cn/lili/modules/system/aspect/interceptor/SystemLogAspect.java @@ -1,16 +1,15 @@ -package cn.lili.common.aop.syslog.interceptor; +package cn.lili.modules.system.aspect.interceptor; -import cn.lili.common.aop.syslog.annotation.SystemLogPoint; +import cn.lili.modules.system.aspect.annotation.SystemLogPoint; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.IpHelper; import cn.lili.common.utils.SpelUtil; import cn.lili.common.utils.ThreadPoolUtil; -import cn.lili.modules.base.entity.systemlog.SystemLogVO; -import cn.lili.modules.connect.util.IpUtils; +import cn.lili.modules.permission.entity.vo.SystemLogVO; +import cn.lili.common.utils.IpUtils; import cn.lili.modules.permission.service.SystemLogService; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; @@ -35,25 +34,26 @@ import java.util.Map; @Aspect @Component @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SystemLogAspect { /** * 启动线程异步记录日志 */ - private static final ThreadLocal beginTimeThreadLocal = new NamedThreadLocal<>("SYSTEM-LOG"); + private static final ThreadLocal BEGIN_TIME_THREAD_LOCAL = new NamedThreadLocal<>("SYSTEM-LOG"); + @Autowired + private SystemLogService systemLogService; - private final SystemLogService systemLogService; + @Autowired + private HttpServletRequest request; - private final HttpServletRequest request; - - private final IpHelper ipHelper; + @Autowired + private IpHelper ipHelper; /** * Controller层切点,注解方式 */ - @Pointcut("@annotation(cn.lili.common.aop.syslog.annotation.SystemLogPoint)") + @Pointcut("@annotation(cn.lili.modules.system.aspect.annotation.SystemLogPoint)") public void controllerAspect() { } @@ -63,7 +63,7 @@ public class SystemLogAspect { */ @Before("controllerAspect()") public void doBefore() { - beginTimeThreadLocal.set(new Date()); + BEGIN_TIME_THREAD_LOCAL.set(new Date()); } @@ -104,7 +104,7 @@ public class SystemLogAspect { //请求参数 systemLogVO.setMapToParams(logParams); //响应参数 此处数据太大了,所以先注释掉 -// systemLogVO.setResponseBody(JSONUtil.toJsonStr(rvt)); +// systemLogVO.setResponseBody(JSONUtil.toJsonStr(rvt)); //请求IP systemLogVO.setIp(IpUtils.getIpAddress(request)); //IP地址 @@ -112,7 +112,7 @@ public class SystemLogAspect { //写入自定义日志内容 systemLogVO.setCustomerLog(customerLog); //请求开始时间 - long beginTime = beginTimeThreadLocal.get().getTime(); + long beginTime = BEGIN_TIME_THREAD_LOCAL.get().getTime(); long endTime = System.currentTimeMillis(); //请求耗时 Long usedTime = endTime - beginTime; @@ -120,6 +120,8 @@ public class SystemLogAspect { //调用线程保存 ThreadPoolUtil.getPool().execute(new SaveSystemLogThread(systemLogVO, systemLogService)); + + BEGIN_TIME_THREAD_LOCAL.remove(); } catch (Exception e) { log.error("系统日志保存异常", e); } @@ -129,9 +131,10 @@ public class SystemLogAspect { * 保存日志 */ private static class SaveSystemLogThread implements Runnable { - - private final SystemLogVO systemLogVO; - private final SystemLogService systemLogService; + @Autowired + private SystemLogVO systemLogVO; + @Autowired + private SystemLogService systemLogService; public SaveSystemLogThread(SystemLogVO systemLogVO, SystemLogService systemLogService) { this.systemLogVO = systemLogVO; @@ -158,7 +161,7 @@ public class SystemLogAspect { */ private static Map spelFormat(JoinPoint joinPoint, Object rvt) { - Map result = new HashMap<>(); + Map result = new HashMap<>(2); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); SystemLogPoint systemLogPoint = signature.getMethod().getAnnotation(SystemLogPoint.class); String description = systemLogPoint.description(); diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/AppVersionDO.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/AppVersion.java similarity index 81% rename from framework/src/main/java/cn/lili/modules/system/entity/dos/AppVersionDO.java rename to framework/src/main/java/cn/lili/modules/system/entity/dos/AppVersion.java index 850ef3b5..d6c7dad9 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/AppVersionDO.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dos/AppVersion.java @@ -1,8 +1,8 @@ package cn.lili.modules.system.entity.dos; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -12,10 +12,6 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; @@ -23,24 +19,15 @@ import java.util.Date; * app历史版本维护 * * @author zh - * @date 2020-06-20 09:29:19 + * @since 2020-06-20 09:29:19 */ @Data -@Entity -@Table(name = "li_app_version") @TableName("li_app_version") @ApiModel(value = "app版本控制") -public class AppVersionDO{ +public class AppVersion extends BaseIdEntity { private static final long serialVersionUID = 3034686331756935L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -59,7 +46,6 @@ public class AppVersionDO{ @ApiModelProperty(value = "版本名称") private String versionName; - @ApiModelProperty(value = "更新内容") private String content; diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/InstantDelivery.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/InstantDelivery.java deleted file mode 100644 index 324aaf6d..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/InstantDelivery.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.lili.modules.system.entity.dos; - - -import cn.lili.base.BaseEntity; -import cn.lili.modules.system.entity.vo.InstantDeliveryVO; -import com.baomidou.mybatisplus.annotation.TableName; -import com.google.gson.Gson; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; - -/** - * 即时配送 - * - * @author pikachu - * @date 2020/12/01 15:58 - */ -@Data -@Entity -@Table(name = "li_instant_delivery") -@TableName("li_instant_delivery") -@ApiModel(value = "即时配送") -@AllArgsConstructor -@NoArgsConstructor -public class InstantDelivery extends BaseEntity { - - - /** - * 即时配送名称 - */ - @ApiModelProperty(value = "即时配送名称") - private String deliveryName; - /** - * 是否开启即时配送,1开启,0未开启 - */ - @ApiModelProperty(value = "是否开启即时配送,1开启,0未开启") - private Integer deliveryOpen; - /** - * 即时配送配置 - */ - @ApiModelProperty(value = "即时配送配置") - @Column(columnDefinition = "TEXT") - private String deliveryConfig; - /** - * 即时配送bean - */ - @ApiModelProperty(value = "即时配送bean") - private String deliveryBean; - - @ApiModelProperty(value = "封面图片") - private String images; - - - /** - * 根据vo参数构建do - * - * @param instantDeliveryVO - */ - public InstantDelivery(InstantDeliveryVO instantDeliveryVO) { - this.setDeliveryName(instantDeliveryVO.getDeliveryName()); - this.setDeliveryOpen(instantDeliveryVO.getDeliveryOpen()); - this.setDeliveryBean(instantDeliveryVO.getDeliveryBean()); - Gson gson = new Gson(); - this.setDeliveryConfig(gson.toJson(instantDeliveryVO.getConfigItems())); - } - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/InstantDeliveryLog.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/InstantDeliveryLog.java deleted file mode 100644 index 0eef125b..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/InstantDeliveryLog.java +++ /dev/null @@ -1,111 +0,0 @@ -package cn.lili.modules.system.entity.dos; - - -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.system.entity.plugin.InstantDelivery.dada.enums.DadaOrderStatusEnum; -import cn.lili.modules.system.entity.plugin.InstantDelivery.dada.vo.DdOrderBackVO; -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import java.util.Date; - -/** - * 即时配送日志 - * - * @author pikachu - * @date 2020/12/01 15:58 - */ - -@Data -@Entity -@Table(name = "li_instant_delivery_log") -@TableName("li_instant_delivery_log") -@ApiModel(value = "即时配送日志") -@AllArgsConstructor -@NoArgsConstructor -public class InstantDeliveryLog { - - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - - @CreatedDate - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @TableField(fill = FieldFill.INSERT) - @ApiModelProperty(value = "创建时间", hidden = true) - private Date createTime; - /** - * 即时配送订单号 - */ - @ApiModelProperty(value = "即时配送订单号") - private String deliveryOrderSn; - /** - * 商城订单号 - */ - @ApiModelProperty(value = "商城订单号") - private String orderSn; - /** - * 即时配送订单状态 - * - * @see DadaOrderStatusEnum - */ - @ApiModelProperty(value = "即时配送订单状态") - private String deliveryOrderStatus; - /** - * 配送员ID - */ - @ApiModelProperty(value = "即时配送骑手编号") - private String distributorNumber; - /** - * 配送员姓名,接单以后会存储 - */ - @ApiModelProperty(value = "配送员姓名,接单以后会存储") - private String distributorName; - /** - * 配送员手机号,接单以后存储 - */ - @ApiModelProperty(value = "配送员手机号,接单以后存储") - private String distributorMobile; - - /** - * 订单取消原因,其他状态下默认值为空字符串 - */ - @ApiModelProperty(value = "订单取消原因,其他状态下默认值为空字符串") - private String cancelReason; - - public InstantDeliveryLog(DdOrderBackVO ddOrderBackVO) { - this.setCancelReason(ddOrderBackVO.getCancelReason()); - this.setOrderSn(ddOrderBackVO.getOrderId()); - this.setDeliveryOrderSn(ddOrderBackVO.getClientId()); - if (!StringUtils.isEmpty(ddOrderBackVO.getDmMobile())) { - this.setDistributorMobile(ddOrderBackVO.getDmMobile()); - } - if (!StringUtils.isEmpty(ddOrderBackVO.getDmName())) { - this.setDistributorName(ddOrderBackVO.getDmName()); - } - if (ddOrderBackVO.getDmId() != null) { - this.setDistributorNumber(ddOrderBackVO.getDmId().toString()); - } - this.setDeliveryOrderStatus(DadaOrderStatusEnum.getText(100)); - } - - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/Logistics.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/Logistics.java index bdb99e35..5b614639 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/Logistics.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dos/Logistics.java @@ -1,24 +1,20 @@ package cn.lili.modules.system.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; /** * 物流公司设置 * * @author Chopper - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ @Data -@Entity -@Table(name = "li_logistics") @TableName("li_logistics") @ApiModel(value = "物流公司") public class Logistics extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/Region.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/Region.java index 2b52d99e..c016bb6d 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/Region.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dos/Region.java @@ -1,24 +1,20 @@ package cn.lili.modules.system.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; /** * 行政地区 * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_region") @TableName("li_region") @ApiModel(value = "行政地区") public class Region extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/SensitiveWords.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/SensitiveWords.java index dca87da8..49fa833a 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/SensitiveWords.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dos/SensitiveWords.java @@ -1,13 +1,11 @@ package cn.lili.modules.system.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; @@ -17,8 +15,6 @@ import javax.validation.constraints.Size; * 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_sensitive_words") @TableName("li_sensitive_words") @ApiModel(value = "敏感词") public class SensitiveWords extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/ServiceNotice.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/ServiceNotice.java index 6bc02c3a..1b5c2469 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/ServiceNotice.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dos/ServiceNotice.java @@ -1,22 +1,18 @@ package cn.lili.modules.system.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 服务订阅消息 * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_service_notice") @TableName("li_service_notice") @ApiModel(value = "服务订阅消息") public class ServiceNotice extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dos/Setting.java b/framework/src/main/java/cn/lili/modules/system/entity/dos/Setting.java index d1d71421..4f8a37a8 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dos/Setting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dos/Setting.java @@ -1,23 +1,19 @@ package cn.lili.modules.system.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 设置 * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_setting") @TableName("li_setting") @ApiModel(value = "配置") @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/BaseSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/BaseSetting.java index 8f2a5026..3c257e24 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/BaseSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/BaseSetting.java @@ -9,7 +9,7 @@ import java.io.Serializable; * 基础设置 * * @author Chopper - * @date 2020/11/17 7:58 下午 + * @since 2020/11/17 7:58 下午 */ @Data public class BaseSetting implements Serializable { @@ -25,12 +25,21 @@ public class BaseSetting implements Serializable { @ApiModelProperty(value = "后端logo") private String domainLogo; + @ApiModelProperty(value = "后端icon") + private String domainIcon; + @ApiModelProperty(value = "买家端logo") private String buyerSideLogo; + @ApiModelProperty(value = "买家端icon") + private String buyerSideIcon; + @ApiModelProperty(value = "商家端logo") private String storeSideLogo; + @ApiModelProperty(value = "商家端icon") + private String storeSideIcon; + @ApiModelProperty(value = "站点地址") private String staticPageAddress; diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/DistributionSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/DistributionSetting.java index 289d1b84..3a8bcbf4 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/DistributionSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/DistributionSetting.java @@ -8,7 +8,7 @@ import java.io.Serializable; * 分销配置 * * @author Chopper - * @date 2020/12/23 18:35 + * @since 2020/12/23 18:35 */ @Data public class DistributionSetting implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/EmailSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/EmailSetting.java index c7657318..3e969302 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/EmailSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/EmailSetting.java @@ -9,7 +9,7 @@ import java.io.Serializable; * 邮箱设置 * * @author Chopper - * @date 2020/11/26 15:58 + * @since 2020/11/26 15:58 */ @Data public class EmailSetting implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/ExperienceSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/ExperienceSetting.java new file mode 100644 index 00000000..cb169563 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/ExperienceSetting.java @@ -0,0 +1,33 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 经验值设置 + * + * @author Bulbasaur + * @since 2021/5/16 11:10 下午 + */ +@Data +public class ExperienceSetting implements Serializable { + + private static final long serialVersionUID = -4261856614779031745L; + @ApiModelProperty(value = "注册") + private Integer register; + + @ApiModelProperty(value = "每日签到经验值") + private Integer signIn; + + @ApiModelProperty(value = "订单评价赠送经验值") + private Integer comment; + + @ApiModelProperty(value = "分享获取经验值") + private Integer share; + + @ApiModelProperty(value = "购物获取经验值,一元*经验值") + private Integer money; + +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/GoodsSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/GoodsSetting.java index ed6c26d4..ba2c888a 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/GoodsSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/GoodsSetting.java @@ -9,7 +9,7 @@ import java.io.Serializable; * 商品设置 * * @author Chopper - * @date 2020/11/17 7:58 下午 + * @since 2020/11/17 7:58 下午 */ @Data public class GoodsSetting implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSetting.java new file mode 100644 index 00000000..0b98d43b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSetting.java @@ -0,0 +1,28 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 搜索热词 + * + * @author Bulbasaur + * @since 2021/5/16 11:10 下午 + */ +@Data +public class HotWordsSetting implements Serializable { + + //热词1-5,默认分数1-5 + + @ApiModelProperty(value = "热词默认配置") + private List hotWordsSettingItems = new ArrayList<>(); + + + @ApiModelProperty("每日保存数量") + private Integer saveNum; + +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSettingItem.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSettingItem.java new file mode 100644 index 00000000..41fa826c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/HotWordsSettingItem.java @@ -0,0 +1,41 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 积分签到设置 + * + * @author Chopper + * @since 2021-02-26 11:48 + */ +@Data +public class HotWordsSettingItem implements Comparable, Serializable { + + + @ApiModelProperty(value = "热词") + private String keywords; + + + @ApiModelProperty(value = "默认分数") + private Integer score; + + + public Integer getScore() { + if (score == null || score < 0) { + return 0; + } + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + @Override + public int compareTo(HotWordsSettingItem pointSettingItem) { + return pointSettingItem.getScore(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/ImSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/ImSetting.java new file mode 100644 index 00000000..b3c644ae --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/ImSetting.java @@ -0,0 +1,22 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * IM设置 + * + * @author Bulbasaur + * @since 2021/5/16 11:10 下午 + */ +@Data +public class ImSetting implements Serializable { + + + @ApiModelProperty(value = "平台地址") + private String httpUrl; + + +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/KuaidiSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/KuaidiSetting.java deleted file mode 100644 index 3b300b02..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/KuaidiSetting.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.lili.modules.system.entity.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * 快递设置 - * - * @author Chopper - * @date 2020-03-10 10:04 上午 - */ -@Data -public class KuaidiSetting implements Serializable { - private static final long serialVersionUID = 3520379500723173689L; - /** - * 企业id - */ - private String ebusinessID; - /** - * 密钥 - */ - private String appKey; - /** - * api地址 - */ - private String reqURL; -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/LogisticsSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/LogisticsSetting.java new file mode 100644 index 00000000..3eb5a893 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/LogisticsSetting.java @@ -0,0 +1,67 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; +import lombok.Data; + +import java.io.Serializable; + +/** + * 快递设置 + * + * @author Chopper + * @since 2020-03-10 10:04 上午 + */ +@Data +public class LogisticsSetting implements Serializable { + private static final long serialVersionUID = 3520379500723173689L; + + /** + * 快递查询类型 + * @see LogisticsEnum + */ + private String type; + + /** + * 企业id + */ + private String kdniaoEbusinessID; + /** + * 密钥 + */ + private String kdniaoAppKey; + + /** + * 快递100 授权码,请申请企业版获取 + */ + private String kuaidi100Customer; + /** + * 快递100 Key + */ + private String kuaidi100Key; + + /** + * 顺丰顾客编码 + */ + String clientCode; + + /** + * 顺丰校验码 + */ + String checkWord; + + /** + * 顺丰请求地址 + */ + String callUrl; + + /** + * 顺丰打印模板 + */ + String templateCode; + + /** + * 顺丰月结号 + */ + String monthlyCardNo; +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/OrderSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/OrderSetting.java index 1d8a571f..7187c2ba 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/OrderSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/OrderSetting.java @@ -9,7 +9,7 @@ import java.io.Serializable; * 订单设置 * * @author Chopper - * @date 2020/11/17 7:59 下午 + * @since 2020/11/17 7:59 下午 */ @Data public class OrderSetting implements Serializable { @@ -21,21 +21,37 @@ public class OrderSetting implements Serializable { @ApiModelProperty(value = "自动收货 天") private Integer autoReceive; - //已完成订单允许退单:X天内,允许客户发起退货退款申请,未发货订单随时可退,未发货订单随时可退。 + /** + * 已完成订单允许退单:X天内,允许客户发起退货退款申请,未发货订单随时可退,未发货订单随时可退 + */ @ApiModelProperty(value = "已完成订单允许退单 天") - private Integer autoComplete; + private Integer closeAfterSale; @ApiModelProperty(value = "自动评价 天") private Integer autoEvaluation; + //---------------售后--------------- + @ApiModelProperty(value = "售后自动取消 天") private Integer autoCancelAfterSale; - //待审核退单自动审核:X天后,商家逾期未处理的待审核退单,将会自动审核通过。 + /** + * 待审核退单自动审核:X天后,商家逾期未处理的待审核退单,将会自动审核通过。 + */ @ApiModelProperty(value = "待审核退单自动审核 天") private Integer autoAfterSaleReview; - //退单自动确认收货:X天后,商家逾期未处理的待收货退单,将会自动确认收货,非快递退货的退单,再审核通过后开始计时。 + /** + * 退单自动确认收货:X天后,商家逾期未处理的待收货退单,将会自动确认收货,非快递退货的退单,再审核通过后开始计时。 + */ @ApiModelProperty(value = "已完成订单允许退单 天") private Integer autoAfterSaleComplete; + + //---------------投诉--------------- + /** + * 已完成订单允许投诉:X天内,允许客户发起交易投诉 + * 如果写0,则不允许投诉 + */ + @ApiModelProperty(value = "已完成订单允许投诉 天") + private Integer closeComplaint; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/OssSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/OssSetting.java index 83bcf735..95c225ba 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/OssSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/OssSetting.java @@ -1,5 +1,7 @@ package cn.lili.modules.system.entity.dto; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.file.entity.enums.OssEnum; import lombok.Data; import java.io.Serializable; @@ -8,25 +10,114 @@ import java.io.Serializable; * OSS设置 * * @author Chopper - * @date 2020/11/26 15:50 + * @since 2020/11/26 15:50 */ @Data public class OssSetting implements Serializable { private static final long serialVersionUID = 2975271656230801861L; - //域名 - private String endPoint = "oss-cn-beijing.aliyuncs.com"; - //储存空间 - private String bucketName = "lilishop-oss"; + /** + * oss类型 + */ + private String type; - //存放路径路径 - private String picLocation = "/template"; + /** + * 阿里云-域名 + */ + private String aliyunOSSEndPoint = ""; + /** + * 阿里云-储存空间 + */ + private String aliyunOSSBucketName = ""; + /** + * 阿里云-存放路径路径 + */ + private String aliyunOSSPicLocation = ""; + /** + * 阿里云-密钥id + */ + private String aliyunOSSAccessKeyId = ""; + /** + * 阿里云-密钥 + */ + private String aliyunOSSAccessKeySecret = ""; - //密钥id - private String accessKeyId = "LTAI4G4deX59EyjpEULaJdsU"; - //密钥 - private String accessKeySecret = "BlRBpl7WBman6GYYwLKMiKqMTXFhWf"; + /** + * minio服务地址 + */ + private String m_endpoint; + + /** + * minio 前端请求地址 + */ + private String m_frontUrl; + + /** + * minio用户名 + */ + private String m_accessKey; + + /** + * minio密码 + */ + private String m_secretKey; + + /** + * minio bucket名称 + */ + private String m_bucketName; + + + /** + * 华为云-发起者的Access Key + * + * @return + */ + + String huaweicloudOBSAccessKey; + /** + * 华为云-密钥 + */ + String huaweicloudOBSSecretKey; + /** + * 华为云OBS-节点 + */ + String huaweicloudOBSEndPoint; + + /** + * 华为云OBS-桶 + */ + private String huaweicloudOBSBucketName = ""; + + /** + * 腾讯云 用户的 SecretId + */ + String tencentCOSSecretId; + /** + * 腾讯云 用户的 SecretKey + */ + String tencentCOSSecretKey; + /** + * 腾讯云 bucket 的地域 + */ + String tencentCOSRegion; + /** + * 腾讯云 bucket + */ + String tencentCOSBucket; + /** + * 腾讯云-域名 + */ + private String tencentCOSEndPoint = ""; + + public String getType() { + //默认给阿里云oss存储类型 + if (StringUtils.isEmpty(type)) { + return OssEnum.ALI_OSS.name(); + } + return type; + } } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java index 0e5d29dd..6679b454 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java @@ -11,7 +11,7 @@ import java.util.List; * 积分设置 * * @author Chopper - * @date 2020/11/17 7:59 下午 + * @since 2020/11/17 7:59 下午 */ @Data public class PointSetting implements Serializable { @@ -20,7 +20,10 @@ public class PointSetting implements Serializable { @ApiModelProperty(value = "注册") private Integer register; - @ApiModelProperty(value = "1积分等于多少元") + @ApiModelProperty(value = "消费1元赠送多少积分") + private Integer consumer; + + @ApiModelProperty(value = "积分付款X积分=1元") private Integer money; @ApiModelProperty(value = "每日签到积分") @@ -32,5 +35,38 @@ public class PointSetting implements Serializable { @ApiModelProperty(value = "积分具体设置") private List pointSettingItems = new ArrayList<>(); + public Integer getRegister() { + if (register == null || register < 0) { + return 0; + } + return register; + } + public Integer getMoney() { + if (money == null || money < 0) { + return 0; + } + return money; + } + + public Integer getConsumer() { + if (consumer == null || consumer < 0) { + return 0; + } + return consumer; + } + + public Integer getSignIn() { + if (signIn == null || signIn < 0) { + return 0; + } + return signIn; + } + + public Integer getComment() { + if (comment == null || comment < 0) { + return 0; + } + return comment; + } } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSettingItem.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSettingItem.java index 5759d6e4..885b4b19 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSettingItem.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSettingItem.java @@ -3,14 +3,16 @@ package cn.lili.modules.system.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; + /** * 积分签到设置 * * @author Chopper - * @date 2021-02-26 11:48 + * @since 2021-02-26 11:48 */ @Data -public class PointSettingItem implements Comparable { +public class PointSettingItem implements Comparable, Serializable { @ApiModelProperty(value = "签到天数") @@ -20,6 +22,17 @@ public class PointSettingItem implements Comparable { @ApiModelProperty(value = "赠送积分") private Integer point; + public Integer getPoint() { + if (point == null || point < 0) { + return 0; + } + return point; + } + + public void setPoint(Integer point) { + this.point = point; + } + @Override public int compareTo(PointSettingItem pointSettingItem) { return this.day - pointSettingItem.getDay(); diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/SeckillSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/SeckillSetting.java new file mode 100644 index 00000000..9661501b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/SeckillSetting.java @@ -0,0 +1,25 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 秒杀活动设置 + * + * @author Bulbasaur + * @since 2021/5/24 3:27 下午 + */ +@Data +public class SeckillSetting implements Serializable { + + @ApiModelProperty(value = "开启几点场 例如:6,8,12") + @NotNull(message = "活动时间段不能为空") + private String hours; + + @ApiModelProperty(value = "秒杀规则") + @NotNull(message = "秒杀规则不能为空") + private String seckillRule; +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/SmsSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/SmsSetting.java index 4238b747..f72589ca 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/SmsSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/SmsSetting.java @@ -6,24 +6,61 @@ import java.io.Serializable; /** * 短信配置 + * 这里在前台不做调整,方便客户直接把服务商的内容配置在我们平台 * * @author Chopper - * @date 2020/11/30 15:23 + * @since 2020/11/30 15:23 */ @Data public class SmsSetting implements Serializable { + /** - * 从上到下yi依次是 - * 节点地址 - * key - * 密钥 - * 签名,这里在前台不做调整,方便客户直接把服务商的内容配置在我们平台 + * 类型 */ - private String regionId; + private String type; + /** + * key + */ private String accessKeyId; - + /** + * 密钥 + */ private String accessSecret; - + /** + * 签名 + */ private String signName; + + + /** + * 腾讯云 用户的 SecretId + */ + String tencentSecretId; + /** + * 腾讯云 用户的 SecretKey + */ + String tencentSecretKey; + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + String tencentSdkAppId; + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + String tencentSignName; + + /** + * 华为 APP_Key + */ + String huaweiAppKey; + /** + * 华为 APP_Secret + */ + String huaweiAppSecret; + + /** + * 国内短信签名通道号或国际/港澳台短信通道号 + */ + String huaweiSender; + /** + * 签名名称 + */ + String huaweiSignature; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java index baffc079..76b7737c 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/WithdrawalSetting.java @@ -8,14 +8,35 @@ import java.io.Serializable; * 提现配置 * * @author pikachu - * @date 2020/11/30 15:23 + * @since 2020/11/30 15:23 */ @Data public class WithdrawalSetting implements Serializable { private static final long serialVersionUID = -3872782530832122976L; /** - * 提现是否需要申请 + * 提现最低金额 + */ + private Double minPrice; + /** + * 提现手续费 + */ + private Double fee; + /** + * 提现类型 WECHAT\ALI + */ + private String type; + /** + * 提现是否需要审核 */ private Boolean apply; + + /** + * 微信提现-渠道使用的APPID + */ + private String wechatAppId; + /** + * 微信APPID渠道 + */ + private String wechatAppIdSource; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/QQConnectSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/QQConnectSetting.java index fb0ed185..ceafe10e 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/QQConnectSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/QQConnectSetting.java @@ -9,7 +9,7 @@ import java.util.List; * QQ联合登录设置 * * @author Chopper - * @date 2020/11/17 7:59 下午 + * @since 2020/11/17 7:59 下午 */ @Data public class QQConnectSetting { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/WechatConnectSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/WechatConnectSetting.java index 9d4ddb64..577f0a88 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/WechatConnectSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/WechatConnectSetting.java @@ -9,7 +9,7 @@ import java.util.List; * 微信设置 * * @author Chopper - * @date 2020/11/17 8:00 下午 + * @since 2020/11/17 8:00 下午 */ @Data public class WechatConnectSetting { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/QQConnectSettingItem.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/QQConnectSettingItem.java index 7a9da594..ecc0cd22 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/QQConnectSettingItem.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/QQConnectSettingItem.java @@ -7,7 +7,7 @@ import lombok.Data; * QQ联合登录具体配置 * * @author Chopper - * @date 2020/11/17 7:59 下午 + * @since 2020/11/17 7:59 下午 */ @Data public class QQConnectSettingItem { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/WechatConnectSettingItem.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/WechatConnectSettingItem.java index 9fdbc17f..68aff383 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/WechatConnectSettingItem.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/connect/dto/WechatConnectSettingItem.java @@ -6,7 +6,7 @@ import lombok.Data; * 微信设置 * * @author Chopper - * @date 2020/11/17 8:00 下午 + * @since 2020/11/17 8:00 下午 */ @Data public class WechatConnectSettingItem { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/AlipayPaymentSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/AlipayPaymentSetting.java index 087639b0..f3bfe460 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/AlipayPaymentSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/AlipayPaymentSetting.java @@ -7,25 +7,35 @@ import lombok.experimental.Accessors; * 支付宝支付设置 * * @author Chopper - * @date 2020-12-02 10:09 + * @since 2020-12-02 10:09 */ @Data @Accessors(chain = true) public class AlipayPaymentSetting { - //应用id + /** + * 应用id + */ private String appId; - //私钥 + /** + * 私钥 + */ private String privateKey; - //应用证书 + /** + * 应用证书 + */ private String certPath; - //支付宝公钥 + /** + * 支付宝公钥 + */ private String alipayPublicCertPath; - //支付宝根证书 + /** + * 支付宝根证书 + */ private String rootCertPath; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/PaymentSupportSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/PaymentSupportSetting.java index e5a512ea..096cf4b3 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/PaymentSupportSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/PaymentSupportSetting.java @@ -1,7 +1,7 @@ package cn.lili.modules.system.entity.dto.payment; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import cn.lili.modules.system.entity.dto.payment.dto.PaymentSupportForm; import cn.lili.modules.system.entity.dto.payment.dto.PaymentSupportItem; import lombok.Data; @@ -14,7 +14,7 @@ import java.util.List; * 支持的支付方式 * * @author Chopper - * @date 2021-01-26 15:52 + * @since 2021-01-26 15:52 */ @Data @Accessors(chain = true) diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/UnionPaymentSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/UnionPaymentSetting.java new file mode 100644 index 00000000..ba3e47b2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/UnionPaymentSetting.java @@ -0,0 +1,35 @@ +package cn.lili.modules.system.entity.dto.payment; + +import lombok.Data; +import lombok.experimental.Accessors; +/** + * 银联-云闪付支付设置 + * + * @author Bulbasaur + * @since 2023-02-17 + */ +@Data +@Accessors(chain = true) +public class UnionPaymentSetting { + + /** + * 商户号 + */ + private String unionPayMachId; + /** + * 密钥 + */ + private String unionPayKey; + /** + * 请求地址 + */ + private String unionPayServerUrl; + /** + * 交易请求地址 + */ + private String unionPayDomain; + /** + * 应用ID + */ + private String unionPayAppId; +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/WechatPaymentSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/WechatPaymentSetting.java index b80ceb5d..4a027dc2 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/WechatPaymentSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/WechatPaymentSetting.java @@ -7,25 +7,46 @@ import lombok.experimental.Accessors; * 微信支付设置 * * @author Chopper - * @date 2020-12-02 10:08 + * @since 2020-12-02 10:08 */ @Data @Accessors(chain = true) public class WechatPaymentSetting { - - //应用id + /** + * APP应用id + */ private String appId; - //商户号 + /** + * 小程序应用id + */ + private String mpAppId; + /** + * 服务号应用id + */ + private String serviceAppId; + /** + * 商户号 + */ private String mchId; - //私钥 + /** + * 私钥 + */ private String apiclient_key; - //pem 证书 + /** + * pem 证书 + */ private String apiclient_cert_pem; - //p12 证书 + /** + * p12 证书 + */ private String apiclient_cert_p12; - //商户证书序列号 + /** + * 商户证书序列号 + */ private String serialNumber; - //apiv3私钥 + /** + * apiv3私钥 + */ private String apiKey3; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/dto/PaymentSupportForm.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/dto/PaymentSupportForm.java index fe28379b..0284a7e1 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/dto/PaymentSupportForm.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/payment/dto/PaymentSupportForm.java @@ -1,7 +1,7 @@ package cn.lili.modules.system.entity.dto.payment.dto; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; import lombok.Data; import lombok.experimental.Accessors; @@ -27,7 +27,9 @@ public class PaymentSupportForm { public List getClients() { List keys = new ArrayList<>(); for (ClientTypeEnum clientTypeEnum : ClientTypeEnum.values()) { - if (clientTypeEnum.equals(ClientTypeEnum.UNKNOWN)) continue; + if (clientTypeEnum.equals(ClientTypeEnum.UNKNOWN)){ + continue; + } keys.add(clientTypeEnum); } return keys; @@ -42,7 +44,9 @@ public class PaymentSupportForm { List keys = new ArrayList<>(); for (PaymentMethodEnum paymentMethodEnum : PaymentMethodEnum.values()) { - if (paymentMethodEnum.equals(PaymentMethodEnum.BANK_TRANSFER)) continue; + if (paymentMethodEnum.equals(PaymentMethodEnum.BANK_TRANSFER)){ + continue; + } keys.add(paymentMethodEnum); } return keys; diff --git a/framework/src/main/java/cn/lili/modules/system/entity/enums/AppType.java b/framework/src/main/java/cn/lili/modules/system/entity/enums/AppType.java index 86da8abe..7312be6f 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/enums/AppType.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/enums/AppType.java @@ -5,7 +5,7 @@ package cn.lili.modules.system.entity.enums; * app类型 安卓 IOS * * @author Chopper - * @date 2020/9/11 17:03 + * @since 2020/9/11 17:03 */ public enum AppType { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/enums/InstantDeliveryUrl.java b/framework/src/main/java/cn/lili/modules/system/entity/enums/InstantDeliveryUrl.java deleted file mode 100644 index dbd5e25b..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/enums/InstantDeliveryUrl.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.lili.modules.system.entity.enums; - - -import lombok.Getter; -import lombok.Setter; - -/** - * 即时配送url接口地址 - * - * @author pikachu - * @date 2020/9/11 17:03 - */ -public enum InstantDeliveryUrl { - - /** - * 订单推送 - */ - DD_ADD_ORDER("/api/order/addOrder"), - /** - * 订单重发 - */ - DD_RE_ADD_ORDER("/api/order/reAddOrder"), - /** - * 订单妥投异常后,商家确认收货 - */ - DD_CONFIRM_ORDER("/api/order/confirm/goods"), - /** - * 店铺添加 - */ - DD_ADD_SHOP("/api/store/add"), - /** - * 店铺修改 - */ - DD_UPDATE_SHOP("/api/store/update"), - - /** - * 订单详细信息 - */ - DD_QUERY_ORDER("/api/order/status/query"), - - /** - * 订单取消 - */ - DD_CANDLE_ORDER("/api/order/formalCancel"), - - /** - * 城市code获取 - */ - DD_CITY_CODE("/api/cityCode/list"); - - /** - * 类型 - */ - @Getter - @Setter - private final String url; - - InstantDeliveryUrl(String url) { - this.url = url; - } - -} - diff --git a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java index bffbae87..0ec08b9e 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java @@ -4,7 +4,7 @@ package cn.lili.modules.system.entity.enums; * 系统设置常量 * * @author Chopper - * @date 2020/9/11 17:03 + * @since 2020/9/11 17:03 */ public enum SettingEnum { //基础配置 @@ -17,16 +17,22 @@ public enum SettingEnum { EMAIL_SETTING, //商品设置 GOODS_SETTING, - //快递鸟设置 - KUAIDI_SETTING, + //快递设置 + LOGISTICS_SETTING, //订单配置 ORDER_SETTING, //阿里OSS配置 OSS_SETTING, - //阿里短信配置 + //阿里短信配置 SMS_SETTING, //积分设置 POINT_SETTING, + //经验值设置 + EXPERIENCE_SETTING, + //秒杀活动设置 + SECKILL_SETTING, + //IM 配置 + IM_SETTING, //微信 联合登陆设置 WECHAT_CONNECT, @@ -39,4 +45,8 @@ public enum SettingEnum { ALIPAY_PAYMENT, //微信支付设置 WECHAT_PAYMENT, + //银联支付设置 + UNIONPAY_PAYMENT, + //热词设置 + HOT_WORDS } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/plugin/ConfigItem.java b/framework/src/main/java/cn/lili/modules/system/entity/plugin/ConfigItem.java deleted file mode 100644 index 598035d7..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/plugin/ConfigItem.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.lili.modules.system.entity.plugin; - -import lombok.Data; -import lombok.ToString; - -import java.util.List; - -/** - * 插件配置类 - * - * @author pikachu - * @version v4.0 - * @Description: - * @since 2020/12/01 15:58 - */ -@Data -@ToString -public class ConfigItem { - /** - * 配置文件name值 - */ - private String name; - /** - * 配置文件name映射文本值 - */ - private String text; - /** - * 配置文件显示在浏览器时,input的type属性 - */ - private String type; - /** - * 配置的值 - */ - private Object value; - /** - * 如果是select 是需要将可选项传递到前台 - */ - private List options; - - -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/InstantDeliveryPlugin.java b/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/InstantDeliveryPlugin.java deleted file mode 100644 index 6ab8c062..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/InstantDeliveryPlugin.java +++ /dev/null @@ -1,119 +0,0 @@ -package cn.lili.modules.system.entity.plugin.InstantDelivery; - -import cn.lili.modules.member.entity.dos.MemberAddress; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.store.entity.vos.StoreDetailVO; -import cn.lili.modules.system.entity.plugin.ConfigItem; -import cn.lili.modules.system.entity.vo.InstantDeliveryResultVO; - -import java.util.List; -import java.util.Map; - -/** - * 即时配送插件方法 - * - * @author pikachu - * @version v1.0 - * @Description: - * @since 2020/12/01 15:58 - */ -public interface InstantDeliveryPlugin { - /** - * 获取即时配送的插件ID - * - * @return - */ - String getPluginId(); - - /** - * 获取即时配送的插件名称 - * - * @return 插件名称 - */ - String getPluginName(); - - /** - * 即时配送是否开启 - * - * @return 0 不开启 1 开启 - */ - Integer getOpen(); - - /** - * 获取取消原因id - * - * @return - */ - Integer cancelReasonId(); - - /** - * 配置各个即时配送的参数 - * - * @return 在页面加载的即时配送参数 - */ - List getDefaultConfigItem(); - - /** - * 同城配送新建店铺 - * - * @param storeDetailVO 店铺信息 - * @param config 配送参数 - * @return - */ - InstantDeliveryResultVO addStore(StoreDetailVO storeDetailVO, Map config); - - /** - * 同城配送新建店铺 - * - * @param storeDetailVO 店铺信息 - * @param config 配送参数 - * @return - */ - InstantDeliveryResultVO editStore(StoreDetailVO storeDetailVO, Map config); - - /** - * 查询订单详细 - * - * @param orderSn 传递到达达的订单sn,目前使用的是商城订单sn传递的所有只需要传递商城sn就可以 - * @param config 配置参数 - * @return - */ - InstantDeliveryResultVO getOrderDetail(String orderSn, Map config); - - /** - * 妥投异常之物品返回完成 - * - * @param orderSn 传递到达达的订单sn,目前使用的是商城订单sn传递的所有只需要传递商城sn就可以 - * @param config 配置参数 - * @return - */ - InstantDeliveryResultVO orderConfirm(String orderSn, Map config); - - /** - * 妥投异常之物品返回完成 - * - * @param orderSn 传递到达达的订单sn,目前使用的是商城订单sn传递的所有只需要传递商城sn就可以 - * @param cancelReason 取消原因 - * @param config 配置参数 - * @return - */ - InstantDeliveryResultVO orderCandle(String orderSn, String cancelReason, Map config); - - /** - * 发送同城配送订单 - * - * @param order 订单 - * @param memberAddress 会员地址 - * @param type 类型 - * @param config 配置 - * @return - */ - InstantDeliveryResultVO sendReOrder(Order order, StoreDetailVO storeDetailVO, MemberAddress memberAddress, Integer type, Map config); - - /** - * 即时配送回调 - * - * @param object 因为不同配送的返回对象不同,所以需要obj 去传递参数,在不同的插件中转换 - */ - void callBack(Object object); -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/DadaPlugin.java b/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/DadaPlugin.java deleted file mode 100644 index 9d1a913d..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/DadaPlugin.java +++ /dev/null @@ -1,359 +0,0 @@ -package cn.lili.modules.system.entity.plugin.InstantDelivery.dada; - -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.member.entity.dos.MemberAddress; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.store.entity.enums.StoreStatusEnum; -import cn.lili.modules.store.entity.vos.StoreDetailVO; -import cn.lili.modules.store.service.StoreDetailService; -import cn.lili.modules.system.entity.dos.InstantDeliveryLog; -import cn.lili.modules.system.entity.enums.InstantDeliveryUrl; -import cn.lili.modules.system.entity.plugin.ConfigItem; -import cn.lili.modules.system.entity.plugin.InstantDelivery.InstantDeliveryPlugin; -import cn.lili.modules.system.entity.plugin.InstantDelivery.dada.vo.DdOrderBackVO; -import cn.lili.modules.system.entity.vo.CityResult; -import cn.lili.modules.system.entity.vo.InstantDeliveryResultVO; -import cn.lili.modules.system.service.InstantDeliveryLogService; -import cn.lili.modules.system.utils.HttpUtils; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 达达同城配送 - * - * @author pikachu - * @version v4.0 - * @Description: - * @since 2020/12/01 15:58 - */ -@Component("ddPlugin") -public class DadaPlugin implements InstantDeliveryPlugin { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - @Autowired - private StoreDetailService storeDetailService; - @Autowired - private InstantDeliveryLogService instantDeliveryLogService; - - @Override - public String getPluginId() { - return "ddPlugin"; - } - - @Override - public String getPluginName() { - return "达达"; - } - - @Override - public Integer getOpen() { - return 0; - } - - @Override - public List getDefaultConfigItem() { - List list = new ArrayList(); - - ConfigItem url = new ConfigItem(); - url.setType("text"); - url.setName("url"); - url.setText("调用地址"); - - - ConfigItem appKey = new ConfigItem(); - appKey.setType("text"); - appKey.setName("app_key"); - appKey.setText("app_key"); - - ConfigItem appSecret = new ConfigItem(); - appSecret.setType("text"); - appSecret.setName("app_secret"); - appSecret.setText("app_secret"); - - ConfigItem merchantsId = new ConfigItem(); - merchantsId.setType("text"); - merchantsId.setName("merchants_id"); - merchantsId.setText("商户Id"); - list.add(url); - list.add(appKey); - list.add(appSecret); - list.add(merchantsId); - return list; - } - - @Override - public InstantDeliveryResultVO addStore(StoreDetailVO storeDetailVO, Map config) { - JSONArray jsonArray = new JSONArray(); - JSONObject jsonObject = new JSONObject(); -// //门店名称 -// jsonObject.put("station_name", storeDetailVO.getStoreName()); - //业务类型(食品小吃-1,饮料-2,鲜花-3,文印票务-8,便利店-9,水果生鲜-13,同城电商-19, 医药-20,蛋糕-21,酒品-24,小商品市场-25,服装-26,汽修零配-27,数码-28,小龙虾-29,火锅-51,其他-5) - jsonObject.set("business", 19); - //城市名称(如,上海) -// jsonObject.put("city_name", storeDetailVO.getCompanyCity()); - //区域名称(如,浦东新区) -// jsonObject.put("area_name", storeDetailVO.getCompanyCounty()); - //门店地址 - jsonObject.set("station_address", storeDetailVO.getCompanyAddress()); -// //门店经度 -// jsonObject.put("lng", storeDetailVO.getStoreLongitude()); -// //门店纬度 -// jsonObject.put("lat", storeDetailVO.getStoreLatitude()); - //联系人姓名 - jsonObject.set("contact_name", storeDetailVO.getLinkName()); - //联系人电话 - jsonObject.set("phone", storeDetailVO.getLinkPhone()); - //达达商家app账号 - jsonObject.set("username", storeDetailVO.getLinkPhone()); - //达达商家app密码 - jsonObject.set("password", "a" + storeDetailVO.getLinkPhone()); - jsonArray.add(jsonObject); - //发送请求的url - String url = StringUtils.toString(config.get("url")); - Map requestJson = getConfig(config, jsonArray.toString()); - String result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_ADD_SHOP.getUrl(), requestJson); - //组织返回参数 - InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - Map map = (Map) instantDeliveryResultVO.getResult(); - List> successList = map.get("successList"); - if (successList.size() > 0) { - for (Map obj : successList) { - //如果成功调用店铺修改 将门店编码写入数据库 - UpdateWrapper updateWrapper = new UpdateWrapper(); - updateWrapper.in("id", storeDetailVO.getStoreId()); - updateWrapper.set("dd_code", obj.get("originStoreId").toString()); - storeDetailService.update(updateWrapper); - } - } - List> errorList = map.get("failedList"); - if (errorList != null && errorList.size() > 0) { - for (Map obj : errorList) { - throw new RuntimeException(obj.get("msg").toString()); - } - } - return instantDeliveryResultVO; - } - - @Override - public InstantDeliveryResultVO editStore(StoreDetailVO storeDetailVO, Map config) { - //如果达达code没有则不进行修改 - if (StringUtils.isEmpty(storeDetailVO.getDdCode())) { - return null; - } - JSONObject jsonObject = new JSONObject(); - //门店编号 - jsonObject.set("origin_store_id", storeDetailVO.getDdCode()); - //门店名称 -// jsonObject.put("station_name", storeDetailVO.getStoreName()); - //业务类型(食品小吃-1,饮料-2,鲜花-3,文印票务-8,便利店-9,水果生鲜-13,同城电商-19, 医药-20,蛋糕-21,酒品-24,小商品市场-25,服装-26,汽修零配-27,数码-28,小龙虾-29,火锅-51,其他-5) - jsonObject.set("business", 19); - //城市名称(如,上海) -// jsonObject.put("city_name", storeDetailVO.getCompanyCity()); - //区域名称(如,浦东新区) -// jsonObject.put("area_name", storeDetailVO.getCompanyCounty()); - //门店地址 - jsonObject.set("station_address", storeDetailVO.getCompanyAddress()); -// //门店经度 -// jsonObject.put("lng", storeDetailVO.getStoreLongitude()); -// //门店纬度 -// jsonObject.put("lat", storeDetailVO.getStoreLatitude()); - //联系人姓名 - jsonObject.set("contact_name", storeDetailVO.getLinkName()); - //联系人电话 - jsonObject.set("phone", storeDetailVO.getLinkPhone()); - if (storeDetailVO.getStoreDisable().equals(StoreStatusEnum.OPEN.value())) { - jsonObject.set("status", 1); - } else { - jsonObject.set("status", 0); - } - //发送请求的url - String url = StringUtils.toString(config.get("url")); - Map requestJson = getConfig(config, jsonObject.toString()); - String result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_UPDATE_SHOP.getUrl(), requestJson); - //组织返回参数 - InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - if (instantDeliveryResultVO.getStatus().equals("fail")) { - logger.error("达达店铺信息修改失败," + instantDeliveryResultVO.getMsg()); - } - return instantDeliveryResultVO; - } - - @Override - public InstantDeliveryResultVO getOrderDetail(String orderSn, Map config) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set("order_id", orderSn); - //发送请求的url - String url = StringUtils.toString(config.get("url")); - Map requestJson = getConfig(config, jsonObject.toString()); - String result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_QUERY_ORDER.getUrl(), requestJson); - //组织返回参数 - InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - return instantDeliveryResultVO; - } - - @Override - public InstantDeliveryResultVO orderConfirm(String orderSn, Map config) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set("order_id", orderSn); - //发送请求的url - String url = StringUtils.toString(config.get("url")); - Map requstJson = getConfig(config, jsonObject.toString()); - String result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_CONFIRM_ORDER.getUrl(), requstJson); - //组织返回参数 - InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - return instantDeliveryResultVO; - } - - @Override - public InstantDeliveryResultVO orderCandle(String orderSn, String cancelReason, Map config) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set("order_id", orderSn); - jsonObject.set("cancel_reason_id", this.cancelReasonId()); - jsonObject.set("cancel_reason", cancelReason); - //发送请求的url - String url = StringUtils.toString(config.get("url")); - Map requstJson = getConfig(config, jsonObject.toString()); - String result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_CANDLE_ORDER.getUrl(), requstJson); - //组织返回参数 - InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - return instantDeliveryResultVO; - } - - @Override - public InstantDeliveryResultVO sendReOrder(Order order, StoreDetailVO storeDetailVO, MemberAddress memberAddress, Integer type, Map config) { - JSONObject jsonObject = new JSONObject(); - //门店编号,门店创建后可在门店列表和单页查看 - jsonObject.set("store_no", storeDetailVO.getDdCode()); - //第三方订单ID - jsonObject.set("origin_id", order.getSn()); - //订单所在城市的code http://newopen.imdada.cn/#/development/file/cityList?_k=l76a7s - String city = memberAddress.getConsigneeAddressPath().substring(memberAddress.getConsigneeAddressPath().indexOf(",") + 1, memberAddress.getConsigneeAddressPath().indexOf(",", memberAddress.getConsigneeAddressPath().indexOf(",") + 1)); - jsonObject.set("city_code", this.getCityCode(city, config)); - //订单金额 - jsonObject.set("cargo_price", order.getFlowPrice()); - //是否需要垫付 1:是 0:否 (垫付订单金额,非运费) - jsonObject.set("is_prepay", 0); - //收货人姓名 - jsonObject.set("receiver_name", memberAddress.getName()); - //收货人地址 - jsonObject.set("receiver_address", memberAddress.getDetail()); - //收货人地址纬度(高德坐标系,若是其他地图经纬度需要转化成高德地图经纬度 - jsonObject.set("receiver_lat", memberAddress.getLat()); - //收货人地址经度(高德坐标系,若是其他地图经纬度需要转化成高德地图经纬度 - jsonObject.set("receiver_lng", memberAddress.getLat()); - //回调URL - //jsonObject.put("callback", domainHelper.getCallback() + "/trade/delivery/order/call-back"); - //收货人手机号(手机号和座机号必填一项) - jsonObject.set("receiver_phone", memberAddress.getMobile()); - //是否使用保价费(0:不使用保价,1:使用保价; 同时,请确保填写了订单金额(cargo_price)) - jsonObject.set("is_use_insurance", 0); - //订单重量(单位:Kg) - jsonObject.set("cargo_weight", order.getWeight()); - Map requstJson = getConfig(config, jsonObject.toString()); - //发送请求的url - String url = StringUtils.toString(config.get("url")); - String result = null; - if (type == 0) { - result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_ADD_ORDER.getUrl(), requstJson); - } else { - result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_RE_ADD_ORDER.getUrl(), requstJson); - } - InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - if (instantDeliveryResultVO.getStatus().equals("fail")) { - logger.error("达达订单发送失败,订单号为" + order.getSn() + "," + instantDeliveryResultVO.getMsg()); - //如果发送失败择等待一秒重新发送,如果失败择记录日志 - try { - Thread.sleep(1000); - } catch (Exception e) { - e.printStackTrace(); - } - result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_RE_ADD_ORDER.getUrl(), requstJson); - InstantDeliveryResultVO instantDeliveryResResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - if (instantDeliveryResResultVO.getStatus().equals("fail")) { - logger.error("达达订单重试发送失败,订单号为" + order.getSn() + "," + instantDeliveryResultVO.getMsg()); - } - } - return instantDeliveryResultVO; - } - - @Override - public Integer cancelReasonId() { - return 4; - } - - /** - * 达达配送统一参数整合 - * - * @param config - * @param json - * @return - */ - private Map getConfig(Map config, String json) { - //组织参数 - String appKey = StringUtils.toString(config.get("app_key")); - String appSecret = StringUtils.toString(config.get("app_secret")); - String merchantsId = StringUtils.toString(config.get("merchants_id")); - //签名发送请求 - String mysing = appSecret + "app_key" + appKey + "body" + json + "formatjsonsource_id" + merchantsId + "timestamp" + DateUtil.getDateline() + "v1.0" + appSecret; - String signature = StringUtils.md5(mysing).toUpperCase(); - Map requstJson = new HashMap<>(); - requstJson.put("source_id", merchantsId); - requstJson.put("app_key", appKey); - requstJson.put("format", "json"); - requstJson.put("timestamp", StringUtils.toString(DateUtil.getDateline())); - requstJson.put("signature", signature); - requstJson.put("body", json); - requstJson.put("v", "1.0"); - return requstJson; - } - - /** - * 获取城市code - * - * @param cityName 城市名称 - * @return 城市编码 - */ - private String getCityCode(String cityName, Map config) { - //获取参数 - String url = StringUtils.toString(config.get("url")); - JSONObject jsonObject = new JSONObject(); - Map requstJson = getConfig(config, jsonObject.toString()); - //获取所有城市编码 - String result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_CITY_CODE.getUrl(), requstJson); - InstantDeliveryResultVO resultDO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); - //对数据进行格式化 - - List list = JSONUtil.toList(JSONUtil.parseArray(resultDO.getResult()), CityResult.class); - for (CityResult cityResult : list) { - if (cityName.contains(cityResult.getCityName())) { - return cityResult.getCityCode(); - } - } - //如果找不到默认哈尔滨 - return "0451"; - } - - @Override - public void callBack(Object object) { - //强制将obj转换成达达对应的参数对象 - DdOrderBackVO ddOrderBackVO = (DdOrderBackVO) object; - //数据类型转换 - InstantDeliveryLog instantDeliveryLog = new InstantDeliveryLog(ddOrderBackVO); - //保存数据 - instantDeliveryLogService.save(instantDeliveryLog); - } - -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/enums/DadaOrderStatusEnum.java b/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/enums/DadaOrderStatusEnum.java deleted file mode 100644 index 6468baf5..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/enums/DadaOrderStatusEnum.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.lili.modules.system.entity.plugin.InstantDelivery.dada.enums; - -import lombok.Getter; -import lombok.Setter; - -/** - * 达达配送订单状态 - * - * @author pikachu - */ -public enum DadaOrderStatusEnum { - //待接单 - WAIT_RECEIVING(1, "待接单"), - //待取货 - WAIT_PICK_UP(2, "待取货"), - //配送中 - DELIVERY_IN_PROGRESS(3, "配送中"), - //已完成 - COMPLETED(4, "已完成"), - //已取消 - CANCELLED(5, "已取消"), - //派单中 - DISTRIBUTION_LEAFLETS(8, "派单中"), - //妥投异常之物品返回中 - ABNORMAL_BACK(9, "妥投异常之物品返回中"), - //妥投异常之物品返回完成 - ABNORMAL_COMPLETED(10, "妥投异常之物品返回完成"), - //骑士到店 - TO_IN_STORE(100, "骑士到店"); - - /** - * 状态 - */ - @Setter - @Getter - private Integer status; - /** - * 状态文本 - */ - @Setter - @Getter - private String text; - - - DadaOrderStatusEnum(Integer status, String text) { - this.status = status; - this.text = text; - } - - public static String getText(Integer status) { - if (status != null) { - return null; - } - for (DadaOrderStatusEnum dadaOrderStatusEnum : DadaOrderStatusEnum.values()) { - if (status.equals(dadaOrderStatusEnum.getStatus())) { - return dadaOrderStatusEnum.getText(); - } - } - return null; - } -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/vo/DdOrderBackVO.java b/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/vo/DdOrderBackVO.java deleted file mode 100644 index 4ce90bb1..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/vo/DdOrderBackVO.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.lili.modules.system.entity.plugin.InstantDelivery.dada.vo; - -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.databind.annotation.JsonNaming; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.ToString; - -/** - * @author 86133 - * @description: pikachu - * @date 2020/9/1215:35 - */ -@ApiModel(description = "达达订单回调参数") -@Data -@ToString -@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class) -public class DdOrderBackVO { - @ApiModelProperty(value = "达达运单号", required = false) - private String clientId; - - @ApiModelProperty(value = "交易编号", required = true) - private String orderId; - - @ApiModelProperty(value = "订单状态 待接单=1,待取货=2,配送中=3,已完成=4,已取消=5, 指派单=8,妥投异常之物品返回中=9, 妥投异常之物品返回完成=10, 骑士到店=100,创建达达运单失败=1000", required = true) - private Integer orderStatus; - - @ApiModelProperty(value = "订单取消原因,其他状态下默认值为空字符串", required = true) - private String cancelReason; - - @ApiModelProperty(value = "订单取消原因来源(1:达达配送员取消;2:商家主动取消;3:系统或客服取消;0:默认值)", required = true) - private Integer cancelFrom; - - @ApiModelProperty(value = "更新时间", required = true) - private Long updateTime; - - @ApiModelProperty(value = "加密串", required = true) - private String signature; - - @ApiModelProperty(value = "达达配送员id,接单以后会传", required = false) - private Integer dmId; - - @ApiModelProperty(value = "配送员姓名,接单以后会传", required = false) - private String dmName; - - @ApiModelProperty(value = "配送员手机号,接单以后会传", required = false) - private String dmMobile; - -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/plugin/RadioOption.java b/framework/src/main/java/cn/lili/modules/system/entity/plugin/RadioOption.java deleted file mode 100644 index 0c558303..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/plugin/RadioOption.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.lili.modules.system.entity.plugin; - -import lombok.Data; -import lombok.ToString; - -/** - * 单选配置类 - * - * @author pikachu - * @version v4.0 - * @Description:单选配置类 - * @since 2020/12/01 15:58 - */ -@Data -@ToString -public class RadioOption { - - /** - * 选项 - */ - private String label; - - /** - * 选项值 - */ - private Object value; - -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/CityResult.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/CityResult.java index 07d45bbc..29c4bf2e 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/vo/CityResult.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/vo/CityResult.java @@ -6,7 +6,7 @@ import lombok.Data; * 获取城市结果 * * @author pikachu - * @date 18/6/27 上午9:28 + * @since 18/6/27 上午9:28 */ @Data public class CityResult { diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/InstantDeliveryResultVO.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/InstantDeliveryResultVO.java deleted file mode 100644 index 9b774068..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/vo/InstantDeliveryResultVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.lili.modules.system.entity.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 达达返回值 - * - * @author Chopper - * @date 2020/9/12 14:05 - */ -@ApiModel -@Data -public class InstantDeliveryResultVO { - @ApiModelProperty(value = "响应状态,成功为success,失败为fail", required = false) - private String status; - @ApiModelProperty(value = "响应返回码, 0 成功 其他失败", required = false) - private Integer code; - @ApiModelProperty(value = "响应描述", required = false) - private String msg; - @ApiModelProperty(value = "响应结果", required = false) - private Object result; -} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/InstantDeliveryVO.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/InstantDeliveryVO.java deleted file mode 100644 index 40773a3b..00000000 --- a/framework/src/main/java/cn/lili/modules/system/entity/vo/InstantDeliveryVO.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.lili.modules.system.entity.vo; - - -import cn.lili.modules.system.entity.dos.InstantDelivery; -import cn.lili.modules.system.entity.plugin.ConfigItem; -import cn.lili.modules.system.entity.plugin.InstantDelivery.InstantDeliveryPlugin; -import com.google.common.reflect.TypeToken; -import com.google.gson.Gson; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * 即时配送VO - * - * @author pikachu - * @since 2020/12/01 15:58 - */ -@Data -@ApiModel(value = "即时配送VO") -@AllArgsConstructor -@NoArgsConstructor -public class InstantDeliveryVO extends InstantDelivery { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty(value = "即时配送配置项", required = true) - private List configItems; - /** - * 构建新的vo参数 - * - * @param instantDelivery - */ - public InstantDeliveryVO(InstantDelivery instantDelivery) { - this.setCreateTime(instantDelivery.getCreateTime()); - this.setDeleteFlag(instantDelivery.getDeleteFlag()); - this.setId(instantDelivery.getId()); - this.setDeliveryName(instantDelivery.getDeliveryName()); - this.setDeliveryOpen(instantDelivery.getDeliveryOpen()); - this.setDeliveryBean(instantDelivery.getDeliveryBean()); - this.setImages(instantDelivery.getImages()); - Gson gson = new Gson(); - this.setConfigItems(gson.fromJson(instantDelivery.getDeliveryConfig(), new TypeToken>() { - }.getType())); - } - - /** - * 根据插件构建默认参数 - * - * @param instantDeliveryPlugin - */ - public InstantDeliveryVO(InstantDeliveryPlugin instantDeliveryPlugin) { - this.setId("0"); - this.setDeliveryName(instantDeliveryPlugin.getPluginName()); - this.setDeliveryOpen(instantDeliveryPlugin.getOpen()); - this.setDeliveryBean(instantDeliveryPlugin.getPluginId()); - this.setConfigItems(instantDeliveryPlugin.getDefaultConfigItem()); - } - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/RegionVO.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/RegionVO.java index e2a60641..21870879 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/vo/RegionVO.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/vo/RegionVO.java @@ -12,7 +12,7 @@ import java.util.List; * 地区VO * * @author Chopper - * @date 2021-02-08 09:49 + * @since 2021-02-08 09:49 */ @Data @NoArgsConstructor diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/StoreLogisticsVO.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/StoreLogisticsVO.java index 9b5ce5d1..c23135aa 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/vo/StoreLogisticsVO.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/vo/StoreLogisticsVO.java @@ -1,6 +1,6 @@ package cn.lili.modules.system.entity.vo; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,7 +9,7 @@ import lombok.Data; * 物流公司设置 * * @author Chopper - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ @Data @@ -17,11 +17,14 @@ import lombok.Data; public class StoreLogisticsVO extends BaseEntity { @ApiModelProperty(value = "物流公司ID") - private String LogisticsId; + private String logisticsId; @ApiModelProperty(value = "物流公司名称") private String name; @ApiModelProperty(value = "已选择", notes = "如果已选择则有值,没有选择则无值") private String selected; + + @ApiModelProperty(value = "是否使用电子面单") + private Boolean faceSheetFlag; } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/Traces.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/Traces.java index 23fe19dc..99ea005e 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/vo/Traces.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/vo/Traces.java @@ -11,7 +11,7 @@ import java.util.Map; * 物流信息 * * @author Chopper - * @date 2021/1/18 3:28 下午 + * @since 2021/1/18 3:28 下午 */ @Data @NoArgsConstructor @@ -26,7 +26,7 @@ public class Traces { /** * 物流单号 */ - private String LogisticCode; + private String logisticCode; /** * 物流详细信息 diff --git a/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java b/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java new file mode 100644 index 00000000..813ac13c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/vo/WithdrawalSettingVO.java @@ -0,0 +1,31 @@ +package cn.lili.modules.system.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 用户提现设置VO + * + * @author Bulbasaur + * @since 2023/3/1 + */ +@Data +public class WithdrawalSettingVO { + + /** + * 提现最低金额 + */ + @ApiModelProperty(value = "minPrice") + private Double minPrice; + /** + * 提现手续费 + */ + @ApiModelProperty(value = "提现手续费") + private Double fee; + /** + * 提现类型 WECHAT\ALI + */ + @ApiModelProperty(value = "提现类型 WECHAT、ALI") + private String type; + +} diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/AppVersionMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/AppVersionMapper.java index 2f48917c..a8a2be17 100644 --- a/framework/src/main/java/cn/lili/modules/system/mapper/AppVersionMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/AppVersionMapper.java @@ -1,14 +1,24 @@ package cn.lili.modules.system.mapper; -import cn.lili.modules.system.entity.dos.AppVersionDO; +import cn.lili.modules.system.entity.dos.AppVersion; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; /** * app版本控制数据处理层 * * @author Chopper - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ -public interface AppVersionMapper extends BaseMapper { +public interface AppVersionMapper extends BaseMapper { + + /** + * 获取最新版本号 + * + * @param appType APP类型(Android、IOS) + * @return APP版本 + */ + @Select("SELECT * FROM li_app_version WHERE type=#{appType} ORDER BY version_update_date DESC LIMIT 1") + AppVersion getLatestVersion(String appType); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/InstantDeliveryLogMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/InstantDeliveryLogMapper.java deleted file mode 100644 index 979588be..00000000 --- a/framework/src/main/java/cn/lili/modules/system/mapper/InstantDeliveryLogMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.lili.modules.system.mapper; - -import cn.lili.modules.system.entity.dos.InstantDeliveryLog; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - * 即时配送日志数据处理层 - * - * @author pikachu - * @date 2020/11/17 8:01 下午 - */ -public interface InstantDeliveryLogMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/InstantDeliveryMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/InstantDeliveryMapper.java deleted file mode 100644 index 563c4d36..00000000 --- a/framework/src/main/java/cn/lili/modules/system/mapper/InstantDeliveryMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.lili.modules.system.mapper; - -import cn.lili.modules.system.entity.dos.InstantDelivery; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - * 即时配送数据处理层 - * - * @author pikachu - * @date 2020/11/17 8:01 下午 - */ -public interface InstantDeliveryMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/LogisticsMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/LogisticsMapper.java index 677820ae..676bdf22 100644 --- a/framework/src/main/java/cn/lili/modules/system/mapper/LogisticsMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/LogisticsMapper.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 物流公司数据处理层 * * @author Chopper - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ public interface LogisticsMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/base/mapper/RegionMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/RegionMapper.java similarity index 77% rename from framework/src/main/java/cn/lili/modules/base/mapper/RegionMapper.java rename to framework/src/main/java/cn/lili/modules/system/mapper/RegionMapper.java index 9e1e5751..25a1bb28 100644 --- a/framework/src/main/java/cn/lili/modules/base/mapper/RegionMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/RegionMapper.java @@ -1,4 +1,4 @@ -package cn.lili.modules.base.mapper; +package cn.lili.modules.system.mapper; import cn.lili.modules.system.entity.dos.Region; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * 行政地区数据处理层 * * @author Chopper - * @date 2020/12/8 9:46 + * @since 2020/12/8 9:46 */ public interface RegionMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/SensitiveWordsMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/SensitiveWordsMapper.java index 94091bfb..f5307c45 100644 --- a/framework/src/main/java/cn/lili/modules/system/mapper/SensitiveWordsMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/SensitiveWordsMapper.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 敏感词数据处理层 * @author Bulbasaur - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ public interface SensitiveWordsMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/ServiceNoticeMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/ServiceNoticeMapper.java index 433cf38e..a02491af 100644 --- a/framework/src/main/java/cn/lili/modules/system/mapper/ServiceNoticeMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/ServiceNoticeMapper.java @@ -6,7 +6,7 @@ import cn.lili.modules.system.entity.dos.ServiceNotice; /** * 服务订阅消息数据处理层 * @author Chopper - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ public interface ServiceNoticeMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/SettingMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/SettingMapper.java index e1c8bba5..40b966c7 100644 --- a/framework/src/main/java/cn/lili/modules/system/mapper/SettingMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/SettingMapper.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 配置数据处理层 * @author Chopper - * @date 2020/11/17 8:01 下午 + * @since 2020/11/17 8:01 下午 */ public interface SettingMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/StoreLogisticsMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/StoreLogisticsMapper.java deleted file mode 100644 index d441d321..00000000 --- a/framework/src/main/java/cn/lili/modules/system/mapper/StoreLogisticsMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.lili.modules.system.mapper; - -import cn.lili.modules.store.entity.dos.StoreLogistics; -import cn.lili.modules.system.entity.vo.StoreLogisticsVO; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - * 物流公司数据处理层 - * - * @author Chopper - * @date 2020/11/17 8:01 下午 - */ -public interface StoreLogisticsMapper extends BaseMapper { - - @Select("SELECT l.* FROM li_logistics l RIGHT JOIN li_store_logistics sl ON l.id=sl.logistics_id WHERE sl.store_id=#{storeId}") - List getSelectedStoreLogistics(String storeId); - - @Select("SELECT *, ( SELECT sl.id FROM li_store_logistics sl WHERE l.id = sl.logistics_id AND sl.store_id=#{storeId} ) AS selected FROM li_logistics l;") - List getStoreLogistics(String storeId); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/base/mapper/VerificationSourceMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/VerificationSourceMapper.java similarity index 60% rename from framework/src/main/java/cn/lili/modules/base/mapper/VerificationSourceMapper.java rename to framework/src/main/java/cn/lili/modules/system/mapper/VerificationSourceMapper.java index 23928931..3a87e8c2 100644 --- a/framework/src/main/java/cn/lili/modules/base/mapper/VerificationSourceMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/VerificationSourceMapper.java @@ -1,13 +1,13 @@ -package cn.lili.modules.base.mapper; +package cn.lili.modules.system.mapper; -import cn.lili.modules.base.entity.dos.VerificationSource; +import cn.lili.modules.verification.entity.dos.VerificationSource; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 验证码资源维护数据处理层 * * @author Chopper - * @date 2021/1/30 4:17 下午 + * @since 2021/1/30 4:17 下午 */ public interface VerificationSourceMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/system/service/AppVersionService.java b/framework/src/main/java/cn/lili/modules/system/service/AppVersionService.java index 46352afb..430eb6df 100644 --- a/framework/src/main/java/cn/lili/modules/system/service/AppVersionService.java +++ b/framework/src/main/java/cn/lili/modules/system/service/AppVersionService.java @@ -1,15 +1,30 @@ package cn.lili.modules.system.service; -import cn.lili.modules.system.entity.dos.AppVersionDO; +import cn.lili.modules.system.entity.dos.AppVersion; import com.baomidou.mybatisplus.extension.service.IService; /** - * 物流公司业务层 + * app版本业务层 * * @author Chopper - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ -public interface AppVersionService extends IService { +public interface AppVersionService extends IService { + /** + * 获取当前最新的APP版本 + * 获取用户的APP类型,返回最新的数据的版本号 + * + * @param appType APP版本类型 + * @return 最新的APP版本号 + */ + AppVersion getAppVersion(String appType); + /** + * 检测APP版本信息 + * + * @param appVersion app版本 + * @return 是否可添加 + */ + boolean checkAppVersion(AppVersion appVersion); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/service/InstantDeliveryLogService.java b/framework/src/main/java/cn/lili/modules/system/service/InstantDeliveryLogService.java deleted file mode 100644 index fd4e5ce1..00000000 --- a/framework/src/main/java/cn/lili/modules/system/service/InstantDeliveryLogService.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.lili.modules.system.service; - -import cn.lili.modules.system.entity.dos.InstantDeliveryLog; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - * 即时配送日志业务层 - * - * @author Chopper - * @date 2020/11/17 8:02 下午 - */ -public interface InstantDeliveryLogService extends IService { - - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/service/InstantDeliveryService.java b/framework/src/main/java/cn/lili/modules/system/service/InstantDeliveryService.java deleted file mode 100644 index 97f983f4..00000000 --- a/framework/src/main/java/cn/lili/modules/system/service/InstantDeliveryService.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.lili.modules.system.service; - -import cn.lili.common.vo.PageVO; -import cn.lili.modules.system.entity.dos.InstantDelivery; -import cn.lili.modules.system.entity.vo.InstantDeliveryVO; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - * 即时配送业务层 - * - * @author Chopper - * @date 2020/11/17 8:02 下午 - */ -public interface InstantDeliveryService extends IService { - - /** - * 获取即时配送方案 - * - * @param page 数据库即时配送方案 - * @param pageVO 分页数据 - * @return - */ - IPage getInstantDeliveryPage(IPage page, PageVO pageVO); - - /** - * 根据beanId查询即时配送方案 - * - * @param bean beanId - * @return - */ - InstantDeliveryVO getInstantDeliveryConfig(String bean); - - /** - * 开启某一个即时配送方案 - * - * @param bean bean - * @return - */ - void openInstantDelivery(String bean); - - /** - * 修改即时配送方案 - * - * @param instantDeliveryVO 即时配送方案 - * @return - */ - InstantDeliveryVO edit(InstantDeliveryVO instantDeliveryVO); - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/service/LogisticsService.java b/framework/src/main/java/cn/lili/modules/system/service/LogisticsService.java index ba46d90d..54bf557a 100644 --- a/framework/src/main/java/cn/lili/modules/system/service/LogisticsService.java +++ b/framework/src/main/java/cn/lili/modules/system/service/LogisticsService.java @@ -1,16 +1,19 @@ package cn.lili.modules.system.service; +import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.system.entity.dos.Logistics; +import cn.lili.modules.system.entity.dto.LogisticsSetting; import cn.lili.modules.system.entity.vo.Traces; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; /** * 物流公司业务层 * * @author Chopper - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ public interface LogisticsService extends IService { @@ -19,9 +22,36 @@ public interface LogisticsService extends IService { * * @param logisticsId 物流公司ID * @param logisticsNo 单号 + * @param phone 手机号 * @return */ - Traces getLogistic(String logisticsId, String logisticsNo); + Traces getLogisticTrack(String logisticsId, String logisticsNo, String phone); + + /** + * 获取物流信息 + * @param logisticsId + * @param logisticsNo + * @param phone + * @param from + * @param to + * @return + */ + Traces getLogisticMapTrack(String logisticsId, String logisticsNo, String phone, String from, String to); + + /** + * 打印电子面单 + * @param orderSn 订单编号 + * @param logisticsId 物流Id + * @return + */ + Map labelOrder(String orderSn, String logisticsId); + + /** + * 顺丰平台下单 + * @param orderDetailVO 订单信息 + * @return 顺丰单号 + */ + String sfCreateOrder(OrderDetailVO orderDetailVO); /** * 获取已开启的物流公司列表 @@ -29,4 +59,10 @@ public interface LogisticsService extends IService { * @return 物流公司列表 */ List getOpenLogistics(); + + /** + * 获取物流设置 + * @return + */ + LogisticsSetting getLogisticsSetting(); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/base/service/RegionService.java b/framework/src/main/java/cn/lili/modules/system/service/RegionService.java similarity index 73% rename from framework/src/main/java/cn/lili/modules/base/service/RegionService.java rename to framework/src/main/java/cn/lili/modules/system/service/RegionService.java index c4b38c79..3696d7c3 100644 --- a/framework/src/main/java/cn/lili/modules/base/service/RegionService.java +++ b/framework/src/main/java/cn/lili/modules/system/service/RegionService.java @@ -1,4 +1,4 @@ -package cn.lili.modules.base.service; +package cn.lili.modules.system.service; import cn.lili.modules.system.entity.dos.Region; import cn.lili.modules.system.entity.vo.RegionVO; @@ -14,7 +14,7 @@ import java.util.Map; * 行政地区业务层 * * @author Chopper - * @date 2020/12/2 14:14 + * @since 2020/12/2 14:14 */ @CacheConfig(cacheNames = "{regions}") public interface RegionService extends IService { @@ -27,10 +27,23 @@ public interface RegionService extends IService { @CacheEvict void synchronizationData(String url); - + /** + * 获取地区列表 + * + * @param id 地区ID + * @return 地区列表 + */ @Cacheable(key = "#id") List getItem(String id); + /** + * 根据最后一级名称获取改所有上级地区id + * + * @param lastName 最后一级名称 + * @return 全部地区id + */ + String getItemByLastName(String lastName); + /** * 获取地址 * diff --git a/framework/src/main/java/cn/lili/modules/system/service/SensitiveWordsService.java b/framework/src/main/java/cn/lili/modules/system/service/SensitiveWordsService.java index 9ef46972..ac772590 100644 --- a/framework/src/main/java/cn/lili/modules/system/service/SensitiveWordsService.java +++ b/framework/src/main/java/cn/lili/modules/system/service/SensitiveWordsService.java @@ -7,9 +7,13 @@ import com.baomidou.mybatisplus.extension.service.IService; * 敏感词业务层 * * @author Bulbasaur - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ public interface SensitiveWordsService extends IService { + /** + * 重新写入缓存 + */ + void resetCache(); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/service/ServiceNoticeService.java b/framework/src/main/java/cn/lili/modules/system/service/ServiceNoticeService.java index f23d7753..c430433f 100644 --- a/framework/src/main/java/cn/lili/modules/system/service/ServiceNoticeService.java +++ b/framework/src/main/java/cn/lili/modules/system/service/ServiceNoticeService.java @@ -7,7 +7,7 @@ import cn.lili.modules.system.entity.dos.ServiceNotice; * 服务订阅消息业务层 * * @author Chopper - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ public interface ServiceNoticeService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/system/service/SettingService.java b/framework/src/main/java/cn/lili/modules/system/service/SettingService.java index 50f33937..9e1fc0ea 100644 --- a/framework/src/main/java/cn/lili/modules/system/service/SettingService.java +++ b/framework/src/main/java/cn/lili/modules/system/service/SettingService.java @@ -10,7 +10,7 @@ import org.springframework.cache.annotation.Cacheable; * 配置业务层 * * @author Chopper - * @date 2020/11/17 3:46 下午 + * @since 2020/11/17 3:46 下午 */ @CacheConfig(cacheNames = "{setting}") public interface SettingService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/system/service/StoreLogisticsService.java b/framework/src/main/java/cn/lili/modules/system/service/StoreLogisticsService.java deleted file mode 100644 index 0fb6adc3..00000000 --- a/framework/src/main/java/cn/lili/modules/system/service/StoreLogisticsService.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.lili.modules.system.service; - -import cn.lili.modules.store.entity.dos.StoreLogistics; -import cn.lili.modules.system.entity.vo.StoreLogisticsVO; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - -/** - * 店铺-物流公司业务层 - * - * @author Chopper - * @date 2020/11/17 8:02 下午 - */ -public interface StoreLogisticsService extends IService { - - /** - * 获取当前店铺的物流公司列表 - * - * @return 物流公司列表 - */ - List getStoreLogistics(); - - /** - * 获取当前店铺已选择的物流公司列表 - * - * @return 物流公司列表 - */ - List getStoreSelectedLogistics(); - - /** - * 添加店铺-物流公司 - * - * @param logisticsId - * @return 店铺物流公司 - */ - StoreLogistics add(String logisticsId); - - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java index 3bb17469..b4b67392 100644 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java @@ -1,24 +1,37 @@ package cn.lili.modules.system.serviceimpl; -import cn.lili.modules.system.entity.dos.AppVersionDO; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.system.entity.dos.AppVersion; import cn.lili.modules.system.mapper.AppVersionMapper; import cn.lili.modules.system.service.AppVersionService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** * APP版本控制业务层实现 * * @author Chopper - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class AppVersionServiceImpl extends ServiceImpl implements AppVersionService { +public class AppVersionServiceImpl extends ServiceImpl implements AppVersionService { + @Override + public AppVersion getAppVersion(String appType) { + return this.baseMapper.getLatestVersion(appType); + } + + @Override + public boolean checkAppVersion(AppVersion appVersion) { + //检测版本是否存在 + if (null != this.getOne(new LambdaQueryWrapper() + .eq(AppVersion::getVersion, appVersion.getVersion()) + .ne(appVersion.getId() != null, AppVersion::getId, appVersion.getId()))) { + throw new ServiceException(ResultCode.APP_VERSION_EXIST); + } + return true; + } } diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/InstantDeliveryLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/InstantDeliveryLogServiceImpl.java deleted file mode 100644 index 1580e791..00000000 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/InstantDeliveryLogServiceImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.lili.modules.system.serviceimpl; - -import cn.lili.modules.system.entity.dos.InstantDeliveryLog; -import cn.lili.modules.system.mapper.InstantDeliveryLogMapper; -import cn.lili.modules.system.service.InstantDeliveryLogService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -/** - * 即时配送业务层实现 - * - * @author Chopper - * @date 2020/11/17 8:02 下午 - */ -@Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class InstantDeliveryLogServiceImpl extends ServiceImpl implements InstantDeliveryLogService { - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/InstantDeliveryServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/InstantDeliveryServiceImpl.java deleted file mode 100644 index d6e91ccc..00000000 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/InstantDeliveryServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.lili.modules.system.serviceimpl; - -import cn.lili.common.utils.PageUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.modules.system.entity.dos.InstantDelivery; -import cn.lili.modules.system.entity.plugin.InstantDelivery.InstantDeliveryPlugin; -import cn.lili.modules.system.entity.vo.InstantDeliveryVO; -import cn.lili.modules.system.mapper.InstantDeliveryMapper; -import cn.lili.modules.system.service.InstantDeliveryService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -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.google.gson.Gson; -import lombok.RequiredArgsConstructor; -import org.elasticsearch.ResourceNotFoundException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 即时配送业务层实现 - * - * @author pikachu - * @date 2020/11/17 8:02 下午 - */ -@Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class InstantDeliveryServiceImpl extends ServiceImpl implements InstantDeliveryService { - - @Autowired - private List instantDeliveryPlugins; - - @Override - public IPage getInstantDeliveryPage(IPage page, PageVO pageVO) { - //获取插件和数据库中所有的就是配送方案 - List resultList = this.getInstantDeliveryVOList(page); - //循环数据,对未入库的数据进行入库操作 - for (InstantDeliveryVO instantDeliveryVO : resultList) { - //根据id是否为0校验 如果为0则不在数据中,进行入库操作 - if (instantDeliveryVO.getId().equals("0")) { - //入库 - InstantDelivery instantDelivery = new InstantDelivery(instantDeliveryVO); - this.baseMapper.insert(instantDelivery); - } - } - IPage iPage = new Page<>(pageVO.getPageNumber(), pageVO.getPageSize(), resultList.size()); - iPage.setRecords(PageUtil.listToPage(pageVO, resultList)); - return iPage; - } - - /** - * 获取即时配送的方案 - * - * @return 即时配送 - */ - private List getInstantDeliveryVOList(IPage page) { - //用来构建新的即时配送数据 - List resultList = new ArrayList<>(); - //获取即时配送数据 - List list = page.getRecords(); - Map map = new HashMap<>(16); - for (InstantDelivery instantDelivery : list) { - map.put(instantDelivery.getDeliveryBean(), instantDelivery); - } - //循环检查是否有新的即时配送方式,识别插入数据库 - for (InstantDeliveryPlugin plugin : instantDeliveryPlugins) { - InstantDelivery instantDelivery = map.get(plugin.getPluginId()); - InstantDeliveryVO result; - //如果不为空则构建vo参数,否则的话根据插件属性构建vo参数 - if (instantDelivery != null) { - result = new InstantDeliveryVO(instantDelivery); - } else { - result = new InstantDeliveryVO(plugin); - } - resultList.add(result); - } - return resultList; - } - - - @Override - public InstantDeliveryVO getInstantDeliveryConfig(String bean) { - //根据bean获取即时配送方案 - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("delivery_bean", bean); - InstantDelivery instantDelivery = this.baseMapper.selectOne(queryWrapper); - if (instantDelivery == null) { - throw new ResourceNotFoundException("该即时配送方案不存在"); - } - return new InstantDeliveryVO(instantDelivery); - } - - @Override - public void openInstantDelivery(String bean) { - //关闭所有配送方案 - UpdateWrapper updateWrapper = new UpdateWrapper(); - updateWrapper.set("delivery_open", 0); - this.update(updateWrapper); - //开启当前配送方案 - updateWrapper = new UpdateWrapper(); - updateWrapper.eq("delivery_bean", bean); - updateWrapper.set("delivery_open", 1); - this.update(updateWrapper); - } - - @Override - public InstantDeliveryVO edit(InstantDeliveryVO instantDeliveryVO) { - //校验此方案是否存在 - this.getInstantDeliveryConfig(instantDeliveryVO.getDeliveryBean()); - //修改即时配送方案 - Gson gson = new Gson(); - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("delivery_config", gson.toJson(instantDeliveryVO.getConfigItems())); - updateWrapper.eq("delivery_bean", instantDeliveryVO.getDeliveryBean()); - this.update(updateWrapper); - return instantDeliveryVO; - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java index 9f00615f..36e6ce20 100644 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java @@ -1,32 +1,40 @@ package cn.lili.modules.system.serviceimpl; -import cn.hutool.core.util.StrUtil; -import cn.lili.common.exception.ServiceException; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.SwitchEnum; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.logistics.LogisticsPluginFactory; +import cn.lili.modules.logistics.entity.dto.LabelOrderDTO; +import cn.lili.modules.logistics.entity.enums.LogisticsEnum; +import cn.lili.modules.member.service.StoreLogisticsService; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.entity.vo.OrderDetailVO; +import cn.lili.modules.order.order.service.OrderItemService; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; +import cn.lili.modules.store.service.StoreDetailService; import cn.lili.modules.system.entity.dos.Logistics; import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.vo.Traces; -import cn.lili.modules.system.entity.dto.KuaidiSetting; +import cn.lili.modules.system.entity.dto.LogisticsSetting; import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.entity.vo.Traces; import cn.lili.modules.system.mapper.LogisticsMapper; import cn.lili.modules.system.service.LogisticsService; import cn.lili.modules.system.service.SettingService; -import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; +import groovy.util.logging.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.io.*; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -34,25 +42,93 @@ import java.util.Map; * 物流公司业务层实现 * * @author Chopper - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ +@Slf4j @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class LogisticsServiceImpl extends ServiceImpl implements LogisticsService { + @Autowired + private LogisticsPluginFactory logisticsPluginFactory; + @Autowired + private OrderService orderService; + @Autowired + private OrderItemService orderItemService; + @Autowired + private StoreLogisticsService storeLogisticsService; + @Autowired + private StoreDetailService storeDetailService; - private final SettingService settingService; + @Autowired + private SettingService settingService; @Override - public Traces getLogistic(String logisticsId, String logisticsNo) { + public Traces getLogisticTrack(String logisticsId, String logisticsNo, String phone) { try { - return getOrderTracesByJson(logisticsId, logisticsNo); + return logisticsPluginFactory.filePlugin().pollQuery(this.getById(logisticsId), logisticsNo, phone); } catch (Exception e) { - e.printStackTrace(); + log.error("获取物流公司错误", e); + } return null; } + @Override + public Traces getLogisticMapTrack(String logisticsId, String logisticsNo, String phone, String from, String to) { + try { + return logisticsPluginFactory.filePlugin().pollMapTrack(this.getById(logisticsId), logisticsNo, phone, from, to); + } catch (Exception e) { + log.error("获取物流公司错误", e); + + } + return null; + } + + @Override + public Map labelOrder(String orderSn, String logisticsId) { + //获取设置 + LogisticsSetting logisticsSetting = this.getLogisticsSetting(); + //获取订单及子订单 + Order order = OperationalJudgment.judgment(orderService.getBySn(orderSn)); + if ((LogisticsEnum.SHUNFENG.name().equals(logisticsSetting.getType()) && order.getDeliverStatus().equals(DeliverStatusEnum.DELIVERED.name()) && order.getOrderStatus().equals(OrderStatusEnum.DELIVERED.name())) + || (order.getDeliverStatus().equals(DeliverStatusEnum.UNDELIVERED.name()) && order.getOrderStatus().equals(OrderStatusEnum.UNDELIVERED.name()))) { + //订单货物 + List orderItems = orderItemService.getByOrderSn(orderSn); + //获取对应物流 + Logistics logistics; + + if(LogisticsEnum.SHUNFENG.name().equals(logisticsSetting.getType())){ + logistics = this.getOne(new LambdaQueryWrapper().eq(Logistics::getCode,"SF")); + }else{ + logistics = this.getById(logisticsId); + } + // 店铺-物流公司设置 + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(StoreLogistics::getLogisticsId, logistics.getId()); + lambdaQueryWrapper.eq(StoreLogistics::getStoreId, order.getStoreId()); + StoreLogistics storeLogistics = storeLogisticsService.getOne(lambdaQueryWrapper); + //获取店家信息 + StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDTO = storeDetailService.getStoreDeliverGoodsAddressDto(order.getStoreId()); + + LabelOrderDTO labelOrderDTO = new LabelOrderDTO(); + labelOrderDTO.setOrder(order); + labelOrderDTO.setOrderItems(orderItems); + labelOrderDTO.setLogistics(logistics); + labelOrderDTO.setStoreLogistics(storeLogistics); + labelOrderDTO.setStoreDeliverGoodsAddressDTO(storeDeliverGoodsAddressDTO); + //触发电子面单 + return logisticsPluginFactory.filePlugin().labelOrder(labelOrderDTO); + } else { + throw new ServiceException(ResultCode.ORDER_LABEL_ORDER_ERROR); + } + + } + + @Override + public String sfCreateOrder(OrderDetailVO orderDetailVO) { + return logisticsPluginFactory.filePlugin().createOrder(orderDetailVO); + } + + @Override public List getOpenLogistics() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -60,218 +136,10 @@ public class LogisticsServiceImpl extends ServiceImpl params = new HashMap(); - params.put("RequestData", urlEncoder(requestData, "UTF-8")); - params.put("EBusinessID", EBusinessID); - params.put("RequestType", "8001"); - String dataSign = encrypt(requestData, AppKey, "UTF-8"); - params.put("DataSign", urlEncoder(dataSign, "UTF-8")); - params.put("DataType", "2"); - - String result = sendPost(ReqURL, params); - Map map = (Map) JSON.parse(result); - return new Traces(logistics.getName(), expNo, (List) map.get("Traces")); - } - return null; - } - - /** - * MD5加密 - * - * @param str 内容 - * @param charset 编码方式 - * @throws Exception - */ - @SuppressWarnings("unused") - private String MD5(String str, String charset) throws Exception { - MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(str.getBytes(charset)); - byte[] result = md.digest(); - StringBuffer sb = new StringBuffer(32); - for (int i = 0; i < result.length; i++) { - int val = result[i] & 0xff; - if (val <= 0xf) { - sb.append("0"); - } - sb.append(Integer.toHexString(val)); - } - return sb.toString().toLowerCase(); - } - - /** - * base64编码 - * - * @param str 内容 - * @param charset 编码方式di - * @throws UnsupportedEncodingException - */ - private String base64(String str, String charset) throws UnsupportedEncodingException { - String encoded = base64Encode(str.getBytes(charset)); - return encoded; - } - - @SuppressWarnings("unused") - private String urlEncoder(String str, String charset) throws UnsupportedEncodingException { - String result = URLEncoder.encode(str, charset); - return result; - } - - /** - * 电商Sign签名生成 - * - * @param content 内容 - * @param keyValue Appkey - * @param charset 编码方式 - * @return DataSign签名 - * @throws UnsupportedEncodingException ,Exception - */ - @SuppressWarnings("unused") - private String encrypt(String content, String keyValue, String charset) throws Exception { - if (keyValue != null) { - return base64(MD5(content + keyValue, charset), charset); - } - return base64(MD5(content, charset), charset); - } - - /** - * 向指定 URL 发送POST方法的请求 - * - * @param url 发送请求的 URL - * @param params 请求的参数集合 - * @return 远程资源的响应结果 - */ - @SuppressWarnings("unused") - private String sendPost(String url, Map params) { - OutputStreamWriter out = null; - BufferedReader in = null; - StringBuilder result = new StringBuilder(); - try { - URL realUrl = new URL(url); - HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); - // 发送POST请求必须设置如下两行 - conn.setDoOutput(true); - conn.setDoInput(true); - // POST方法 - conn.setRequestMethod("POST"); - // 设置通用的请求属性 - conn.setRequestProperty("accept", "*/*"); - conn.setRequestProperty("connection", "Keep-Alive"); - conn.setRequestProperty("user-agent", - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); - conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - conn.connect(); - // 获取URLConnection对象对应的输出流 - out = new OutputStreamWriter(conn.getOutputStream(), StandardCharsets.UTF_8); - // 发送请求参数 - if (params != null) { - StringBuilder param = new StringBuilder(); - for (Map.Entry entry : params.entrySet()) { - if (param.length() > 0) { - param.append("&"); - } - param.append(entry.getKey()); - param.append("="); - param.append(entry.getValue()); - //System.out.println(entry.getKey()+":"+entry.getValue()); - } - //System.out.println("param:"+param.toString()); - out.write(param.toString()); - } - // flush输出流的缓冲 - out.flush(); - // 定义BufferedReader输入流来读取URL的响应 - in = new BufferedReader( - new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); - String line; - while ((line = in.readLine()) != null) { - result.append(line); - } - } catch (Exception e) { - e.printStackTrace(); - } - //使用finally块来关闭输出流、输入流 - finally { - try { - if (out != null) { - out.close(); - } - if (in != null) { - in.close(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } - return result.toString(); - } - - - private static final char[] base64EncodeChars = new char[]{ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', - '4', '5', '6', '7', '8', '9', '+', '/'}; - - public static String base64Encode(byte[] data) { - StringBuffer sb = new StringBuffer(); - int len = data.length; - int i = 0; - int b1, b2, b3; - while (i < len) { - b1 = data[i++] & 0xff; - if (i == len) { - sb.append(base64EncodeChars[b1 >>> 2]); - sb.append(base64EncodeChars[(b1 & 0x3) << 4]); - sb.append("=="); - break; - } - b2 = data[i++] & 0xff; - if (i == len) { - sb.append(base64EncodeChars[b1 >>> 2]); - sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); - sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); - sb.append("="); - break; - } - b3 = data[i++] & 0xff; - sb.append(base64EncodeChars[b1 >>> 2]); - sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); - sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); - sb.append(base64EncodeChars[b3 & 0x3f]); - } - return sb.toString(); + @Override + public LogisticsSetting getLogisticsSetting() { + Setting setting = settingService.get(SettingEnum.LOGISTICS_SETTING.name()); + return JSONUtil.toBean(setting.getSettingValue(), LogisticsSetting.class); } } diff --git a/framework/src/main/java/cn/lili/modules/base/serviceimpl/RegionServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/RegionServiceImpl.java similarity index 74% rename from framework/src/main/java/cn/lili/modules/base/serviceimpl/RegionServiceImpl.java rename to framework/src/main/java/cn/lili/modules/system/serviceimpl/RegionServiceImpl.java index 98331398..cccf1860 100644 --- a/framework/src/main/java/cn/lili/modules/base/serviceimpl/RegionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/RegionServiceImpl.java @@ -1,21 +1,21 @@ -package cn.lili.modules.base.serviceimpl; +package cn.lili.modules.system.serviceimpl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; import cn.lili.common.utils.HttpClientUtils; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.base.mapper.RegionMapper; -import cn.lili.modules.base.service.RegionService; +import cn.lili.common.utils.SnowFlake; import cn.lili.modules.system.entity.dos.Region; import cn.lili.modules.system.entity.vo.RegionVO; +import cn.lili.modules.system.mapper.RegionMapper; +import cn.lili.modules.system.service.RegionService; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.*; @@ -23,11 +23,9 @@ import java.util.*; * 行政地区业务层实现 * * @author Chopper - * @date 2020/12/2 11:11 + * @since 2020/12/2 11:11 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class RegionServiceImpl extends ServiceImpl implements RegionService { /** @@ -35,17 +33,20 @@ public class RegionServiceImpl extends ServiceImpl impleme */ private final String syncUrl = "https://restapi.amap.com/v3/config/district?subdistrict=4&key=e456d77800e2084a326f7b777278f89d"; + @Autowired + private Cache cache; + @Override public void synchronizationData(String url) { try { //清空数据 - QueryWrapper queryWrapper = new QueryWrapper(); + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.ne("id", "-1"); this.remove(queryWrapper); //读取数据 - String jsonString = HttpClientUtils.doGet(StringUtils.isEmpty(url) ? syncUrl : url, null); + String jsonString = HttpClientUtils.doGet(CharSequenceUtil.isEmpty(url) ? syncUrl : url, null); //构造存储数据库的对象集合 List regions = this.initData(jsonString); @@ -53,31 +54,47 @@ public class RegionServiceImpl extends ServiceImpl impleme int endPoint = Math.min((100 + (i * 100)), regions.size()); this.saveBatch(regions.subList(i * 100, endPoint)); } + //删除缓存 + cache.vagueDel("{regions}"); } catch (Exception e) { - e.printStackTrace(); + log.error("同步行政数据错误", e); } } + /** + * 根据最后一级名称获取改所有上级地区id + * + * @param lastName 最后一级名称 + * @return 全部地区id + */ + @Override + public String getItemByLastName(String lastName) { + StringBuilder sql = new StringBuilder(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(Region::getName, lastName); + Region region = this.getOne(lambdaQueryWrapper, false); + if (region != null) { + sql.append(region.getPath()).append(",").append(region.getId()); + return sql.toString().replace(",0,", ""); + } + return null; + } + @Override public List getItem(String id) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(Region::getParentId, id); List regions = this.list(lambdaQueryWrapper); - regions.sort(new Comparator() { - @Override - public int compare(Region o1, Region o2) { - return o1.getOrderNum().compareTo(o2.getOrderNum()); - } - }); + regions.sort(Comparator.comparing(Region::getOrderNum)); return regions; } @Override public Map getRegion(String cityCode, String townName) { //获取地址信息 - Region region = this.baseMapper.selectOne(new QueryWrapper() + Region region = this.getOne(new QueryWrapper() .eq("city_code", cityCode) - .eq("name", townName)); + .eq("name", townName), false); if (region != null) { //获取它的层级关系 String path = region.getPath(); @@ -85,25 +102,27 @@ public class RegionServiceImpl extends ServiceImpl impleme //因为有无用数据 所以先删除前两个 result = ArrayUtils.remove(result, 0); result = ArrayUtils.remove(result, 0); - String regionIds = ""; //地址id - String regionNames = "";//地址名称 + //地址id + StringBuilder regionIds = new StringBuilder(); + //地址名称 + StringBuilder regionNames = new StringBuilder(); //循环构建新的数据 for (String regionId : result) { Region reg = this.baseMapper.selectById(regionId); if (reg != null) { - regionIds += regionId + ","; - regionNames += reg.getName() + ","; + regionIds.append(regionId).append(","); + regionNames.append(reg.getName()).append(","); } } - regionIds += region.getId(); - regionNames += region.getName(); + regionIds.append(region.getId()); + regionNames.append(region.getName()); //构建返回数据 - Map obj = new HashMap<>(); - obj.put("id", regionIds); - obj.put("name", regionNames); + Map obj = new HashMap<>(2); + obj.put("id", regionIds.toString()); + obj.put("name", regionNames.toString()); return obj; } - return null; + return Collections.emptyMap(); } @Override @@ -116,10 +135,8 @@ public class RegionServiceImpl extends ServiceImpl impleme private List regionTree(List regions) { List regionVOS = new ArrayList<>(); - regions.stream().filter(region -> region.getLevel().equals("province")).forEach(item -> { - regionVOS.add(new RegionVO(item)); - }); - regions.stream().filter(region -> region.getLevel().equals("city")).forEach(item -> { + regions.stream().filter(region -> ("province").equals(region.getLevel())).forEach(item -> regionVOS.add(new RegionVO(item))); + regions.stream().filter(region -> ("city").equals(region.getLevel())).forEach(item -> { for (RegionVO region : regionVOS) { if (region.getId().equals(item.getParentId())) { region.getChildren().add(new RegionVO(item)); @@ -137,25 +154,13 @@ public class RegionServiceImpl extends ServiceImpl impleme */ private List initData(String jsonString) { - // 最终数据承载对象 + //最终数据承载对象 List regions = new ArrayList<>(); JSONObject jsonObject = JSONObject.parseObject(jsonString); //获取到国家及下面所有的信息 开始循环插入,这里可以写成递归调用,但是不如这样方便查看、理解 JSONArray countryAll = jsonObject.getJSONArray("districts"); for (int i = 0; i < countryAll.size(); i++) { JSONObject contry = countryAll.getJSONObject(i); -// String citycode0 = contry.getString("citycode"); -// String adcode0 = contry.getString("adcode"); -// String name0 = contry.getString("name"); -// String center0 = contry.getString("center"); -// String country = contry.getString("level"); -// int level = 0; -// if (country.equals("country")) { -// level = 0; -// } -// 插入国家 -// Integer id1 = insert(0, adcode0, citycode0, name0, center0, level, name0); -// Integer id1 = insert(0, adcode0, citycode0, name0, center0, level); String id1 = "0"; JSONArray provinceAll = contry.getJSONArray("districts"); for (int j = 0; j < provinceAll.size(); j++) { @@ -188,7 +193,6 @@ public class RegionServiceImpl extends ServiceImpl impleme String level3 = district.getString("level"); //插入区县 String id4 = insert(regions, id3, citycode3, adcode3, name3, center3, level3, w, id1, id2, id3); - // JSONArray street = street3.getJSONArray("districts"); //有需要可以继续向下遍历 JSONArray streetAll = district.getJSONArray("districts"); for (int r = 0; r < streetAll.size(); r++) { @@ -228,16 +232,16 @@ public class RegionServiceImpl extends ServiceImpl impleme * @return */ public String insert(List regions, String parentId, String cityCode, String adCode, String name, String center, String level, Integer order, String... ids) { -// \"citycode\": [],\n" + -// " \"adcode\": \"100000\",\n" + -// " \"name\": \"中华人民共和国\",\n" + -// " \"center\": \"116.3683244,39.915085\",\n" + -// " \"level\": \"country\",\n" + +// \"citycode\": [],\n" + +// " \"adcode\": \"100000\",\n" + +// " \"name\": \"中华人民共和国\",\n" + +// " \"center\": \"116.3683244,39.915085\",\n" + +// " \"level\": \"country\",\n" + Region record = new Region(); - if (!adCode.equals("[]")) { + if (!("[]").equals(adCode)) { record.setAdCode(adCode); } - if (!cityCode.equals("[]")) { + if (!("[]").equals(cityCode)) { record.setCityCode(cityCode); } record.setCenter(center); @@ -245,14 +249,15 @@ public class RegionServiceImpl extends ServiceImpl impleme record.setName(name); record.setParentId(parentId); record.setOrderNum(order); - String megName = ","; + record.setId(String.valueOf(SnowFlake.getId())); + StringBuilder megName = new StringBuilder(","); for (int i = 0; i < ids.length; i++) { - megName = megName + ids[i]; + megName.append(ids[i]); if (i < ids.length - 1) { - megName = megName + ","; + megName.append(","); } } - record.setPath(megName); + record.setPath(megName.toString()); regions.add(record); return record.getId(); } diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/SensitiveWordsServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/SensitiveWordsServiceImpl.java index f5c4bd4f..3205aef6 100644 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/SensitiveWordsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/SensitiveWordsServiceImpl.java @@ -1,23 +1,36 @@ package cn.lili.modules.system.serviceimpl; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.modules.system.entity.dos.SensitiveWords; import cn.lili.modules.system.mapper.SensitiveWordsMapper; import cn.lili.modules.system.service.SensitiveWordsService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; /** * 敏感词业务层实现 * * @author Bulbasaur - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SensitiveWordsServiceImpl extends ServiceImpl implements SensitiveWordsService { + @Autowired + private Cache> cache; + @Override + public void resetCache() { + List sensitiveWordsList = this.list(); + + if (sensitiveWordsList == null || sensitiveWordsList.isEmpty()) { + return; + } + List sensitiveWords = sensitiveWordsList.stream().map(SensitiveWords::getSensitiveWord).collect(Collectors.toList()); + cache.put(CachePrefix.SENSITIVE.getPrefix(), sensitiveWords); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/ServiceNoticeServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/ServiceNoticeServiceImpl.java index 1f2a18ae..72f8677c 100644 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/ServiceNoticeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/ServiceNoticeServiceImpl.java @@ -12,11 +12,9 @@ import org.springframework.transaction.annotation.Transactional; /** * 服务订阅消息业务层实现 * @author Chopper - * @date 2020/11/17 8:02 下午 + * @since 2020/11/17 8:02 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ServiceNoticeServiceImpl extends ServiceImpl implements ServiceNoticeService { } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/SettingServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/SettingServiceImpl.java index 795b5c4d..bbe09e56 100644 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/SettingServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/SettingServiceImpl.java @@ -13,11 +13,9 @@ import org.springframework.transaction.annotation.Transactional; * 配置业务层实现 * * @author Chopper - * @date 2020/11/17 3:52 下午 + * @since 2020/11/17 3:52 下午 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SettingServiceImpl extends ServiceImpl implements SettingService { @Override diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/StoreLogisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/StoreLogisticsServiceImpl.java deleted file mode 100644 index ce392b03..00000000 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/StoreLogisticsServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.lili.modules.system.serviceimpl; - -import cn.lili.common.security.context.UserContext; -import cn.lili.modules.store.entity.dos.StoreLogistics; -import cn.lili.modules.system.entity.vo.StoreLogisticsVO; -import cn.lili.modules.system.mapper.StoreLogisticsMapper; -import cn.lili.modules.system.service.StoreLogisticsService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 物流公司业务层实现 - * - * @author Chopper - * @date 2020/11/17 8:02 下午 - */ -@Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class StoreLogisticsServiceImpl extends ServiceImpl implements StoreLogisticsService { - - private final StoreLogisticsMapper storeLogisticsMapper; - - @Override - public List getStoreLogistics() { - return storeLogisticsMapper.getStoreLogistics(UserContext.getCurrentUser().getStoreId()); - } - - @Override - public List getStoreSelectedLogistics() { - return storeLogisticsMapper.getSelectedStoreLogistics(UserContext.getCurrentUser().getStoreId()); - - } - - @Override - public StoreLogistics add(String logisticsId) { - //判断是否已经选择过,如果没有选择则进行添加 - LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(StoreLogistics::getLogisticsId, logisticsId); - lambdaQueryWrapper.eq(StoreLogistics::getStoreId, UserContext.getCurrentUser().getStoreId()); - if (this.getOne(lambdaQueryWrapper) == null) { - StoreLogistics storeLogistics = new StoreLogistics(UserContext.getCurrentUser().getStoreId(), logisticsId); - this.save(storeLogistics); - return storeLogistics; - } - return null; - } - - -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java new file mode 100644 index 00000000..310740e2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java @@ -0,0 +1,141 @@ +package cn.lili.modules.system.token; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.PermissionEnum; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; +import cn.lili.common.security.token.TokenUtil; +import cn.lili.common.security.token.base.AbstractTokenGenerate; +import cn.lili.modules.permission.entity.dos.AdminUser; +import cn.lili.modules.permission.entity.vo.UserMenuVO; +import cn.lili.modules.permission.service.RoleMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 管理员token生成 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/16 10:51 + */ +@Component +public class ManagerTokenGenerate extends AbstractTokenGenerate { + + @Autowired + private TokenUtil tokenUtil; + @Autowired + private RoleMenuService roleMenuService; + @Autowired + private Cache cache; + + + @Override + public Token createToken(AdminUser adminUser, Boolean longTerm) { + AuthUser authUser = AuthUser.builder() + .username(adminUser.getUsername()) + .id(adminUser.getId()) + .face(adminUser.getAvatar()) + .role(UserEnums.MANAGER) + .nickName(adminUser.getNickName()) + .isSuper(adminUser.getIsSuper()) + .longTerm(longTerm) + .build(); + + List userMenuVOList = roleMenuService.findAllMenu(authUser.getId()); + //缓存权限列表 + cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId(), this.permissionList(userMenuVOList)); + + return tokenUtil.createToken(authUser); + } + + @Override + public Token refreshToken(String refreshToken) { + return tokenUtil.refreshToken(refreshToken); + } + + /** + * 获取用户权限 + * + * @param userMenuVOList + * @return + */ + private Map> permissionList(List userMenuVOList) { + Map> permission = new HashMap<>(2); + + List superPermissions = new ArrayList<>(); + List queryPermissions = new ArrayList<>(); + initPermission(superPermissions, queryPermissions); + + //循环权限菜单 + if (userMenuVOList != null && !userMenuVOList.isEmpty()) { + userMenuVOList.forEach(menu -> { + //循环菜单,赋予用户权限 + if (CharSequenceUtil.isNotEmpty(menu.getPermission())) { + //获取路径集合 + String[] permissionUrl = menu.getPermission().split(","); + //for循环路径集合 + for (String url : permissionUrl) { + //如果是超级权限 则计入超级权限 + if (Boolean.TRUE.equals(menu.getSuper())) { + //如果已有超级权限,则这里就不做权限的累加 + if (!superPermissions.contains(url)) { + superPermissions.add(url); + } + } + //否则计入浏览权限 + else { + //没有权限,则累加。 + if (!queryPermissions.contains(url)) { + queryPermissions.add(url); + } + } + } + } + //去除重复的权限 + queryPermissions.removeAll(superPermissions); + }); + } + permission.put(PermissionEnum.SUPER.name(), superPermissions); + permission.put(PermissionEnum.QUERY.name(), queryPermissions); + return permission; + } + + /** + * 初始赋予的权限,查看权限包含首页流量统计权限, + * 超级权限包含个人信息维护,密码修改权限 + * + * @param superPermissions 超级权限 + * @param queryPermissions 查询权限 + */ + void initPermission(List superPermissions, List queryPermissions) { + //TODO 用户信息维护--操作权限 + //获取当前登录用户 + superPermissions.add("/manager/passport/user/info*"); + //修改用户资料 + superPermissions.add("/manager/passport/user/edit*"); + //修改密码 + superPermissions.add("/manager/passport/user/editPassword*"); + //退出 + superPermissions.add("/manager/passport/user/logout*"); + + //统计查看权限 + queryPermissions.add("/manager/statistics*"); + //菜单查看权限 + queryPermissions.add("/manager/permission/menu*"); + //商品分类查看权限 + queryPermissions.add("/manager/goods/category*"); + //查看地区接口 + queryPermissions.add("/manager/setting/region*"); + + } + +} diff --git a/framework/src/main/java/cn/lili/modules/system/utils/CharacterConstant.java b/framework/src/main/java/cn/lili/modules/system/utils/CharacterConstant.java deleted file mode 100644 index 95030afa..00000000 --- a/framework/src/main/java/cn/lili/modules/system/utils/CharacterConstant.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.lili.modules.system.utils; - -/** - * - * @Description: 字符常量 - * @author Bulbasaur - * @version v1.0 - * @since v1.0 - * 2020-02-25 14:10:16 - */ -public class CharacterConstant { - - - /** - * 字符* - */ - public final static char WILDCARD_STAR = '*'; - - -} diff --git a/framework/src/main/java/cn/lili/modules/system/utils/HttpUtils.java b/framework/src/main/java/cn/lili/modules/system/utils/HttpUtils.java deleted file mode 100644 index 43d8ce41..00000000 --- a/framework/src/main/java/cn/lili/modules/system/utils/HttpUtils.java +++ /dev/null @@ -1,362 +0,0 @@ -package cn.lili.modules.system.utils; - -import com.alibaba.fastjson.JSONObject; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.message.BasicHeader; -import org.apache.http.protocol.HTTP; - -import java.io.*; -import java.net.*; -import java.nio.charset.StandardCharsets; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -/** - * Http工具 - * - * @author pikachu - * @date 2018/3/13 - */ -public final class HttpUtils { - - public static final int HTTP_CONN_TIMEOUT = 100000; - public static final int HTTP_SOCKET_TIMEOUT = 100000; - - public static String doPost(String reqUrl, Map parameters) { - return doPost(reqUrl, parameters, "UTF-8", HTTP_CONN_TIMEOUT, HTTP_SOCKET_TIMEOUT); - } - - public static String doPost(String reqUrl, Map parameters, String encoding) { - return doPost(reqUrl, parameters, encoding, HTTP_CONN_TIMEOUT, HTTP_SOCKET_TIMEOUT); - } - - public static String doPost(String reqUrl, Map parameters, String encoding, int connectTimeout, - int readTimeout) { - HttpURLConnection urlConn = null; - try { - urlConn = sendPost(reqUrl, parameters, encoding, connectTimeout, readTimeout); - String responseContent = getContent(urlConn, encoding); - return responseContent.trim(); - } finally { - if (urlConn != null) { - urlConn.disconnect(); - - } - } - } - - /** - * post携带json请求 - * - * @param reqUrl - * @param jsonParameters - * @return - */ - public static String doPostWithJson(String reqUrl, Map jsonParameters) { - - BufferedReader reader = null; - try { - URL url = new URL(reqUrl);// 创建连接 - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setDoOutput(true); - connection.setDoInput(true); - connection.setUseCaches(false); - connection.setInstanceFollowRedirects(true); - connection.setRequestMethod("POST"); // 设置请求方式 - // connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式 - connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式 - connection.connect(); - //一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的 - OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8); // utf-8编码 - out.append(JSONObject.toJSONString(jsonParameters)); - out.flush(); - out.close(); - // 读取响应 - reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); - String line; - String res = ""; - while ((line = reader.readLine()) != null) { - res += line; - } - reader.close(); - - return res; - } catch (IOException e) { - e.printStackTrace(); - } - return "error"; // 自定义错误信息 - - } - - private static HttpURLConnection sendPost(String reqUrl, - Map parameters, String encoding, int connectTimeout, int readTimeout) { - HttpURLConnection urlConn = null; - try { - String params = generatorParamString(parameters, encoding); - URL url = new URL(reqUrl); - urlConn = (HttpURLConnection) url.openConnection(); - urlConn.setRequestMethod("POST"); - // urlConn - // .setRequestProperty( - // "User-Agent", - // "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"); - // (单位:毫秒)jdk - urlConn.setConnectTimeout(connectTimeout); - // (单位:毫秒)jdk 1.5换成这个,读操作超时 - urlConn.setReadTimeout(readTimeout); - urlConn.setDoOutput(true); - // String按照字节处理是一个好方法 - byte[] b = params.getBytes(encoding); - urlConn.getOutputStream().write(b, 0, b.length); - urlConn.getOutputStream().flush(); - urlConn.getOutputStream().close(); - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } - return urlConn; - } - - private static String getContent(HttpURLConnection urlConn, String encoding) { - try { - String responseContent = null; - InputStream in = urlConn.getInputStream(); - BufferedReader rd = new BufferedReader(new InputStreamReader(in, encoding)); - String tempLine = rd.readLine(); - StringBuffer tempStr = new StringBuffer(); - String crlf = System.getProperty("line.separator"); - while (tempLine != null) { - tempStr.append(tempLine); - tempStr.append(crlf); - tempLine = rd.readLine(); - } - responseContent = tempStr.toString(); - rd.close(); - in.close(); - return responseContent; - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } - } - - /** - * @param link - * @param encoding - * @return - */ - public static String doGet(String link, String encoding, int connectTimeout, int readTimeout) { - HttpURLConnection conn = null; - try { - URL url = new URL(link); - conn = (HttpURLConnection) url.openConnection(); - conn.setRequestMethod("GET"); - conn.setConnectTimeout(connectTimeout); - conn.setReadTimeout(readTimeout); - // conn.setRequestProperty("User-Agent", "Mozilla/5.0"); - BufferedInputStream in = new BufferedInputStream( - conn.getInputStream()); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] buf = new byte[1024]; - for (int i = 0; (i = in.read(buf)) > 0; ) { - out.write(buf, 0, i); - } - out.flush(); - String s = out.toString(encoding); - return s; - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } finally { - if (conn != null) { - conn.disconnect(); - conn = null; - } - } - } - - /** - * UTF-8编码 - * - * @param link - * @return - */ - public static String doGet(String link) { - return doGet(link, "UTF-8", HTTP_CONN_TIMEOUT, HTTP_SOCKET_TIMEOUT); - } - - /** - * 将parameters中数据转换成用"&"链接的http请求参数形式 - * - * @param parameters - * @return - */ - private static String generatorParamString(Map parameters, String encoding) { - StringBuffer params = new StringBuffer(); - if (parameters != null) { - for (Iterator iter = parameters.keySet().iterator(); iter - .hasNext(); ) { - String name = iter.next(); - String value = parameters.get(name); - params.append(name + "="); - try { - params.append(URLEncoder.encode(value, encoding)); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e.getMessage(), e); - } catch (Exception e) { - String message = String.format("'%s'='%s'", name, value); - throw new RuntimeException(message, e); - } - if (iter.hasNext()) { - params.append("&"); - } - } - } - return params.toString(); - } - - /** - * post请求封装 参数为{"a":1,"b":2,"c":3} - * - * @param path 接口地址 - * @param Info 参数 - * @return - * @throws IOException - */ - public static String postResponse(String path, JSONObject Info) { - HttpClient client = new DefaultHttpClient(); - HttpPost post = new HttpPost(path); - - post.setHeader("Content-Type", "application/json"); - post.addHeader("Authorization", "Basic YWRtaW46"); - String result = ""; - - try { - StringEntity s = new StringEntity(Info.toString(), "utf-8"); - System.out.println("<-------------------->"); - System.out.println(s); - System.out.println("<-------------------->"); - s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); - post.setEntity(s); - // 发送请求 - HttpResponse httpResponse = client.execute(post); - - // 获取响应输入流 - InputStream inStream = httpResponse.getEntity().getContent(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, StandardCharsets.UTF_8)); - StringBuilder strber = new StringBuilder(); - String line = null; - while ((line = reader.readLine()) != null) { - strber.append(line + "\n"); - } - inStream.close(); - - result = strber.toString(); - System.out.println(result); - - if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { - System.out.println("请求服务器成功,做相应处理"); - } else { - System.out.println("请求服务端失败"); - } - - } catch (Exception e) { - System.out.println("请求异常"); - throw new RuntimeException(e); - } - - return result; - } - - public static String http(String url, String proxyUrl, int proxyPort, Map params, String chartSet) - throws Exception { - URL u = null; - HttpURLConnection con = null; - // 构建请求参数 - StringBuffer sb = new StringBuffer(); - OutputStreamWriter osw = null; - BufferedReader br = null; - if (params != null) { - int i = 0; - for (Entry e : params.entrySet()) { - if (i != 0) { - sb.append("&"); - } else { - i++; - } - sb.append(e.getKey()); - if (e.getValue() != null && !e.getValue().equals("")) { - sb.append("="); - sb.append(e.getValue());///URLEncoder.encode(sign, "UTF-8") - } - } - } - System.out.println("连接:" + url); - System.out.println("发送:" + sb.toString()); - try { - u = new URL(url); - if (null != proxyUrl && !proxyUrl.equals("")) { - System.out.println("代理的IP是:" + proxyUrl + ",代理端口:" + proxyPort); - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyUrl, proxyPort)); - con = (HttpURLConnection) u.openConnection(proxy); - } else { - con = (HttpURLConnection) u.openConnection(); - } - con.setConnectTimeout(30000); - con.setReadTimeout(700000); - con.setRequestMethod("POST"); - con.setDoOutput(true); - con.setDoInput(true); - con.setUseCaches(false); - con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - con.setRequestProperty("Charset", "UTF-8"); - osw = new OutputStreamWriter(con.getOutputStream(), StandardCharsets.UTF_8); - osw.write(sb.toString()); - osw.flush(); - } catch (SocketTimeoutException e) { - throw new Exception(); - } catch (Exception e) { - throw new Exception(); - } finally { - try { - osw.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - StringBuffer buffer = new StringBuffer(); - try { - br = new BufferedReader(new InputStreamReader(con.getInputStream(), - StandardCharsets.UTF_8)); - String temp; - while ((temp = br.readLine()) != null) { - buffer.append(temp); - buffer.append("\n"); - } - } catch (SocketTimeoutException e) { - throw new Exception(); - } catch (FileNotFoundException e) { - throw new Exception(); - } catch (Exception e) { - throw new Exception(); - } finally { - try { - if (osw != null) { - osw.close(); - } - if (br != null) { - br.close(); - } - if (con != null) { - con.disconnect(); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - } - return buffer.toString(); - } -} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/verification/ImageUtil.java b/framework/src/main/java/cn/lili/modules/verification/ImageUtil.java similarity index 54% rename from framework/src/main/java/cn/lili/common/verification/ImageUtil.java rename to framework/src/main/java/cn/lili/modules/verification/ImageUtil.java index deba251f..71792fa3 100644 --- a/framework/src/main/java/cn/lili/common/verification/ImageUtil.java +++ b/framework/src/main/java/cn/lili/modules/verification/ImageUtil.java @@ -1,4 +1,4 @@ -package cn.lili.common.verification; +package cn.lili.modules.verification; import java.awt.*; import java.awt.image.BufferedImage; @@ -16,25 +16,69 @@ public class ImageUtil { /** * 添加水印 * - * @param oriImage - * @param text - * @throws IOException + * @param oriImage 原图 + * @param text 文字 + * @throws IOException 流操作异常 */ public static void addWatermark(BufferedImage oriImage, String text) { Graphics2D graphics2D = oriImage.createGraphics(); - // 设置水印文字颜色 + //设置水印文字颜色 graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - // 设置水印文字Font + //设置水印文字Font graphics2D.setColor(Color.black); - // 设置水印文字透明度 + //设置水印文字透明度 graphics2D.setFont(new Font("宋体", Font.BOLD, 30)); - // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) + //第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.4f)); graphics2D.drawString(text, 10, 40); graphics2D.dispose(); } + /** + * 干扰图 + * + * @param oriImage 原图 + * @param templateImage 模板图 + * @param x 随机扣取坐标X + * @param y 随机扣取坐标y + */ + public static void interfereTemplate(BufferedImage oriImage, BufferedImage templateImage, + int x, int y) { + //临时数组遍历用于高斯模糊存周边像素值 + int[][] matrix = new int[3][3]; + int[] values = new int[9]; + + int xLength = templateImage.getWidth(); + int yLength = templateImage.getHeight(); + //模板图像宽度 + for (int i = 0; i < xLength; i++) { + //模板图片高度 + for (int j = 0; j < yLength; j++) { + //如果模板图像当前像素点不是透明色 copy源文件信息到目标图片中 + int rgb = templateImage.getRGB(i, j); + if (rgb < 0) { + //抠图区域高斯模糊 + readPixel(oriImage, x + i, y + j, values); + fillMatrix(matrix, values); + oriImage.setRGB(x + i, y + j, avgMatrix(matrix)); + } + + //防止数组越界判断 + if (i == (xLength - 1) || j == (yLength - 1)) { + continue; + } + int rightRgb = templateImage.getRGB(i + 1, j); + int downRgb = templateImage.getRGB(i, j + 1); + //描边处理,,取带像素和无像素的界点,判断该点是不是临界轮廓点,如果是设置该坐标像素是白色 + boolean rgbImage = ((rgb >= 0 && rightRgb < 0) + || (rgb < 0 && rightRgb >= 0) + || (rgb >= 0 && downRgb < 0) + || (rgb < 0 && downRgb >= 0)); + } + } + } + /** * @param oriImage 原图 * @param templateImage 模板图 @@ -44,40 +88,41 @@ public class ImageUtil { */ public static void cutByTemplate(BufferedImage oriImage, BufferedImage templateImage, BufferedImage newImage, int x, int y) { - // 临时数组遍历用于高斯模糊存周边像素值 + //临时数组遍历用于高斯模糊存周边像素值 int[][] matrix = new int[3][3]; int[] values = new int[9]; int xLength = templateImage.getWidth(); int yLength = templateImage.getHeight(); - // 模板图像宽度 + //模板图像宽度 for (int i = 0; i < xLength; i++) { - // 模板图片高度 + //模板图片高度 for (int j = 0; j < yLength; j++) { - // 如果模板图像当前像素点不是透明色 copy源文件信息到目标图片中 + //如果模板图像当前像素点不是透明色 copy源文件信息到目标图片中 int rgb = templateImage.getRGB(i, j); if (rgb < 0) { newImage.setRGB(i, j, oriImage.getRGB(x + i, y + j)); - // 抠图区域高斯模糊 + //抠图区域高斯模糊 readPixel(oriImage, x + i, y + j, values); fillMatrix(matrix, values); oriImage.setRGB(x + i, y + j, avgMatrix(matrix)); } - // 防止数组越界判断 + //防止数组越界判断 if (i == (xLength - 1) || j == (yLength - 1)) { continue; } int rightRgb = templateImage.getRGB(i + 1, j); int downRgb = templateImage.getRGB(i, j + 1); - // 描边处理,,取带像素和无像素的界点,判断该点是不是临界轮廓点,如果是设置该坐标像素是白色 - if ((rgb >= 0 && rightRgb < 0) || (rgb < 0 && rightRgb >= 0) || (rgb >= 0 && downRgb < 0) - || (rgb < 0 && downRgb >= 0)) { + //描边处理,,取带像素和无像素的界点,判断该点是不是临界轮廓点,如果是设置该坐标像素是白色 + boolean rgbImage = ((rgb >= 0 && rightRgb < 0) + || (rgb < 0 && rightRgb >= 0) + || (rgb >= 0 && downRgb < 0) + || (rgb < 0 && downRgb >= 0)); + if (rgbImage) { newImage.setRGB(i, j, Color.GRAY.getRGB()); - -// oriImage.setRGB(x + i, y + j, Color.white.getRGB()); } } } @@ -87,7 +132,7 @@ public class ImageUtil { int xStart = x - 1; int yStart = y - 1; int current = 0; - for (int i = xStart; i < 3 + xStart; i++) + for (int i = xStart; i < 3 + xStart; i++) { for (int j = yStart; j < 3 + yStart; j++) { int tx = i; if (tx < 0) { @@ -105,6 +150,7 @@ public class ImageUtil { pixels[current++] = img.getRGB(tx, ty); } + } } public static void fillMatrix(int[][] matrix, int[] values) { diff --git a/framework/src/main/java/cn/lili/common/verification/SliderImageUtil.java b/framework/src/main/java/cn/lili/modules/verification/SliderImageUtil.java similarity index 62% rename from framework/src/main/java/cn/lili/common/verification/SliderImageUtil.java rename to framework/src/main/java/cn/lili/modules/verification/SliderImageUtil.java index 9dc75798..71ee49de 100644 --- a/framework/src/main/java/cn/lili/common/verification/SliderImageUtil.java +++ b/framework/src/main/java/cn/lili/modules/verification/SliderImageUtil.java @@ -1,105 +1,124 @@ -package cn.lili.common.verification; - -import cn.lili.common.utils.Base64DecodeMultipartFile; -import cn.lili.common.vo.SerializableStream; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.util.Base64Utils; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -/** - * 验证码工具 - * - * @author Chopper - * @version v4.0 - * @Description: - * @since 2020/11/17 14:34 - */ -@Component -@Slf4j -public class SliderImageUtil { - - private static final int BOLD = 5; - - private static final String IMG_FILE_TYPE = "jpg"; - - private static final String TEMP_IMG_FILE_TYPE = "png"; - - /** - * 根据模板切图 - * - * @param sliderFile - * @param originalFile - * @return - * @throws Exception sliderFile, originalFile - */ - public static Map pictureTemplatesCut(SerializableStream sliderFile, SerializableStream originalFile) throws Exception { - - Random random = new Random(); - Map pictureMap = new HashMap<>(); - // 拼图 - BufferedImage sliderImage = ImageIO.read(Base64DecodeMultipartFile.base64ToInputStream(sliderFile.getBase64())); - int sliderWidth = sliderImage.getWidth(); - int sliderHeight = sliderImage.getHeight(); - - // 原图 - BufferedImage originalImage = ImageIO.read(Base64DecodeMultipartFile.base64ToInputStream(originalFile.getBase64())); - int originalWidth = originalImage.getWidth(); - int originalHeight = originalImage.getHeight(); - - // 随机生成抠图坐标X,Y - // X轴距离右端targetWidth Y轴距离底部targetHeight以上 - int randomX = random.nextInt(originalWidth - 3 * sliderWidth) + 2 * sliderWidth; - int randomY = random.nextInt(originalHeight - sliderHeight); - log.info("原图大小{} x {},随机生成的坐标 X,Y 为({},{})", originalWidth, originalHeight, randomX, randomY); - - // 新建一个和模板一样大小的图像,TYPE_4BYTE_ABGR表示具有8位RGBA颜色分量的图像,正常取imageTemplate.getType() - BufferedImage newImage = new BufferedImage(sliderWidth, sliderHeight, sliderImage.getType()); - // 得到画笔对象 - Graphics2D graphics = newImage.createGraphics(); - // 如果需要生成RGB格式,需要做如下配置,Transparency 设置透明 - newImage = graphics.getDeviceConfiguration().createCompatibleImage(sliderWidth, sliderHeight, - Transparency.TRANSLUCENT); - - // 新建的图像根据模板颜色赋值,源图生成遮罩 - ImageUtil.cutByTemplate(originalImage, sliderImage, newImage, randomX, randomY); - - // 设置“抗锯齿”的属性 - graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - graphics.setStroke(new BasicStroke(BOLD, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - graphics.drawImage(newImage, 0, 0, null); - graphics.dispose(); - - //添加水印 - ImageUtil.addWatermark(originalImage, "请滑动拼图"); - ByteArrayOutputStream newImageOs = new ByteArrayOutputStream();// 新建流。 - ImageIO.write(newImage, TEMP_IMG_FILE_TYPE, newImageOs);// 利用ImageIO类提供的write方法,将bi以png图片的数据模式写入流。 - byte[] newImagery = newImageOs.toByteArray(); - - ByteArrayOutputStream oriImagesOs = new ByteArrayOutputStream();// 新建流。 - ImageIO.write(originalImage, IMG_FILE_TYPE, oriImagesOs);// 利用ImageIO类提供的write方法,将bi以jpg图片的数据模式写入流。 - byte[] oriImageByte = oriImagesOs.toByteArray(); - - pictureMap.put("slidingImage", "data:image/png;base64," + Base64Utils.encodeToString(newImagery)); - pictureMap.put("backImage", "data:image/png;base64," + Base64Utils.encodeToString(oriImageByte)); -// x轴 - pictureMap.put("randomX", randomX); -// y轴 - pictureMap.put("randomY", randomY); - - pictureMap.put("originalHeight", originalHeight); - pictureMap.put("originalWidth", originalWidth); - pictureMap.put("sliderHeight", sliderHeight); - pictureMap.put("sliderWidth", sliderWidth); - return pictureMap; - } - - -} +package cn.lili.modules.verification; + +import cn.lili.common.utils.Base64DecodeMultipartFile; +import cn.lili.common.vo.SerializableStream; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Base64Utils; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +/** + * 验证码工具 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/17 14:34 + */ +@Slf4j +public class SliderImageUtil { + + + private static final int BOLD = 5; + + private static final String IMG_FILE_TYPE = "jpg"; + + private static final String TEMP_IMG_FILE_TYPE = "png"; + + /** + * 根据模板切图 + * + * @param sliderFile 滑块 + * @param originalFile 原图 + * @param watermark 水印 + * @param interfereNum 干扰选项 + * @return 滑块参数 + * @throws Exception sliderFile, originalFile + */ + public static Map pictureTemplatesCut( + SerializableStream sliderFile, + SerializableStream interfereSliderFile, + SerializableStream originalFile, + String watermark, Integer interfereNum) throws Exception { + + Random random = new Random(); + Map pictureMap = new HashMap<>(16); + //拼图 + BufferedImage sliderImage = ImageIO.read(Base64DecodeMultipartFile.base64ToInputStream(sliderFile.getBase64())); + int sliderWidth = sliderImage.getWidth(); + int sliderHeight = sliderImage.getHeight(); + + //原图 + BufferedImage originalImage = ImageIO.read(Base64DecodeMultipartFile.base64ToInputStream(originalFile.getBase64())); + int originalWidth = originalImage.getWidth(); + int originalHeight = originalImage.getHeight(); + + //随机生成抠图坐标X,Y + //X轴距离右端targetWidth Y轴距离底部targetHeight以上 + int randomX = random.nextInt(originalWidth - 3 * sliderWidth) + 2 * sliderWidth; + int randomY = random.nextInt(originalHeight - sliderHeight); + log.info("原图大小{} x {},随机生成的坐标 X,Y 为({},{})", originalWidth, originalHeight, randomX, randomY); + + //新建一个和模板一样大小的图像,TYPE_4BYTE_ABGR表示具有8位RGBA颜色分量的图像,正常取imageTemplate.getType() + BufferedImage newImage = new BufferedImage(sliderWidth, sliderHeight, sliderImage.getType()); + //得到画笔对象 + Graphics2D graphics = newImage.createGraphics(); + //如果需要生成RGB格式,需要做如下配置,Transparency 设置透明 + newImage = graphics.getDeviceConfiguration().createCompatibleImage(sliderWidth, sliderHeight, + Transparency.TRANSLUCENT); + + //新建的图像根据模板颜色赋值,源图生成遮罩 + ImageUtil.cutByTemplate(originalImage, sliderImage, newImage, randomX, randomY); + + + //干扰项 + if (interfereNum > 0) { + BufferedImage interfereSliderImage = ImageIO.read(Base64DecodeMultipartFile.base64ToInputStream(interfereSliderFile.getBase64())); + for (int i = 0; i < interfereNum; i++) { + int interfereX = random.nextInt(originalWidth - 3 * sliderWidth) + 2 * sliderWidth; + int interfereY = random.nextInt(originalHeight - sliderHeight); + ImageUtil.interfereTemplate(originalImage, interfereSliderImage, interfereX, interfereY); + } + } + + + //设置“抗锯齿”的属性 + graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + graphics.setStroke(new BasicStroke(BOLD, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + graphics.drawImage(newImage, 0, 0, null); + graphics.dispose(); + + //添加水印 +// ImageUtil.addWatermark(originalImage, watermark); + //新建流 + ByteArrayOutputStream newImageOs = new ByteArrayOutputStream(); + //利用ImageIO类提供的write方法,将bi以png图片的数据模式写入流。 + ImageIO.write(newImage, TEMP_IMG_FILE_TYPE, newImageOs); + byte[] newImagery = newImageOs.toByteArray(); + //新建流 + ByteArrayOutputStream oriImagesOs = new ByteArrayOutputStream(); + //利用ImageIO类提供的write方法,将bi以jpg图片的数据模式写入流 + ImageIO.write(originalImage, IMG_FILE_TYPE, oriImagesOs); + byte[] oriImageByte = oriImagesOs.toByteArray(); + + pictureMap.put("slidingImage", "data:image/png;base64," + Base64Utils.encodeToString(newImagery)); + pictureMap.put("backImage", "data:image/png;base64," + Base64Utils.encodeToString(oriImageByte)); +// x轴 + pictureMap.put("randomX", randomX); +// y轴 + pictureMap.put("randomY", randomY); + + pictureMap.put("originalHeight", originalHeight); + pictureMap.put("originalWidth", originalWidth); + pictureMap.put("sliderHeight", sliderHeight); + pictureMap.put("sliderWidth", sliderWidth); + return pictureMap; + } + + +} diff --git a/framework/src/main/java/cn/lili/common/verification/VerificationSDK.java b/framework/src/main/java/cn/lili/modules/verification/VerificationSDK.java similarity index 70% rename from framework/src/main/java/cn/lili/common/verification/VerificationSDK.java rename to framework/src/main/java/cn/lili/modules/verification/VerificationSDK.java index 16591687..2d98b28e 100644 --- a/framework/src/main/java/cn/lili/common/verification/VerificationSDK.java +++ b/framework/src/main/java/cn/lili/modules/verification/VerificationSDK.java @@ -1,8 +1,7 @@ -package cn.lili.common.verification; +package cn.lili.modules.verification; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; -import lombok.RequiredArgsConstructor; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -11,14 +10,13 @@ import org.springframework.stereotype.Component; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/17 15:43 */ @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class VerificationSDK { - private final Cache cache; + @Autowired + private Cache cache; /** * 生成一个token 用于获取校验中心的验证码逻辑 diff --git a/framework/src/main/java/cn/lili/common/verification/aop/VerificationInterceptor.java b/framework/src/main/java/cn/lili/modules/verification/aop/VerificationInterceptor.java similarity index 71% rename from framework/src/main/java/cn/lili/common/verification/aop/VerificationInterceptor.java rename to framework/src/main/java/cn/lili/modules/verification/aop/VerificationInterceptor.java index df20b738..913fcb25 100644 --- a/framework/src/main/java/cn/lili/common/verification/aop/VerificationInterceptor.java +++ b/framework/src/main/java/cn/lili/modules/verification/aop/VerificationInterceptor.java @@ -1,11 +1,10 @@ -package cn.lili.common.verification.aop; +package cn.lili.modules.verification.aop; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.verification.aop.annotation.Verification; -import cn.lili.common.verification.enums.VerificationEnums; -import cn.lili.common.verification.service.VerificationService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.verification.aop.annotation.Verification; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; @@ -24,13 +23,12 @@ import java.lang.reflect.Method; @Aspect @Configuration @Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class VerificationInterceptor { + @Autowired + private VerificationService verificationService; - private final VerificationService verificationService; - - @Before("@annotation(cn.lili.common.verification.aop.annotation.Verification)") + @Before("@annotation(cn.lili.modules.verification.aop.annotation.Verification)") public void interceptor(JoinPoint pjp) { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); diff --git a/framework/src/main/java/cn/lili/common/verification/aop/annotation/Verification.java b/framework/src/main/java/cn/lili/modules/verification/aop/annotation/Verification.java similarity index 76% rename from framework/src/main/java/cn/lili/common/verification/aop/annotation/Verification.java rename to framework/src/main/java/cn/lili/modules/verification/aop/annotation/Verification.java index 74af5437..26b79aa2 100644 --- a/framework/src/main/java/cn/lili/common/verification/aop/annotation/Verification.java +++ b/framework/src/main/java/cn/lili/modules/verification/aop/annotation/Verification.java @@ -1,7 +1,7 @@ -package cn.lili.common.verification.aop.annotation; +package cn.lili.modules.verification.aop.annotation; -import cn.lili.common.verification.enums.VerificationEnums; +import cn.lili.modules.verification.entity.enums.VerificationEnums; import java.lang.annotation.*; diff --git a/framework/src/main/java/cn/lili/modules/base/entity/dos/VerificationSource.java b/framework/src/main/java/cn/lili/modules/verification/entity/dos/VerificationSource.java similarity index 69% rename from framework/src/main/java/cn/lili/modules/base/entity/dos/VerificationSource.java rename to framework/src/main/java/cn/lili/modules/verification/entity/dos/VerificationSource.java index 77ac279f..affce14c 100644 --- a/framework/src/main/java/cn/lili/modules/base/entity/dos/VerificationSource.java +++ b/framework/src/main/java/cn/lili/modules/verification/entity/dos/VerificationSource.java @@ -1,22 +1,18 @@ -package cn.lili.modules.base.entity.dos; +package cn.lili.modules.verification.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; +import cn.lili.modules.verification.entity.enums.VerificationSourceEnum; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; - /** * 验证码资源维护 * @author Chopper - * @date 2021/1/30 4:13 下午 + * @since 2021/1/30 4:13 下午 */ @Data -@Entity -@Table(name = "li_verification_source") @TableName("li_verification_source") @ApiModel(value = "验证码资源维护") public class VerificationSource extends BaseEntity { @@ -30,7 +26,7 @@ public class VerificationSource extends BaseEntity { private String resource; /** - * @see cn.lili.modules.base.entity.enums.VerificationSourceEnum + * @see VerificationSourceEnum */ @ApiModelProperty(value = "验证码资源类型 SLIDER/SOURCE") private String type; diff --git a/framework/src/main/java/cn/lili/modules/base/entity/vo/VerificationVO.java b/framework/src/main/java/cn/lili/modules/verification/entity/dto/VerificationDTO.java similarity index 56% rename from framework/src/main/java/cn/lili/modules/base/entity/vo/VerificationVO.java rename to framework/src/main/java/cn/lili/modules/verification/entity/dto/VerificationDTO.java index df5a1bca..65b2f2f9 100644 --- a/framework/src/main/java/cn/lili/modules/base/entity/vo/VerificationVO.java +++ b/framework/src/main/java/cn/lili/modules/verification/entity/dto/VerificationDTO.java @@ -1,19 +1,19 @@ -package cn.lili.modules.base.entity.vo; +package cn.lili.modules.verification.entity.dto; -import cn.lili.modules.base.entity.dos.VerificationSource; +import cn.lili.modules.verification.entity.dos.VerificationSource; import lombok.Data; import java.io.Serializable; import java.util.List; /** - * 验证码资源缓存VO + * 验证码资源缓存DTO * * @author Chopper - * @date 2020/12/2 17:50 + * @since 2020/12/2 17:50 */ @Data -public class VerificationVO implements Serializable { +public class VerificationDTO implements Serializable { /** diff --git a/framework/src/main/java/cn/lili/common/verification/enums/VerificationEnums.java b/framework/src/main/java/cn/lili/modules/verification/entity/enums/VerificationEnums.java similarity index 86% rename from framework/src/main/java/cn/lili/common/verification/enums/VerificationEnums.java rename to framework/src/main/java/cn/lili/modules/verification/entity/enums/VerificationEnums.java index 4cb72339..48b6b92b 100644 --- a/framework/src/main/java/cn/lili/common/verification/enums/VerificationEnums.java +++ b/framework/src/main/java/cn/lili/modules/verification/entity/enums/VerificationEnums.java @@ -1,4 +1,4 @@ -package cn.lili.common.verification.enums; +package cn.lili.modules.verification.entity.enums; /** * VerificationEnums diff --git a/framework/src/main/java/cn/lili/modules/base/entity/enums/VerificationSourceEnum.java b/framework/src/main/java/cn/lili/modules/verification/entity/enums/VerificationSourceEnum.java similarity index 65% rename from framework/src/main/java/cn/lili/modules/base/entity/enums/VerificationSourceEnum.java rename to framework/src/main/java/cn/lili/modules/verification/entity/enums/VerificationSourceEnum.java index 8ad6023d..0994c089 100644 --- a/framework/src/main/java/cn/lili/modules/base/entity/enums/VerificationSourceEnum.java +++ b/framework/src/main/java/cn/lili/modules/verification/entity/enums/VerificationSourceEnum.java @@ -1,15 +1,20 @@ -package cn.lili.modules.base.entity.enums; +package cn.lili.modules.verification.entity.enums; /** * 验证码资源枚举 * * @author Chopper - * @date 2021/1/26 15:55 + * @since 2021/1/26 15:55 */ public enum VerificationSourceEnum { - + /** + * 滑块 + */ SLIDER("滑块"), + /** + * 验证码源 + */ RESOURCE("验证码源"); private final String description; diff --git a/framework/src/main/java/cn/lili/common/verification/service/VerificationService.java b/framework/src/main/java/cn/lili/modules/verification/service/VerificationService.java similarity index 73% rename from framework/src/main/java/cn/lili/common/verification/service/VerificationService.java rename to framework/src/main/java/cn/lili/modules/verification/service/VerificationService.java index 6c54ced0..40d709c5 100644 --- a/framework/src/main/java/cn/lili/common/verification/service/VerificationService.java +++ b/framework/src/main/java/cn/lili/modules/verification/service/VerificationService.java @@ -1,12 +1,15 @@ -package cn.lili.common.verification.service; +package cn.lili.modules.verification.service; -import cn.lili.common.verification.enums.VerificationEnums; +import cn.lili.modules.verification.entity.enums.VerificationEnums; import java.io.IOException; import java.util.Map; /** * 验证码模块 + * + * @author Bulbasaur + * @since 2021/7/9 1:42 上午 */ public interface VerificationService { /** @@ -15,8 +18,9 @@ public interface VerificationService { * @param verificationEnums 校验枚举 * @param uuid uuid * @return 校验对象 + * @throws IOException 校验错误 */ - Map createVerification(VerificationEnums verificationEnums, String uuid) throws IOException; + Map createVerification(VerificationEnums verificationEnums, String uuid); /** * 预校验 @@ -29,9 +33,11 @@ public interface VerificationService { boolean preCheck(Integer xPos, String uuid, VerificationEnums verificationEnums); /** + * 验证码校验 + * * @param uuid 用户唯一表示 * @param verificationEnums 校验枚举 - * @return + * @return 操作结果 */ boolean check(String uuid, VerificationEnums verificationEnums); } diff --git a/framework/src/main/java/cn/lili/modules/base/service/VerificationSourceService.java b/framework/src/main/java/cn/lili/modules/verification/service/VerificationSourceService.java similarity index 50% rename from framework/src/main/java/cn/lili/modules/base/service/VerificationSourceService.java rename to framework/src/main/java/cn/lili/modules/verification/service/VerificationSourceService.java index 7db9558a..32946b21 100644 --- a/framework/src/main/java/cn/lili/modules/base/service/VerificationSourceService.java +++ b/framework/src/main/java/cn/lili/modules/verification/service/VerificationSourceService.java @@ -1,19 +1,21 @@ -package cn.lili.modules.base.service; +package cn.lili.modules.verification.service; -import cn.lili.common.cache.CachePrefix; -import cn.lili.modules.base.entity.dos.VerificationSource; -import cn.lili.modules.base.entity.vo.VerificationVO; +import cn.lili.cache.CachePrefix; +import cn.lili.modules.verification.entity.dos.VerificationSource; +import cn.lili.modules.verification.entity.dto.VerificationDTO; import com.baomidou.mybatisplus.extension.service.IService; /** * 验证码资源维护 业务层 * * @author Chopper - * @date 2020/11/17 3:44 下午 + * @since 2020/11/17 3:44 下午 */ public interface VerificationSourceService extends IService { - //缓存 + /** + * 缓存 + */ String VERIFICATION_CACHE = CachePrefix.VERIFICATION.getPrefix(); @@ -22,10 +24,12 @@ public interface VerificationSourceService extends IService * * @return */ - VerificationVO initCache(); + VerificationDTO initCache(); /** * 获取验证缓存 + * + * @return 验证码 */ - VerificationVO getVerificationCache(); + VerificationDTO getVerificationCache(); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/verification/service/impl/VerificationServiceImpl.java b/framework/src/main/java/cn/lili/modules/verification/service/impl/VerificationServiceImpl.java similarity index 60% rename from framework/src/main/java/cn/lili/common/verification/service/impl/VerificationServiceImpl.java rename to framework/src/main/java/cn/lili/modules/verification/service/impl/VerificationServiceImpl.java index 469bbaa5..edf3c9f5 100644 --- a/framework/src/main/java/cn/lili/common/verification/service/impl/VerificationServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/verification/service/impl/VerificationServiceImpl.java @@ -1,22 +1,22 @@ -package cn.lili.common.verification.service.impl; +package cn.lili.modules.verification.service.impl; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.VerificationCodeProperties; import cn.lili.common.utils.StringUtils; -import cn.lili.common.verification.SliderImageUtil; -import cn.lili.common.verification.enums.VerificationEnums; -import cn.lili.common.verification.service.VerificationService; import cn.lili.common.vo.SerializableStream; -import cn.lili.modules.base.entity.dos.VerificationSource; -import cn.lili.modules.base.entity.vo.VerificationVO; -import cn.lili.modules.base.service.VerificationSourceService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.verification.SliderImageUtil; +import cn.lili.modules.verification.entity.dos.VerificationSource; +import cn.lili.modules.verification.entity.dto.VerificationDTO; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; +import cn.lili.modules.verification.service.VerificationSourceService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.List; @@ -32,13 +32,17 @@ import java.util.Random; */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class VerificationServiceImpl implements VerificationService { + @Autowired + private VerificationSourceService verificationSourceService; - private final VerificationSourceService verificationSourceService; - private final Cache cache; + @Autowired + private VerificationCodeProperties verificationCodeProperties; + + @Autowired + private Cache cache; /** * 创建校验 @@ -46,52 +50,61 @@ public class VerificationServiceImpl implements VerificationService { * @return 验证码参数 */ @Override - public Map createVerification(VerificationEnums verificationEnums, String uuid) throws IOException { + public Map createVerification(VerificationEnums verificationEnums, String uuid) { if (uuid == null) { - throw new ServiceException("非法请求,请重新刷新页面操作"); + throw new ServiceException(ResultCode.ILLEGAL_REQUEST_ERROR); } //获取验证码配置 - VerificationVO verificationVO = verificationSourceService.getVerificationCache(); + VerificationDTO verificationDTO = verificationSourceService.getVerificationCache(); - List verificationResources = verificationVO.getVerificationResources(); - List verificationSlider = verificationVO.getVerificationSlider(); + List verificationResources = verificationDTO.getVerificationResources(); + List verificationSlider = verificationDTO.getVerificationSlider(); Random random = new Random(); - // 随机选择需要切的图下标 + //随机选择需要切的图下标 int resourceNum = random.nextInt(verificationResources.size()); - // 随机选择剪切模版下标 + //随机选择剪切模版下标 int sliderNum = random.nextInt(verificationSlider.size()); - // 随机选择需要切的图片地址 + //随机选择需要切的图片地址 String originalResource = verificationResources.get(resourceNum).getResource(); - // 随机选择剪切模版图片地址 + //随机选择剪切模版图片地址 String sliderResource = verificationSlider.get(sliderNum).getResource(); + // 干扰块 + String interfereResource = verificationSlider.get(sliderNum == verificationSlider.size() - 1 ? + sliderNum - 1 : sliderNum + 1).getResource(); try { //获取缓存中的资源 SerializableStream originalFile = getInputStream(originalResource); SerializableStream sliderFile = getInputStream(sliderResource); - Map resultMap = SliderImageUtil.pictureTemplatesCut(sliderFile, originalFile); - // 生成验证参数 120可以验证 无需手动清除,120秒有效时间自动清除 - cache.put(cacheKey(verificationEnums, uuid), resultMap.get("randomX"), 120L); + SerializableStream interfereSliderFile = verificationCodeProperties.getInterfereNum() > 0 ? getInputStream(interfereResource) : null; + //生成数据 + Map resultMap = SliderImageUtil.pictureTemplatesCut( + sliderFile, interfereSliderFile, originalFile, + verificationCodeProperties.getWatermark(), verificationCodeProperties.getInterfereNum()); + //生成验证参数 有效时间 默认600秒,可以自行配置 + cache.put(cacheKey(verificationEnums, uuid), resultMap.get("randomX"), verificationCodeProperties.getEffectiveTime()); resultMap.put("key", cacheKey(verificationEnums, uuid)); - // 移除横坐标移动距离 + resultMap.put("effectiveTime", verificationCodeProperties.getEffectiveTime()); + //移除横坐标移动距离 resultMap.remove("randomX"); return resultMap; } catch (ServiceException e) { throw e; } catch (Exception e) { - e.printStackTrace(); - return null; + log.error("生成验证码失败", e); + throw new ServiceException(ResultCode.ERROR); } } /** * 根据网络地址,获取源文件 * 这里简单说一下,这里是将不可序列化的inputstream序列化对象,存入redis缓存 + * * @param originalResource * @return */ @@ -122,17 +135,16 @@ public class VerificationServiceImpl implements VerificationService { public boolean preCheck(Integer xPos, String uuid, VerificationEnums verificationEnums) { Integer randomX = (Integer) cache.get(cacheKey(verificationEnums, uuid)); if (randomX == null) { - return false; + throw new ServiceException(ResultCode.VERIFICATION_CODE_INVALID); } log.debug("{}{}", randomX, xPos); - //验证结果 - boolean result = Math.abs(randomX - xPos) < 3; - if (result) { - //验证成功,则记录验证结果 验证有效时间,120秒 - cache.put(cacheResult(verificationEnums, uuid), true, 120L); - return result; + //验证结果正确 && 删除标记成功 + if (Math.abs(randomX - xPos) < verificationCodeProperties.getFaultTolerant() && cache.remove(cacheKey(verificationEnums, uuid))) { + //验证成功,则记录验证结果 验证有效时间与验证码创建有效时间一致 + cache.put(cacheResult(verificationEnums, uuid), true, verificationCodeProperties.getEffectiveTime()); + return true; } - return false; + throw new ServiceException(ResultCode.VERIFICATION_ERROR); } /** @@ -144,13 +156,11 @@ public class VerificationServiceImpl implements VerificationService { */ @Override public boolean check(String uuid, VerificationEnums verificationEnums) { - Object object = cache.get(cacheResult(verificationEnums, uuid)); - if (object == null) { - return false; - } else { - cache.remove(cacheResult(verificationEnums, uuid)); + //如果有校验标记,则返回校验结果 + if (Boolean.TRUE.equals(cache.remove(cacheResult(verificationEnums, uuid)))) { return true; } + throw new ServiceException(ResultCode.VERIFICATION_CODE_INVALID); } /** @@ -176,3 +186,4 @@ public class VerificationServiceImpl implements VerificationService { } } + diff --git a/framework/src/main/java/cn/lili/modules/verification/service/impl/VerificationSourceServiceImpl.java b/framework/src/main/java/cn/lili/modules/verification/service/impl/VerificationSourceServiceImpl.java new file mode 100644 index 00000000..94454e8b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/verification/service/impl/VerificationSourceServiceImpl.java @@ -0,0 +1,60 @@ +package cn.lili.modules.verification.service.impl; + +import cn.lili.cache.Cache; +import cn.lili.modules.system.mapper.VerificationSourceMapper; +import cn.lili.modules.verification.entity.dos.VerificationSource; +import cn.lili.modules.verification.entity.dto.VerificationDTO; +import cn.lili.modules.verification.entity.enums.VerificationSourceEnum; +import cn.lili.modules.verification.service.VerificationSourceService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 验证码资源维护 业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:48 下午 + */ +@Service +public class VerificationSourceServiceImpl extends ServiceImpl implements VerificationSourceService { + + @Autowired + private Cache cache; + + @Override + public VerificationDTO initCache() { + List dbList = this.list(); + List resourceList = new ArrayList<>(); + List sliderList = new ArrayList<>(); + for (VerificationSource item : dbList) { + if (item.getType().equals(VerificationSourceEnum.RESOURCE.name())) { + resourceList.add(item); + } else if (item.getType().equals(VerificationSourceEnum.SLIDER.name())) { + sliderList.add(item); + } + } + VerificationDTO verificationDTO = new VerificationDTO(); + verificationDTO.setVerificationResources(resourceList); + verificationDTO.setVerificationSlider(sliderList); + cache.put(VERIFICATION_CACHE, verificationDTO); + return verificationDTO; + } + + @Override + public VerificationDTO getVerificationCache() { + VerificationDTO verificationDTO; + try { + verificationDTO = cache.get(VERIFICATION_CACHE); + } catch (ClassCastException cce) { + verificationDTO = null; + } + if (verificationDTO == null || verificationDTO.getVerificationResources().size() <= 0 || verificationDTO.getVerificationSlider().size() <= 0) { + return initCache(); + } + return verificationDTO; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberWallet.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWallet.java similarity index 79% rename from framework/src/main/java/cn/lili/modules/member/entity/dos/MemberWallet.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWallet.java index cf7c3a35..cf9fdfe8 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberWallet.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWallet.java @@ -1,23 +1,19 @@ -package cn.lili.modules.member.entity.dos; +package cn.lili.modules.wallet.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 会员预存款 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_wallet") @TableName("li_member_wallet") @ApiModel(value = "会员预存款") public class MemberWallet extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberWithdrawApply.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWithdrawApply.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/member/entity/dos/MemberWithdrawApply.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWithdrawApply.java index 5d3a779c..ac54ce73 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberWithdrawApply.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/MemberWithdrawApply.java @@ -1,6 +1,9 @@ -package cn.lili.modules.member.entity.dos; +package cn.lili.modules.wallet.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -10,19 +13,15 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Entity; -import javax.persistence.Table; import java.util.Date; /** * 会员提现申请 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_member_withdraw_apply") @TableName("li_member_withdraw_apply") @ApiModel(value = "会员提现申请") public class MemberWithdrawApply extends BaseEntity { @@ -32,6 +31,9 @@ public class MemberWithdrawApply extends BaseEntity { @ApiModelProperty(value = "申请提现金额") private Double applyMoney; + /** + * @see WithdrawStatusEnum + */ @ApiModelProperty(value = "提现状态") private String applyStatus; @@ -39,18 +41,36 @@ public class MemberWithdrawApply extends BaseEntity { private String memberId; @ApiModelProperty(value = "会员名称") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; @ApiModelProperty(value = "审核备注") private String inspectRemark; - @ApiModelProperty(value="审核时间") + @ApiModelProperty(value = "审核时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) private Date inspectTime; - @ApiModelProperty(value="sn") + @ApiModelProperty(value = "sn") private String sn; + /** + * 支付宝提现时必填 + */ + @ApiModelProperty(value = "真实姓名") + private String realName; + /** + * 支付宝登录账号 + */ + @ApiModelProperty(value = "第三方平台账号") + private String connectNumber; + + /** + * 支付宝登录账号 + */ + @ApiModelProperty(value = "第三方错误消息") + private String errorMessage; + } diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/Recharge.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/Recharge.java similarity index 85% rename from framework/src/main/java/cn/lili/modules/order/trade/entity/dos/Recharge.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/dos/Recharge.java index 8e039c55..7b615985 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/Recharge.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/Recharge.java @@ -1,9 +1,11 @@ -package cn.lili.modules.order.trade.entity.dos; +package cn.lili.modules.wallet.entity.dos; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -15,10 +17,6 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import java.util.Date; @@ -26,26 +24,17 @@ import java.util.Date; * 预存款充值记录 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_recharge") @TableName("li_recharge") @ApiModel(value = "预存款充值记录") @AllArgsConstructor @NoArgsConstructor -public class Recharge { +public class Recharge extends BaseIdEntity { private static final long serialVersionUID = -1529240544327161096L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建者", hidden = true) @@ -65,6 +54,7 @@ public class Recharge { private String memberId; @ApiModelProperty(value = "会员名称") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; @NotEmpty(message = "充值金额不能为空") diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/WalletLog.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/WalletLog.java similarity index 52% rename from framework/src/main/java/cn/lili/modules/order/trade/entity/dos/WalletLog.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/dos/WalletLog.java index 8508af4e..12bbf793 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/dos/WalletLog.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dos/WalletLog.java @@ -1,8 +1,12 @@ -package cn.lili.modules.order.trade.entity.dos; +package cn.lili.modules.wallet.entity.dos; +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; +import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum; +import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -13,63 +17,38 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; import java.util.Date; /** * 预存款日志实体 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data -@Entity -@Table(name = "li_wallet_log") @TableName("li_wallet_log") @ApiModel(value = "钱包变动日志") @NoArgsConstructor -public class WalletLog { +public class WalletLog extends BaseIdEntity { private static final long serialVersionUID = -1599270544927161096L; - @Id - @TableId - @TableField - @Column(columnDefinition = "bigint(20)") - @ApiModelProperty(value = "唯一标识", hidden = true) - private String id; - - /** - * 会员id - */ @ApiModelProperty(value = "会员id") private String memberId; - /** - * 会员名称 - */ @ApiModelProperty(value = "会员名称") + @Sensitive(strategy = SensitiveStrategy.PHONE) private String memberName; - /** - * 金额 - */ + @ApiModelProperty(value = "金额") private Double money; /** - * 变动业务类型 - * - * @see cn.lili.modules.order.trade.entity.enums.DepositServiceTypeEnum + * @see DepositServiceTypeEnum */ @ApiModelProperty(value = "业务类型") private String serviceType; - /** - * 日志明细 - */ @ApiModelProperty(value = "日志明细") private String detail; @@ -89,17 +68,30 @@ public class WalletLog { /** * 构建新的预存款日志对象 * - * @param memberId 会员id - * @param memberName 会员名称 - * @param money 金额 - * @param detail 备注 + * @param memberName 会员名称 + * @param memberWalletUpdateDTO 变动模型 */ - public WalletLog(String memberId, String memberName, Double money, String detail, String serviceType) { - this.setMemberId(memberId); + public WalletLog(String memberName, MemberWalletUpdateDTO memberWalletUpdateDTO) { + this.setMemberId(memberWalletUpdateDTO.getMemberId()); this.setMemberName(memberName); - this.setMoney(money); - this.setDetail(detail); - this.setServiceType(serviceType); + this.setMoney(memberWalletUpdateDTO.getMoney()); + this.setDetail(memberWalletUpdateDTO.getDetail()); + this.setServiceType(memberWalletUpdateDTO.getServiceType()); + } + + /** + * 构建新的预存款日志对象 + * + * @param memberName 会员名称 + * @param memberWalletUpdateDTO 变动模型 + * @param isReduce 是否是消费 + */ + public WalletLog(String memberName, MemberWalletUpdateDTO memberWalletUpdateDTO, boolean isReduce) { + this.setMemberId(memberWalletUpdateDTO.getMemberId()); + this.setMemberName(memberName); + this.setMoney(isReduce ? -memberWalletUpdateDTO.getMoney() : memberWalletUpdateDTO.getMoney()); + this.setDetail(memberWalletUpdateDTO.getDetail()); + this.setServiceType(memberWalletUpdateDTO.getServiceType()); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWalletUpdateDTO.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWalletUpdateDTO.java new file mode 100644 index 00000000..70d18c86 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWalletUpdateDTO.java @@ -0,0 +1,30 @@ +package cn.lili.modules.wallet.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 会员余额变动模型 + * + * @author Chopper + * @version v1.0 + * 2021-12-01 09:35 + */ +@Data +@AllArgsConstructor +public class MemberWalletUpdateDTO { + + @ApiModelProperty(value = "变动金额") + private Double money; + @ApiModelProperty(value = "变动会员id") + private String memberId; + @ApiModelProperty(value = "日志详情") + private String detail; + + /** + * @see cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum + */ + @ApiModelProperty(value = "变动业务原因") + private String serviceType; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberWithdrawalMessage.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWithdrawalMessage.java similarity index 55% rename from framework/src/main/java/cn/lili/modules/member/entity/dto/MemberWithdrawalMessage.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWithdrawalMessage.java index c12fc573..30a691f1 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberWithdrawalMessage.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/MemberWithdrawalMessage.java @@ -1,4 +1,4 @@ -package cn.lili.modules.member.entity.dto; +package cn.lili.modules.wallet.entity.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,20 +7,21 @@ import lombok.Data; * 会员提现消息 * * @author Bulbasaur - * @date 2020/12/14 16:31 + * @since 2020/12/14 16:31 */ @Data public class MemberWithdrawalMessage { + @ApiModelProperty(value = "提现申请ID") + private String memberWithdrawApplyId; + @ApiModelProperty(value = "金额") private Double price; @ApiModelProperty(value = "会员id") private String memberId; - /** - * @see cn.lili.modules.member.entity.enums.MemberWithdrawalDestinationEnum - */ - @ApiModelProperty(value = "提现到哪里") - private String destination; + @ApiModelProperty(value = "提现状态") + private String status; + } diff --git a/framework/src/main/java/cn/lili/modules/wallet/entity/dto/TransferResultDTO.java b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/TransferResultDTO.java new file mode 100644 index 00000000..fb672a1c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/dto/TransferResultDTO.java @@ -0,0 +1,24 @@ +package cn.lili.modules.wallet.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +/** + * 转账结果 + * + * @author liushuai(liushuai711 @ gmail.com) + * @version v4.0 + * @Description: + * @since 2023/5/6 16:10 + */ +@Data +@Builder +public class TransferResultDTO { + + @ApiModelProperty(value = "错误信息") + private String response; + @ApiModelProperty(value = "是否成功") + private Boolean result; + +} diff --git a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/DepositServiceTypeEnum.java b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/DepositServiceTypeEnum.java similarity index 88% rename from framework/src/main/java/cn/lili/modules/order/trade/entity/enums/DepositServiceTypeEnum.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/enums/DepositServiceTypeEnum.java index 51c8eaa7..ff6109df 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/entity/enums/DepositServiceTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/DepositServiceTypeEnum.java @@ -1,10 +1,10 @@ -package cn.lili.modules.order.trade.entity.enums; +package cn.lili.modules.wallet.entity.enums; /** * 预存款变动日志业务类型 * * @author Chopper - * @date 2020/8/20 15:39 + * @since 2020/8/20 15:39 */ public enum DepositServiceTypeEnum { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/enums/MemberWithdrawalDestinationEnum.java b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/MemberWithdrawalDestinationEnum.java similarity index 84% rename from framework/src/main/java/cn/lili/modules/member/entity/enums/MemberWithdrawalDestinationEnum.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/enums/MemberWithdrawalDestinationEnum.java index bdbbedee..1ebabf31 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/enums/MemberWithdrawalDestinationEnum.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/MemberWithdrawalDestinationEnum.java @@ -1,10 +1,10 @@ -package cn.lili.modules.member.entity.enums; +package cn.lili.modules.wallet.entity.enums; /** * 会员提现到哪里 枚举 * * @author Chopper - * @date 2021/3/20 10:44 + * @since 2021/3/20 10:44 */ public enum MemberWithdrawalDestinationEnum { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/enums/WithdrawStatusEnum.java b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/WithdrawStatusEnum.java similarity index 67% rename from framework/src/main/java/cn/lili/modules/member/entity/enums/WithdrawStatusEnum.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/enums/WithdrawStatusEnum.java index bb4ea569..d5f91e73 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/enums/WithdrawStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/enums/WithdrawStatusEnum.java @@ -1,10 +1,10 @@ -package cn.lili.modules.member.entity.enums; +package cn.lili.modules.wallet.entity.enums; /** * 提现申请状态枚举类 * * @author pikachu - * @date 2020-11-06 + * @since 2020-11-06 */ public enum WithdrawStatusEnum { /** @@ -18,7 +18,15 @@ public enum WithdrawStatusEnum { /** * 审核未通过 */ - FAIL_AUDITING("审核未通过"); + FAIL_AUDITING("审核未通过"), + /** + * 提现成功 + */ + SUCCESS("提现成功"), + /** + * 提现失败 + */ + ERROR("提现失败"); private String description; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberWalletVO.java b/framework/src/main/java/cn/lili/modules/wallet/entity/vo/MemberWalletVO.java similarity index 88% rename from framework/src/main/java/cn/lili/modules/member/entity/vo/MemberWalletVO.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/vo/MemberWalletVO.java index 257d7cbe..cc98aa60 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberWalletVO.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/vo/MemberWalletVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.member.entity.vo; +package cn.lili.modules.wallet.entity.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -11,7 +11,7 @@ import lombok.NoArgsConstructor; * 会员预存款VO * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data @ApiModel(value = "会员预存款") diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberWithdrawApplyQueryVO.java b/framework/src/main/java/cn/lili/modules/wallet/entity/vo/MemberWithdrawApplyQueryVO.java similarity index 94% rename from framework/src/main/java/cn/lili/modules/member/entity/vo/MemberWithdrawApplyQueryVO.java rename to framework/src/main/java/cn/lili/modules/wallet/entity/vo/MemberWithdrawApplyQueryVO.java index c3fd1e1c..99ffd599 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberWithdrawApplyQueryVO.java +++ b/framework/src/main/java/cn/lili/modules/wallet/entity/vo/MemberWithdrawApplyQueryVO.java @@ -1,4 +1,4 @@ -package cn.lili.modules.member.entity.vo; +package cn.lili.modules.wallet.entity.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -12,7 +12,7 @@ import java.io.Serializable; * 余额提现记录查询条件 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Data @ApiModel(value = "余额提现记录查询条件") diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberWalletMapper.java b/framework/src/main/java/cn/lili/modules/wallet/mapper/MemberWalletMapper.java similarity index 60% rename from framework/src/main/java/cn/lili/modules/member/mapper/MemberWalletMapper.java rename to framework/src/main/java/cn/lili/modules/wallet/mapper/MemberWalletMapper.java index 32290f8a..2c8a1450 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberWalletMapper.java +++ b/framework/src/main/java/cn/lili/modules/wallet/mapper/MemberWalletMapper.java @@ -1,14 +1,14 @@ -package cn.lili.modules.member.mapper; +package cn.lili.modules.wallet.mapper; -import cn.lili.modules.member.entity.dos.MemberWallet; +import cn.lili.modules.wallet.entity.dos.MemberWallet; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 会员预存款数据处理层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberWalletMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberWithdrawApplyMapper.java b/framework/src/main/java/cn/lili/modules/wallet/mapper/MemberWithdrawApplyMapper.java similarity index 61% rename from framework/src/main/java/cn/lili/modules/member/mapper/MemberWithdrawApplyMapper.java rename to framework/src/main/java/cn/lili/modules/wallet/mapper/MemberWithdrawApplyMapper.java index 7ebbf646..bf2addfc 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberWithdrawApplyMapper.java +++ b/framework/src/main/java/cn/lili/modules/wallet/mapper/MemberWithdrawApplyMapper.java @@ -1,14 +1,14 @@ -package cn.lili.modules.member.mapper; +package cn.lili.modules.wallet.mapper; -import cn.lili.modules.member.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 会员提现申请数据处理层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberWithdrawApplyMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/order/trade/mapper/RechargeMapper.java b/framework/src/main/java/cn/lili/modules/wallet/mapper/RechargeMapper.java similarity index 59% rename from framework/src/main/java/cn/lili/modules/order/trade/mapper/RechargeMapper.java rename to framework/src/main/java/cn/lili/modules/wallet/mapper/RechargeMapper.java index b3af0ac9..fba8eeed 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/mapper/RechargeMapper.java +++ b/framework/src/main/java/cn/lili/modules/wallet/mapper/RechargeMapper.java @@ -1,13 +1,13 @@ -package cn.lili.modules.order.trade.mapper; +package cn.lili.modules.wallet.mapper; -import cn.lili.modules.order.trade.entity.dos.Recharge; +import cn.lili.modules.wallet.entity.dos.Recharge; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 预存款充值记录数据处理层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface RechargeMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/order/trade/mapper/WalletLogMapper.java b/framework/src/main/java/cn/lili/modules/wallet/mapper/WalletLogMapper.java similarity index 58% rename from framework/src/main/java/cn/lili/modules/order/trade/mapper/WalletLogMapper.java rename to framework/src/main/java/cn/lili/modules/wallet/mapper/WalletLogMapper.java index 428698d8..61f2db7f 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/mapper/WalletLogMapper.java +++ b/framework/src/main/java/cn/lili/modules/wallet/mapper/WalletLogMapper.java @@ -1,13 +1,13 @@ -package cn.lili.modules.order.trade.mapper; +package cn.lili.modules.wallet.mapper; -import cn.lili.modules.order.trade.entity.dos.WalletLog; +import cn.lili.modules.wallet.entity.dos.WalletLog; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 预存款日志数据处理层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface WalletLogMapper extends BaseMapper { diff --git a/framework/src/main/java/cn/lili/modules/wallet/service/MemberWalletService.java b/framework/src/main/java/cn/lili/modules/wallet/service/MemberWalletService.java new file mode 100644 index 00000000..4b3a9349 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/wallet/service/MemberWalletService.java @@ -0,0 +1,107 @@ +package cn.lili.modules.wallet.service; + + +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.wallet.entity.dos.MemberWallet; +import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; +import cn.lili.modules.wallet.entity.vo.MemberWalletVO; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 会员预存款业务层 + * + * @author pikachu + * @since 2020-02-25 14:10:16 + */ +public interface MemberWalletService extends IService { + + /** + * 查询会员的预存款 + * + * @param memberId 会员id + * @return 会员预存款VO + */ + MemberWalletVO getMemberWallet(String memberId); + + /** + * 增加用户预存款余额 + * + * @param memberWalletUpdateDTO 变动模型 + * @return 返回增加结果 true:成功 false:失败 + */ + Boolean increase(MemberWalletUpdateDTO memberWalletUpdateDTO); + + /** + * 从冻结金额到余额 + * + * @param memberWalletUpdateDTO 变动模型 + * @return 返回冻结结果 true:成功 false:失败 + */ + Boolean increaseWithdrawal(MemberWalletUpdateDTO memberWalletUpdateDTO); + + /** + * 扣减用户预存款余额 + * + * @param memberWalletUpdateDTO 变动模型 + * @return 操作状态 true:成功 false:失败 + */ + Boolean reduce(MemberWalletUpdateDTO memberWalletUpdateDTO); + + /** + * 提现扣减余额到冻结金额 + * + * @param memberWalletUpdateDTO 变动模型 + * @return 操作状态 true:成功 false:失败 + */ + Boolean reduceWithdrawal(MemberWalletUpdateDTO memberWalletUpdateDTO); + + /** + * 提现扣减冻结金额 + * + * @param memberWalletUpdateDTO 变动模型 + * @return 操作状态 + */ + Boolean reduceFrozen(MemberWalletUpdateDTO memberWalletUpdateDTO); + + /** + * 设置支付密码 + * + * @param member 会员id + * @param password 支付密码 + */ + void setMemberWalletPassword(Member member, String password); + + /** + * 检查当前会员是否设置过预存款密码 + * + * @return 操作状态 + */ + Boolean checkPassword(); + + /** + * 会员注册添加会员余额钱包 + * + * @param memberId 会员id + * @param memberName 会员名称 + * @return 操作结果 + */ + MemberWallet save(String memberId, String memberName); + + /** + * 用户提现 + * + * @param price 提现金额 + * @param realName 真实姓名 + * @param connectNumber 第三方账号 + * @return 是否提现成功 + */ + Boolean applyWithdrawal(Double price, String realName, String connectNumber); + + /** + * 提现公共方法 + * + * @param withdrawApplyId 会员零钱提现Id + */ + void withdrawal(String withdrawApplyId); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberWithdrawApplyService.java b/framework/src/main/java/cn/lili/modules/wallet/service/MemberWithdrawApplyService.java similarity index 82% rename from framework/src/main/java/cn/lili/modules/member/service/MemberWithdrawApplyService.java rename to framework/src/main/java/cn/lili/modules/wallet/service/MemberWithdrawApplyService.java index cc4fecf6..95f2339c 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberWithdrawApplyService.java +++ b/framework/src/main/java/cn/lili/modules/wallet/service/MemberWithdrawApplyService.java @@ -1,9 +1,9 @@ -package cn.lili.modules.member.service; +package cn.lili.modules.wallet.service; import cn.lili.common.vo.PageVO; -import cn.lili.modules.member.entity.dos.MemberWithdrawApply; -import cn.lili.modules.member.entity.vo.MemberWithdrawApplyQueryVO; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.vo.MemberWithdrawApplyQueryVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * 会员提现申请业务层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface MemberWithdrawApplyService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/order/trade/service/RechargeService.java b/framework/src/main/java/cn/lili/modules/wallet/service/RechargeService.java similarity index 65% rename from framework/src/main/java/cn/lili/modules/order/trade/service/RechargeService.java rename to framework/src/main/java/cn/lili/modules/wallet/service/RechargeService.java index c8919ded..818b7ef9 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/service/RechargeService.java +++ b/framework/src/main/java/cn/lili/modules/wallet/service/RechargeService.java @@ -1,16 +1,16 @@ -package cn.lili.modules.order.trade.service; +package cn.lili.modules.wallet.service; import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.trade.entity.dos.Recharge; import cn.lili.modules.order.trade.entity.vo.RechargeQueryVO; +import cn.lili.modules.wallet.entity.dos.Recharge; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; /** - * 预存款充值记录业务层 + * 预存款充值业务层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface RechargeService extends IService { @@ -35,10 +35,11 @@ public interface RechargeService extends IService { /** * 支付成功 * - * @param sn 充值订单编号 - * @param receivableNo 流水no + * @param sn 充值订单编号 + * @param receivableNo 流水no + * @param paymentMethod 支付方式 */ - void paySuccess(String sn, String receivableNo); + void paySuccess(String sn, String receivableNo, String paymentMethod); /** * 根据充值订单号查询充值信息 @@ -48,4 +49,11 @@ public interface RechargeService extends IService { */ Recharge getRecharge(String sn); + /** + * 充值订单取消 + * + * @param sn 充值订单sn + */ + void rechargeOrderCancel(String sn); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/trade/service/WalletLogService.java b/framework/src/main/java/cn/lili/modules/wallet/service/WalletLogService.java similarity index 78% rename from framework/src/main/java/cn/lili/modules/order/trade/service/WalletLogService.java rename to framework/src/main/java/cn/lili/modules/wallet/service/WalletLogService.java index a83baece..4803c08c 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/service/WalletLogService.java +++ b/framework/src/main/java/cn/lili/modules/wallet/service/WalletLogService.java @@ -1,16 +1,16 @@ -package cn.lili.modules.order.trade.service; +package cn.lili.modules.wallet.service; import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.trade.entity.dos.WalletLog; import cn.lili.modules.order.trade.entity.vo.DepositQueryVO; +import cn.lili.modules.wallet.entity.dos.WalletLog; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; /** - * 预存款日志业务层 + * 钱包变动日志业务层 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ public interface WalletLogService extends IService { diff --git a/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java new file mode 100644 index 00000000..ac0c65e0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java @@ -0,0 +1,352 @@ +package cn.lili.modules.wallet.serviceimpl; + + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.common.utils.SnowFlake; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.payment.entity.enums.PaymentMethodEnum; +import cn.lili.modules.payment.kit.CashierSupport; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.WithdrawalSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import cn.lili.modules.wallet.entity.dos.MemberWallet; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.dos.WalletLog; +import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; +import cn.lili.modules.wallet.entity.dto.TransferResultDTO; +import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; +import cn.lili.modules.wallet.entity.vo.MemberWalletVO; +import cn.lili.modules.wallet.mapper.MemberWalletMapper; +import cn.lili.modules.wallet.service.MemberWalletService; +import cn.lili.modules.wallet.service.MemberWithdrawApplyService; +import cn.lili.modules.wallet.service.WalletLogService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.MemberTagsEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; + + +/** + * 会员余额业务层实现 + * + * @author pikachu + * @since 2020-02-25 14:10:16 + */ +@Service +public class MemberWalletServiceImpl extends ServiceImpl implements MemberWalletService { + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + /** + * 预存款日志 + */ + @Autowired + private WalletLogService walletLogService; + /** + * 设置 + */ + @Autowired + private SettingService settingService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; + /** + * 会员提现申请 + */ + @Autowired + private MemberWithdrawApplyService memberWithdrawApplyService; + @Autowired + private CashierSupport cashierSupport; + + @Override + public MemberWalletVO getMemberWallet(String memberId) { + //构建查询条件 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("member_id", memberId); + //执行查询 + MemberWallet memberWallet = this.getOne(queryWrapper, false); + //如果没有钱包,则创建钱包 + if (memberWallet == null) { + memberWallet = this.save(memberId, memberService.getById(memberId).getUsername()); + } + //返回查询数据 + return new MemberWalletVO(memberWallet.getMemberWallet(), memberWallet.getMemberFrozenWallet()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean increaseWithdrawal(MemberWalletUpdateDTO memberWalletUpdateDTO) { + //检测会员预存款讯息是否存在,如果不存在则新建 + MemberWallet memberWallet = this.checkMemberWallet(memberWalletUpdateDTO.getMemberId()); + //余额变动 + memberWallet.setMemberWallet(CurrencyUtil.add(memberWallet.getMemberWallet(), memberWalletUpdateDTO.getMoney())); + memberWallet.setMemberFrozenWallet(CurrencyUtil.sub(memberWallet.getMemberFrozenWallet(), memberWalletUpdateDTO.getMoney())); + this.updateById(memberWallet); + //新增预存款日志 + WalletLog walletLog = new WalletLog(memberWallet.getMemberName(), memberWalletUpdateDTO); + walletLogService.save(walletLog); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean increase(MemberWalletUpdateDTO memberWalletUpdateDTO) { + //检测会员预存款讯息是否存在,如果不存在则新建 + MemberWallet memberWallet = this.checkMemberWallet(memberWalletUpdateDTO.getMemberId()); + //新增预存款 + memberWallet.setMemberWallet(CurrencyUtil.add(memberWallet.getMemberWallet(), memberWalletUpdateDTO.getMoney())); + this.baseMapper.updateById(memberWallet); + //新增预存款日志 + WalletLog walletLog = new WalletLog(memberWallet.getMemberName(), memberWalletUpdateDTO); + walletLogService.save(walletLog); + return true; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean reduce(MemberWalletUpdateDTO memberWalletUpdateDTO) { + //检测会员预存款讯息是否存在,如果不存在则新建 + MemberWallet memberWallet = this.checkMemberWallet(memberWalletUpdateDTO.getMemberId()); + //减少预存款,需要校验 如果不够扣减预存款 + if (0 > CurrencyUtil.sub(memberWallet.getMemberWallet(), memberWalletUpdateDTO.getMoney())) { + return false; + } + memberWallet.setMemberWallet(CurrencyUtil.sub(memberWallet.getMemberWallet(), memberWalletUpdateDTO.getMoney())); + //保存记录 + this.updateById(memberWallet); + //新增预存款日志 + WalletLog walletLog = new WalletLog(memberWallet.getMemberName(), memberWalletUpdateDTO, true); + walletLogService.save(walletLog); + return true; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean reduceWithdrawal(MemberWalletUpdateDTO memberWalletUpdateDTO) { + //检测会员预存款讯息是否存在,如果不存在则新建 + MemberWallet memberWallet = this.checkMemberWallet(memberWalletUpdateDTO.getMemberId()); + //减少预存款,需要校验 如果不够扣减预存款 + if (0 > CurrencyUtil.sub(memberWallet.getMemberWallet(), memberWalletUpdateDTO.getMoney())) { + throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_INSUFFICIENT); + } + memberWallet.setMemberWallet(CurrencyUtil.sub(memberWallet.getMemberWallet(), memberWalletUpdateDTO.getMoney())); + memberWallet.setMemberFrozenWallet(CurrencyUtil.add(memberWallet.getMemberFrozenWallet(), memberWalletUpdateDTO.getMoney())); + //修改余额 + this.updateById(memberWallet); + //新增预存款日志 + WalletLog walletLog = new WalletLog(memberWallet.getMemberName(), memberWalletUpdateDTO, true); + walletLogService.save(walletLog); + return true; + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean reduceFrozen(MemberWalletUpdateDTO memberWalletUpdateDTO) { + //检测会员预存款讯息是否存在,如果不存在则新建 + MemberWallet memberWallet = this.checkMemberWallet(memberWalletUpdateDTO.getMemberId()); + //校验此金额是否超过冻结金额 + if (0 > CurrencyUtil.sub(memberWallet.getMemberFrozenWallet(), memberWalletUpdateDTO.getMoney())) { + throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_FROZEN_AMOUNT_INSUFFICIENT); + } + memberWallet.setMemberFrozenWallet(CurrencyUtil.sub(memberWallet.getMemberFrozenWallet(), memberWalletUpdateDTO.getMoney())); + this.updateById(memberWallet); + //新增预存款日志 + WalletLog walletLog = new WalletLog(memberWallet.getMemberName(), memberWalletUpdateDTO, true); + walletLogService.save(walletLog); + return true; + } + + /** + * 检测会员预存款是否存在,如果不存在则新建 + * + * @param memberId 会员id + */ + private MemberWallet checkMemberWallet(String memberId) { + //获取会员预存款信息 + MemberWallet memberWallet = this.getOne(new QueryWrapper().eq("member_id", memberId), false); + //如果会员预存款信息不存在则同步重新建立预存款信息 + if (memberWallet == null) { + Member member = memberService.getById(memberId); + if (member != null) { + memberWallet = this.save(memberId, member.getUsername()); + } else { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + } + return memberWallet; + } + + @Override + public void setMemberWalletPassword(Member member, String password) { + //对密码进行加密 + String pwd = new BCryptPasswordEncoder().encode(password); + //校验会员预存款是否存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("member_id", member.getId()); + MemberWallet memberWallet = this.getOne(queryWrapper); + //如果 预存款信息不为空 执行设置密码 + if (memberWallet != null) { + memberWallet.setWalletPassword(pwd); + this.updateById(memberWallet); + } + } + + + @Override + public Boolean checkPassword() { + //获取当前登录会员 + AuthUser authUser = UserContext.getCurrentUser(); + //构建查询条件 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("member_id", authUser.getId()); + MemberWallet wallet = this.getOne(queryWrapper); + return wallet != null && !StringUtils.isEmpty(wallet.getWalletPassword()); + } + + @Override + public MemberWallet save(String memberId, String memberName) { + //获取会员预存款信息 + MemberWallet memberWallet = this.getOne(new QueryWrapper().eq("member_id", memberId)); + if (memberWallet != null) { + return memberWallet; + } + memberWallet = new MemberWallet(); + memberWallet.setMemberId(memberId); + memberWallet.setMemberName(memberName); + memberWallet.setMemberWallet(0D); + memberWallet.setMemberFrozenWallet(0D); + this.save(memberWallet); + return memberWallet; + } + + /** + * 提现方法 + * 1、提现申请冻结用户的余额。 + * 2、判断是否需要平台审核。不需要审核则直接调用第三方提现,需要审核则审核通过后调用第三方提现 + * + * @param price 提现金额 + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean applyWithdrawal(Double price, String realName, String connectNumber) { + + if (price == null || price <= 0 || price > 1000000) { + throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_AMOUNT_ERROR); + } + AuthUser authUser = UserContext.getCurrentUser(); + + //校验金额是否满足提现,因为是从余额扣减,所以校验的是余额 + MemberWalletVO memberWalletVO = this.getMemberWallet(authUser.getId()); + if (memberWalletVO.getMemberWallet() < price) { + throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_INSUFFICIENT); + } + //获取提现设置 + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()); + WithdrawalSetting withdrawalSetting = new Gson().fromJson(setting.getSettingValue(), WithdrawalSetting.class); + + //判断金额是否小于最低提现金额 + if (price < withdrawalSetting.getMinPrice()) { + throw new ServiceException(ResultCode.WALLET_APPLY_MIN_PRICE_ERROR.message()); + } + + //构建审核参数 + MemberWithdrawApply memberWithdrawApply = new MemberWithdrawApply(); + memberWithdrawApply.setMemberId(authUser.getId()); + memberWithdrawApply.setMemberName(authUser.getNickName()); + memberWithdrawApply.setApplyMoney(price); + memberWithdrawApply.setRealName(realName); + memberWithdrawApply.setConnectNumber(connectNumber); + + //判断提现是否需要审核 + if (withdrawalSetting.getApply()) { + memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.APPLY.name()); + } else { + memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.VIA_AUDITING.name()); + } + + memberWithdrawApply.setSn("W" + SnowFlake.getId()); + + //添加提现申请记录 + memberWithdrawApplyService.save(memberWithdrawApply); + + //扣减余额到冻结金额 + this.reduceWithdrawal(new MemberWalletUpdateDTO(price, authUser.getId(), "提现金额已冻结", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name())); + + //发送余额提现申请消息 + MemberWithdrawalMessage memberWithdrawalMessage = new MemberWithdrawalMessage(); + memberWithdrawalMessage.setMemberWithdrawApplyId(memberWithdrawApply.getId()); + memberWithdrawalMessage.setStatus(memberWithdrawApply.getApplyStatus()); + memberWithdrawalMessage.setMemberId(authUser.getId()); + memberWithdrawalMessage.setPrice(price); + String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_WITHDRAWAL.name(); + rocketMQTemplate.asyncSend(destination, memberWithdrawalMessage, RocketmqSendCallbackBuilder.commonCallback()); + + return true; + } + + @Override + public void withdrawal(String withdrawApplyId) { + MemberWithdrawApply memberWithdrawApply = memberWithdrawApplyService.getById(withdrawApplyId); + memberWithdrawApply.setInspectTime(new Date()); + //获取提现设置 + Setting setting = settingService.get(SettingEnum.WITHDRAWAL_SETTING.name()); + WithdrawalSetting withdrawalSetting = new Gson().fromJson(setting.getSettingValue(), WithdrawalSetting.class); + + //调用提现方法 + TransferResultDTO transferResultDTO = "WECHAT".equals(withdrawalSetting.getType()) ? + cashierSupport.transfer(PaymentMethodEnum.WECHAT, memberWithdrawApply) : cashierSupport.transfer(PaymentMethodEnum.ALIPAY, + memberWithdrawApply); + + //成功则扣减冻结金额 + //失败则恢复冻结金额 + + if (transferResultDTO.getResult()) { + memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.SUCCESS.name()); + } else { + memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.ERROR.name()); + memberWithdrawApply.setErrorMessage(transferResultDTO.getResponse()); + } + //修改提现申请 + this.memberWithdrawApplyService.updateById(memberWithdrawApply); + + //发送余额提现申请消息 + MemberWithdrawalMessage memberWithdrawalMessage = new MemberWithdrawalMessage(); + memberWithdrawalMessage.setMemberWithdrawApplyId(memberWithdrawApply.getId()); + memberWithdrawalMessage.setStatus(memberWithdrawApply.getApplyStatus()); + memberWithdrawalMessage.setMemberId(memberWithdrawApply.getMemberId()); + memberWithdrawalMessage.setPrice(memberWithdrawApply.getApplyMoney()); + memberWithdrawalMessage.setStatus(memberWithdrawApply.getApplyStatus()); + + String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_WITHDRAWAL.name(); + rocketMQTemplate.asyncSend(destination, memberWithdrawalMessage, RocketmqSendCallbackBuilder.commonCallback()); + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberWithdrawApplyServiceImpl.java b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWithdrawApplyServiceImpl.java similarity index 50% rename from framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberWithdrawApplyServiceImpl.java rename to framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWithdrawApplyServiceImpl.java index 7fc4ced0..2438e18f 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberWithdrawApplyServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWithdrawApplyServiceImpl.java @@ -1,23 +1,26 @@ -package cn.lili.modules.member.serviceimpl; +package cn.lili.modules.wallet.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.PageUtil; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; -import cn.lili.modules.member.entity.dos.MemberWithdrawApply; -import cn.lili.modules.member.entity.enums.WithdrawStatusEnum; -import cn.lili.modules.member.entity.vo.MemberWalletVO; -import cn.lili.modules.member.entity.vo.MemberWithdrawApplyQueryVO; -import cn.lili.modules.member.mapper.MemberWithdrawApplyMapper; -import cn.lili.modules.member.service.MemberWalletService; -import cn.lili.modules.member.service.MemberWithdrawApplyService; -import cn.lili.modules.order.trade.entity.enums.DepositServiceTypeEnum; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage; +import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum; +import cn.lili.modules.wallet.entity.vo.MemberWalletVO; +import cn.lili.modules.wallet.entity.vo.MemberWithdrawApplyQueryVO; +import cn.lili.modules.wallet.mapper.MemberWithdrawApplyMapper; +import cn.lili.modules.wallet.service.MemberWalletService; +import cn.lili.modules.wallet.service.MemberWithdrawApplyService; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.MemberTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,52 +32,58 @@ import java.util.Date; * 会员提现申请业务层实现 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberWithdrawApplyServiceImpl extends ServiceImpl implements MemberWithdrawApplyService { - //提现申请数据层 - private final MemberWithdrawApplyMapper memberWithdrawApplyMapper; - //会员余额 - private final MemberWalletService memberWalletService; + + @Autowired + private RocketMQTemplate rocketMQTemplate; + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + /** + * 会员余额 + */ + @Autowired + private MemberWalletService memberWalletService; @Override + @Transactional(rollbackFor = Exception.class) public Boolean audit(String applyId, Boolean result, String remark) { + MemberWithdrawalMessage memberWithdrawalMessage = new MemberWithdrawalMessage(); //查询申请记录 - MemberWithdrawApply memberWithdrawApply = memberWithdrawApplyMapper.selectById(applyId); + MemberWithdrawApply memberWithdrawApply = this.getById(applyId); memberWithdrawApply.setInspectRemark(remark); + memberWithdrawApply.setInspectTime(new Date()); if (memberWithdrawApply != null) { - //如果审核通过 则微信直接提现,反之则记录审核状态 - if (result) { - //校验金额是否满足提现,因为是从冻结金额扣减,所以校验的是冻结金额 - MemberWalletVO memberWalletVO = memberWalletService.getMemberWallet(memberWithdrawApply.getMemberId()); - if (memberWalletVO.getMemberFrozenWallet() < memberWithdrawApply.getApplyMoney()) { - throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_INSUFFICIENT); - } - memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.VIA_AUDITING.name()); - //保存审核记录 - memberWithdrawApplyMapper.updateById(memberWithdrawApply); - //提现,微信提现成功后扣减冻结金额 - Boolean bool = memberWalletService.withdrawal(memberWithdrawApply); - if (bool) { - memberWalletService.reduceFrozen(memberWithdrawApply.getApplyMoney(), memberWithdrawApply.getMemberId(), "审核通过,余额提现", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name()); - return true; - } - } else { - //如果审核拒绝 审核备注必填 - if (StringUtils.isEmpty(remark)) { - throw new ServiceException(ResultCode.WALLET_REMARK_ERROR); - } - memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.FAIL_AUDITING.name()); - memberWithdrawApplyMapper.updateById(memberWithdrawApply); - //需要从冻结金额扣减到余额 - memberWalletService.increaseWithdrawal(memberWithdrawApply.getApplyMoney(), memberWithdrawApply.getMemberId(), "审核拒绝,提现金额解冻到余额", DepositServiceTypeEnum.WALLET_WITHDRAWAL.name()); - return true; + //获取账户余额 + MemberWalletVO memberWalletVO = memberWalletService.getMemberWallet(memberWithdrawApply.getMemberId()); + //校验金额是否满足提现,因为是从冻结金额扣减,所以校验的是冻结金额 + if (memberWalletVO.getMemberFrozenWallet() < memberWithdrawApply.getApplyMoney()) { + throw new ServiceException(ResultCode.WALLET_WITHDRAWAL_FROZEN_AMOUNT_INSUFFICIENT); } + //如果审核通过 则微信直接提现,反之则记录审核状态 + if (Boolean.TRUE.equals(result)) { + memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.VIA_AUDITING.name()); + + } else { + memberWithdrawApply.setApplyStatus(WithdrawStatusEnum.FAIL_AUDITING.name()); + //保存修改审核记录 + this.updateById(memberWithdrawApply); + + } + //发送审核消息 + memberWithdrawalMessage.setStatus(memberWithdrawApply.getApplyStatus()); + memberWithdrawalMessage.setMemberWithdrawApplyId(memberWithdrawApply.getId()); + memberWithdrawalMessage.setMemberId(memberWithdrawApply.getMemberId()); + memberWithdrawalMessage.setPrice(memberWithdrawApply.getApplyMoney()); + + String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_WITHDRAWAL.name(); + rocketMQTemplate.asyncSend(destination, memberWithdrawalMessage, RocketmqSendCallbackBuilder.commonCallback()); + return true; } - throw new ServiceException(ResultCode.ERROR); + throw new ServiceException(ResultCode.WALLET_APPLY_ERROR); } @@ -98,6 +107,6 @@ public class MemberWithdrawApplyServiceImpl extends ServiceImpl implements RechargeService { - //预存款 - private final RechargeMapper rechargeMapper; - //会员预存款 + /** + * 会员预存款 + */ + @Autowired private MemberWalletService memberWalletService; @Override public Recharge recharge(Double price) { + + if (price == null || price <= 0 || price > 1000000) { + throw new ServiceException(ResultCode.RECHARGE_PRICE_ERROR); + } + //获取当前登录的会员 AuthUser authUser = UserContext.getCurrentUser(); //构建sn @@ -50,7 +54,7 @@ public class RechargeServiceImpl extends ServiceImpl i //整合充值订单数据 Recharge recharge = new Recharge(sn, authUser.getId(), authUser.getUsername(), price); //添加预存款充值账单 - this.rechargeMapper.insert(recharge); + this.save(recharge); //返回预存款 return recharge; } @@ -60,50 +64,56 @@ public class RechargeServiceImpl extends ServiceImpl i //构建查询条件 QueryWrapper queryWrapper = new QueryWrapper<>(); //会员名称 - queryWrapper.like(!StringUtils.isEmpty(rechargeQueryVO.getMemberName()), "member_name", rechargeQueryVO.getMemberName()); + queryWrapper.like(!CharSequenceUtil.isEmpty(rechargeQueryVO.getMemberName()), "member_name", rechargeQueryVO.getMemberName()); //充值订单号 - queryWrapper.eq(!StringUtils.isEmpty(rechargeQueryVO.getRechargeSn()), "recharge_sn", rechargeQueryVO.getRechargeSn()); + queryWrapper.eq(!CharSequenceUtil.isEmpty(rechargeQueryVO.getRechargeSn()), "recharge_sn", rechargeQueryVO.getRechargeSn()); //会员id - queryWrapper.eq(!StringUtils.isEmpty(rechargeQueryVO.getMemberId()), "member_id", rechargeQueryVO.getMemberId()); - //已付款的充值订单 - queryWrapper.eq("pay_status", PayStatusEnum.PAID.name()); + queryWrapper.eq(!CharSequenceUtil.isEmpty(rechargeQueryVO.getMemberId()), "member_id", rechargeQueryVO.getMemberId()); //支付时间 开始时间和结束时间 - if (!StringUtils.isEmpty(rechargeQueryVO.getStartDate()) && !StringUtils.isEmpty(rechargeQueryVO.getEndDate())) { + if (!CharSequenceUtil.isEmpty(rechargeQueryVO.getStartDate()) && !CharSequenceUtil.isEmpty(rechargeQueryVO.getEndDate())) { Date start = cn.hutool.core.date.DateUtil.parse(rechargeQueryVO.getStartDate()); Date end = cn.hutool.core.date.DateUtil.parse(rechargeQueryVO.getEndDate()); queryWrapper.between("pay_time", start, end); } + queryWrapper.orderByDesc("create_time"); //查询返回数据 - return this.rechargeMapper.selectPage(PageUtil.initPage(page), queryWrapper); + return this.page(PageUtil.initPage(page), queryWrapper); } @Override - public void paySuccess(String sn, String receivableNo) { + public void paySuccess(String sn, String receivableNo, String paymentMethod) { //根据sn获取支付账单 - Recharge recharge = this.rechargeMapper.selectOne(new QueryWrapper().eq("recharge_sn", sn)); + Recharge recharge = this.getOne(new QueryWrapper().eq("recharge_sn", sn)); //如果支付账单不为空则进行一下逻辑 - if (recharge != null) { + if (recharge != null && !recharge.getPayStatus().equals(PayStatusEnum.PAID.name())) { //将此账单支付状态更改为已支付 recharge.setPayStatus(PayStatusEnum.PAID.name()); recharge.setReceivableNo(receivableNo); + recharge.setPayTime(new DateTime()); + recharge.setRechargeWay(paymentMethod); //执行保存操作 - this.rechargeMapper.updateById(recharge); + this.updateById(recharge); //增加预存款余额 - memberWalletService.increase(recharge.getRechargeMoney(), recharge.getMemberId(), "会员余额充值,充值单号为:" + recharge.getRechargeSn(), DepositServiceTypeEnum.WALLET_RECHARGE.name()); + memberWalletService.increase(new MemberWalletUpdateDTO(recharge.getRechargeMoney(), recharge.getMemberId(), "会员余额充值,充值单号为:" + recharge.getRechargeSn(), DepositServiceTypeEnum.WALLET_RECHARGE.name())); } } @Override public Recharge getRecharge(String sn) { - Recharge recharge = this.rechargeMapper.selectOne(new QueryWrapper().eq("recharge_sn", sn)); + Recharge recharge = this.getOne(new QueryWrapper().eq("recharge_sn", sn)); if (recharge != null) { return recharge; } throw new ServiceException(ResultCode.ORDER_NOT_EXIST); } - @Autowired - public void setMemberWalletService(MemberWalletService memberWalletService) { - this.memberWalletService = memberWalletService; + + @Override + public void rechargeOrderCancel(String sn) { + Recharge recharge = this.getOne(new QueryWrapper().eq("recharge_sn", sn)); + if (recharge != null) { + recharge.setPayStatus(PayStatusEnum.CANCEL.name()); + this.updateById(recharge); + } } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/WalletLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/WalletLogServiceImpl.java similarity index 50% rename from framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/WalletLogServiceImpl.java rename to framework/src/main/java/cn/lili/modules/wallet/serviceimpl/WalletLogServiceImpl.java index 991116ea..f3a53b17 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/WalletLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/WalletLogServiceImpl.java @@ -1,19 +1,16 @@ -package cn.lili.modules.order.trade.serviceimpl; +package cn.lili.modules.wallet.serviceimpl; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.vo.PageVO; -import cn.lili.modules.order.trade.entity.dos.WalletLog; import cn.lili.modules.order.trade.entity.vo.DepositQueryVO; -import cn.lili.modules.order.trade.mapper.WalletLogMapper; -import cn.lili.modules.order.trade.service.WalletLogService; +import cn.lili.modules.wallet.entity.dos.WalletLog; +import cn.lili.modules.wallet.mapper.WalletLogMapper; +import cn.lili.modules.wallet.service.WalletLogService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.Date; @@ -21,30 +18,26 @@ import java.util.Date; * 预存款日志业务层实现 * * @author pikachu - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @Service -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WalletLogServiceImpl extends ServiceImpl implements WalletLogService { - private final WalletLogMapper walletLogMapper; - @Override public IPage depositLogPage(PageVO page, DepositQueryVO depositQueryVO) { //构建查询条件 QueryWrapper depositLogQueryWrapper = new QueryWrapper<>(); //会员名称 - depositLogQueryWrapper.like(!StringUtils.isEmpty(depositQueryVO.getMemberName()), "member_name", depositQueryVO.getMemberName()); + depositLogQueryWrapper.like(!CharSequenceUtil.isEmpty(depositQueryVO.getMemberName()), "member_name", depositQueryVO.getMemberName()); //会员id - depositLogQueryWrapper.eq(!StringUtils.isEmpty(depositQueryVO.getMemberId()), "member_id", depositQueryVO.getMemberId()); + depositLogQueryWrapper.eq(!CharSequenceUtil.isEmpty(depositQueryVO.getMemberId()), "member_id", depositQueryVO.getMemberId()); //开始时间和技术时间 - if (!StringUtils.isEmpty(depositQueryVO.getStartDate()) && !StringUtils.isEmpty(depositQueryVO.getEndDate())) { + if (!CharSequenceUtil.isEmpty(depositQueryVO.getStartDate()) && !CharSequenceUtil.isEmpty(depositQueryVO.getEndDate())) { Date start = cn.hutool.core.date.DateUtil.parse(depositQueryVO.getStartDate()); Date end = cn.hutool.core.date.DateUtil.parse(depositQueryVO.getEndDate()); depositLogQueryWrapper.between("create_time", start, end); } //查询返回数据 - return this.walletLogMapper.selectPage(PageUtil.initPage(page), depositLogQueryWrapper); + return this.page(PageUtil.initPage(page), depositLogQueryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/WechatMPMessage.java b/framework/src/main/java/cn/lili/modules/wechat/entity/dos/WechatMPMessage.java similarity index 83% rename from framework/src/main/java/cn/lili/modules/message/entity/dos/WechatMPMessage.java rename to framework/src/main/java/cn/lili/modules/wechat/entity/dos/WechatMPMessage.java index c1c059f1..4e1d530c 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/WechatMPMessage.java +++ b/framework/src/main/java/cn/lili/modules/wechat/entity/dos/WechatMPMessage.java @@ -1,20 +1,16 @@ -package cn.lili.modules.message.entity.dos; +package cn.lili.modules.wechat.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; - /** + * 微信小程序消息订阅 * @author Chopper */ @Data -@Entity -@Table(name = "li_wechat_mp_message") @TableName("li_wechat_mp_message") @ApiModel(value = "微信小程序消息订阅") public class WechatMPMessage extends BaseEntity { diff --git a/framework/src/main/java/cn/lili/modules/message/entity/dos/WechatMessage.java b/framework/src/main/java/cn/lili/modules/wechat/entity/dos/WechatMessage.java similarity index 83% rename from framework/src/main/java/cn/lili/modules/message/entity/dos/WechatMessage.java rename to framework/src/main/java/cn/lili/modules/wechat/entity/dos/WechatMessage.java index 2422fed7..6441be30 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/dos/WechatMessage.java +++ b/framework/src/main/java/cn/lili/modules/wechat/entity/dos/WechatMessage.java @@ -1,25 +1,21 @@ -package cn.lili.modules.message.entity.dos; +package cn.lili.modules.wechat.entity.dos; -import cn.lili.base.BaseEntity; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; /** * 微信消息 * * @author Chopper * @version v4.0 - * @Description: * @since 2020/12/10 17:02 */ @Data -@Entity -@Table(name = "li_wechat_message") @TableName("li_wechat_message") @ApiModel(value = "微信消息") public class WechatMessage extends BaseEntity { @@ -39,6 +35,9 @@ public class WechatMessage extends BaseEntity { @ApiModelProperty(value = "是否开启") private Boolean enable = true; + /** + * @see OrderStatusEnum + */ @ApiModelProperty("订单状态") private String orderStatus; diff --git a/framework/src/main/java/cn/lili/modules/message/entity/enums/WechatMessageItemEnums.java b/framework/src/main/java/cn/lili/modules/wechat/entity/enums/WechatMessageItemEnums.java similarity index 64% rename from framework/src/main/java/cn/lili/modules/message/entity/enums/WechatMessageItemEnums.java rename to framework/src/main/java/cn/lili/modules/wechat/entity/enums/WechatMessageItemEnums.java index fd9905cf..9d1697ec 100644 --- a/framework/src/main/java/cn/lili/modules/message/entity/enums/WechatMessageItemEnums.java +++ b/framework/src/main/java/cn/lili/modules/wechat/entity/enums/WechatMessageItemEnums.java @@ -1,4 +1,4 @@ -package cn.lili.modules.message.entity.enums; +package cn.lili.modules.wechat.entity.enums; /** * 微信模版设置变量 @@ -8,20 +8,42 @@ package cn.lili.modules.message.entity.enums; * 2020-12-10 17:47 */ public enum WechatMessageItemEnums { + /** + * 商户名称 + */ SHOP_NAME(new String[]{"商户名称"}), + /** + * 买家昵称 + */ MEMBER_NAME(new String[]{"买家昵称"}), + /** + * 订单金额 + */ PRICE(new String[]{"支付金额","订单金额"}), - + /** + * 订单详情 + */ GOODS_INFO(new String[]{"订单详情","商品清单","商品名称"}), - + /** + * 订单编号 + */ ORDER_SN(new String[]{"订单编号"}), - - + /** + * 快递公司 + */ LOGISTICS_NAME(new String[]{"快递公司"}), + /** + * 快递单号 + */ LOGISTICS_NO(new String[]{"快递单号"}), - + /** + * 发货时间 + */ LOGISTICS_TIME(new String[]{"发货时间"}), - PAYMENT_TIME(new String[]{"支付时间"}), + /** + * 支付时间 + */ + PAYMENT_TIME(new String[]{"支付时间"}) ; /** diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/WechatMPMessageMapper.java b/framework/src/main/java/cn/lili/modules/wechat/mapper/WechatMPMessageMapper.java similarity index 67% rename from framework/src/main/java/cn/lili/modules/message/mapper/WechatMPMessageMapper.java rename to framework/src/main/java/cn/lili/modules/wechat/mapper/WechatMPMessageMapper.java index 55e7e92d..5adbf322 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/WechatMPMessageMapper.java +++ b/framework/src/main/java/cn/lili/modules/wechat/mapper/WechatMPMessageMapper.java @@ -1,15 +1,19 @@ -package cn.lili.modules.message.mapper; +package cn.lili.modules.wechat.mapper; +import cn.lili.modules.wechat.entity.dos.WechatMPMessage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import cn.lili.modules.message.entity.dos.WechatMPMessage; import org.apache.ibatis.annotations.Delete; /** * 微信小程序消息订阅 Dao层 + * * @author Chopper */ public interface WechatMPMessageMapper extends BaseMapper { + /** + * 删除微信服务消息 + */ @Delete("delete from li_wechat_mp_message") void deleteAll(); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/mapper/WechatMessageMapper.java b/framework/src/main/java/cn/lili/modules/wechat/mapper/WechatMessageMapper.java similarity index 67% rename from framework/src/main/java/cn/lili/modules/message/mapper/WechatMessageMapper.java rename to framework/src/main/java/cn/lili/modules/wechat/mapper/WechatMessageMapper.java index e71e5e1c..1beb733a 100644 --- a/framework/src/main/java/cn/lili/modules/message/mapper/WechatMessageMapper.java +++ b/framework/src/main/java/cn/lili/modules/wechat/mapper/WechatMessageMapper.java @@ -1,15 +1,19 @@ -package cn.lili.modules.message.mapper; +package cn.lili.modules.wechat.mapper; -import cn.lili.modules.message.entity.dos.WechatMessage; +import cn.lili.modules.wechat.entity.dos.WechatMessage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Delete; /** * 微信消息 Dao层 + * * @author Chopper */ public interface WechatMessageMapper extends BaseMapper { + /** + * 删除微信消息 + */ @Delete("delete from li_wechat_message") void deleteAll(); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/service/WechatMPMessageService.java b/framework/src/main/java/cn/lili/modules/wechat/service/WechatMPMessageService.java similarity index 73% rename from framework/src/main/java/cn/lili/modules/message/service/WechatMPMessageService.java rename to framework/src/main/java/cn/lili/modules/wechat/service/WechatMPMessageService.java index 05b2aef8..eeccfd5c 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/WechatMPMessageService.java +++ b/framework/src/main/java/cn/lili/modules/wechat/service/WechatMPMessageService.java @@ -1,7 +1,7 @@ -package cn.lili.modules.message.service; +package cn.lili.modules.wechat.service; +import cn.lili.modules.wechat.entity.dos.WechatMPMessage; import com.baomidou.mybatisplus.extension.service.IService; -import cn.lili.modules.message.entity.dos.WechatMPMessage; /** * 微信小程序消息订阅 业务层 diff --git a/framework/src/main/java/cn/lili/modules/message/service/WechatMessageService.java b/framework/src/main/java/cn/lili/modules/wechat/service/WechatMessageService.java similarity index 72% rename from framework/src/main/java/cn/lili/modules/message/service/WechatMessageService.java rename to framework/src/main/java/cn/lili/modules/wechat/service/WechatMessageService.java index f471ed89..c5514586 100644 --- a/framework/src/main/java/cn/lili/modules/message/service/WechatMessageService.java +++ b/framework/src/main/java/cn/lili/modules/wechat/service/WechatMessageService.java @@ -1,6 +1,6 @@ -package cn.lili.modules.message.service; +package cn.lili.modules.wechat.service; -import cn.lili.modules.message.entity.dos.WechatMessage; +import cn.lili.modules.wechat.entity.dos.WechatMessage; import com.baomidou.mybatisplus.extension.service.IService; /** diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/WechatMPMessageServiceImpl.java b/framework/src/main/java/cn/lili/modules/wechat/serviceimpl/WechatMPMessageServiceImpl.java similarity index 80% rename from framework/src/main/java/cn/lili/modules/message/serviceimpl/WechatMPMessageServiceImpl.java rename to framework/src/main/java/cn/lili/modules/wechat/serviceimpl/WechatMPMessageServiceImpl.java index daaaa215..ce6a45cc 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/WechatMPMessageServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/wechat/serviceimpl/WechatMPMessageServiceImpl.java @@ -1,27 +1,27 @@ -package cn.lili.modules.message.serviceimpl; +package cn.lili.modules.wechat.serviceimpl; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.message.entity.dos.WechatMPMessage; -import cn.lili.modules.message.entity.enums.WechatMessageItemEnums; -import cn.lili.modules.message.mapper.WechatMPMessageMapper; -import cn.lili.modules.message.service.WechatMPMessageService; -import cn.lili.modules.message.util.WechatAccessTokenUtil; -import cn.lili.modules.message.util.WechatMessageUtil; +import cn.lili.common.utils.HttpUtils; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.system.utils.HttpUtils; +import cn.lili.modules.wechat.entity.dos.WechatMPMessage; +import cn.lili.modules.wechat.entity.enums.WechatMessageItemEnums; +import cn.lili.modules.wechat.mapper.WechatMPMessageMapper; +import cn.lili.modules.wechat.service.WechatMPMessageService; +import cn.lili.modules.wechat.util.WechatAccessTokenUtil; +import cn.lili.modules.wechat.util.WechatMessageUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; @@ -34,30 +34,37 @@ import java.util.Map; * @author Chopper */ @Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Slf4j public class WechatMPMessageServiceImpl extends ServiceImpl implements WechatMPMessageService { + @Autowired + private WechatAccessTokenUtil wechatAccessTokenUtil; - private final WechatMPMessageMapper wechatMPMessageMapper; - private final WechatAccessTokenUtil wechatAccessTokenUtil; - - //get 获取所有的模版 + /** + * get 获取所有的模版 + */ private final String allMsgTpl = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token="; - - //获取keyid + /** + * 获取keyid + */ private final String keywords = "https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords?access_token="; - - //post 删除模版 添加模版 获取模版id + /** + * post 删除模版 添加模版 获取模版id + */ private final String delMsgTpl = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate?access_token="; + /** + * post 添加模版 + */ private final String addTpl = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate?access_token="; @Override public void init() { - wechatMPMessageMapper.deleteAll(); + this.baseMapper.deleteAll(); try { String accessToken = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); //获取已有模版,删除 String context = HttpUtil.get(allMsgTpl + accessToken); + + log.info("获取全部模版:{}", context); JSONObject jsonObject = new JSONObject(context); WechatMessageUtil.wechatHandler(jsonObject); List oldList = new ArrayList<>(); @@ -70,7 +77,8 @@ public class WechatMPMessageServiceImpl extends ServiceImpl { Map params = new HashMap<>(1); params.put("priTmplId", templateId); - WechatMessageUtil.wechatHandler(HttpUtil.post(delMsgTpl + accessToken, params)); + String message = WechatMessageUtil.wechatHandler(HttpUtil.post(delMsgTpl + accessToken, params)); + log.info("删除模版请求:{},删除模版响应:{}", params, message); }); } @@ -79,14 +87,14 @@ public class WechatMPMessageServiceImpl extends ServiceImpl { WechatMPMessage wechatMPMessage = new WechatMPMessage(); - Map params = new HashMap<>(); + Map params = new HashMap<>(16); params.put("tid", tplData.getTid()); //获取微信消息订阅keys String keywordsItems = WechatMessageUtil.wechatHandler(HttpUtil.get(keywords + accessToken, params)); JSONArray jsonArray = new JSONObject(keywordsItems).getJSONArray("data"); List keywordArray = jsonArray.toList(WechatMessageKeyword.class); - log.error("keywords:" + keywordArray); + log.info("keywords:" + keywordArray); //存放约定好的kids List kids = new ArrayList<>(tplData.keyWord.size()); List kidTexts = new ArrayList<>(tplData.keyWord.size()); @@ -103,12 +111,12 @@ public class WechatMPMessageServiceImpl extends ServiceImpl(); + params = new HashMap<>(4); params.put("tid", tplData.getTid()); params.put("kidList", kids); params.put("sceneDesc", tplData.getSceneDesc()); String content = HttpUtils.doPostWithJson(addTpl + accessToken, params); - log.error(JSONUtil.toJsonStr(params)); + log.info("添加模版参数:{},添加模版响应:{}", params, content); JSONObject tplContent = new JSONObject(content); WechatMessageUtil.wechatHandler(tplContent); @@ -116,7 +124,7 @@ public class WechatMPMessageServiceImpl extends ServiceImpl implements WechatMessageService { - private final WechatMessageMapper wechatMessageMapper; - private final WechatAccessTokenUtil wechatAccessTokenUtil; + @Autowired + private WechatAccessTokenUtil wechatAccessTokenUtil; - //get 获取所有的模版 + /** + * 设置行业 + */ + private final String setIndustry = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token="; + /** + * get 获取所有的模版 + */ private final String allMsgTpl = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token="; - - //post 删除模版 添加模版 获取模版id + /** + * post 删除模版 添加模版 获取模版id + */ private final String delMsgTpl = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token="; + /** + * post 添加模版 + */ private final String addTpl = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token="; @Override public void init() { try { - wechatMessageMapper.deleteAll(); + this.baseMapper.deleteAll(); + //获取token String accessToken = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.H5); + + + //设置行业 + Map setIndustryParams = new HashMap<>(16); + //互联网/电子商务 + setIndustryParams.put("industry_id1", 1); + //通信与运营商 + setIndustryParams.put("industry_id2", 5); + String context = HttpUtils.doPostWithJson(setIndustry + accessToken, setIndustryParams); + + log.info("设置模版请求{},设置行业响应:{}", setIndustryParams, context); //获取已有模版,删除 - String context = HttpUtil.get(allMsgTpl + accessToken); + context = HttpUtil.get(allMsgTpl + accessToken); JSONObject jsonObject = new JSONObject(context); + + + log.info("获取全部模版:{}", context); WechatMessageUtil.wechatHandler(jsonObject); List oldList = new ArrayList<>(); if (jsonObject.containsKey("template_list")) { @@ -63,29 +87,32 @@ public class WechatMessageServiceImpl extends ServiceImpl { Map params = new HashMap<>(1); params.put("template_id", templateId); - WechatMessageUtil.wechatHandler(HttpUtil.post(delMsgTpl + accessToken, params)); + String message = WechatMessageUtil.wechatHandler(HttpUtils.doPostWithJson(delMsgTpl + accessToken, params)); + log.info("删除模版请求:{},删除模版响应:{}", params, message); }); - } + }*/ //加入数据 List tmpList = initData(); tmpList.forEach(tplData -> { WechatMessage wechatMessage = new WechatMessage(); - Map params = new HashMap<>(1); + Map params = new HashMap<>(1); params.put("template_id_short", tplData.getMsgId()); - String content = HttpUtils.doPostWithJson(addTpl + accessToken, params); - JSONObject tplContent = new JSONObject(content); + String message = HttpUtils.doPostWithJson(addTpl + accessToken, params); + log.info("添加模版请求:{},添加模版响应:{}", params, message); + + JSONObject tplContent = new JSONObject(message); WechatMessageUtil.wechatHandler(tplContent); //如果包含模版id则进行操作,否则抛出异常 if (tplContent.containsKey("template_id")) { wechatMessage.setCode(tplContent.getStr("template_id")); } else { - throw new ServiceException("未能获取到微信模版消息id"); + throw new ServiceException(ResultCode.WECHAT_MP_MESSAGE_TMPL_ERROR); } wechatMessage.setName(tplData.getName()); @@ -111,13 +138,13 @@ public class WechatMessageServiceImpl extends ServiceImpl msg = new ArrayList<>(); //新订单消息提示 msg.add(new WechatMessageData( - "待支付", - "您有新订单需要支付", + "订单支付成功通知", + "订单支付成功通知", "如有问题,请联系在线客服", "OPENTM207498902", WechatMessageItemEnums.MEMBER_NAME.name() + "," + WechatMessageItemEnums.ORDER_SN.name() + "," + WechatMessageItemEnums.PRICE.name() + "," + WechatMessageItemEnums.GOODS_INFO.name(), - OrderStatusEnum.UNPAID)); + OrderStatusEnum.UNDELIVERED)); //已发货 msg.add(new WechatMessageData( "订单发货", diff --git a/framework/src/main/java/cn/lili/modules/message/util/WechatAccessTokenUtil.java b/framework/src/main/java/cn/lili/modules/wechat/util/WechatAccessTokenUtil.java similarity index 87% rename from framework/src/main/java/cn/lili/modules/message/util/WechatAccessTokenUtil.java rename to framework/src/main/java/cn/lili/modules/wechat/util/WechatAccessTokenUtil.java index 07f145a3..643c3e90 100644 --- a/framework/src/main/java/cn/lili/modules/message/util/WechatAccessTokenUtil.java +++ b/framework/src/main/java/cn/lili/modules/wechat/util/WechatAccessTokenUtil.java @@ -1,19 +1,19 @@ -package cn.lili.modules.message.util; +package cn.lili.modules.wechat.util; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; -import cn.lili.modules.connect.util.HttpUtils; +import cn.lili.common.utils.HttpUtils; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.connect.WechatConnectSetting; import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -27,12 +27,11 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WechatAccessTokenUtil { - - private final Cache cache; - - private final SettingService settingService; + @Autowired + private Cache cache; + @Autowired + private SettingService settingService; /** * 获取某一平台等cgi token 用于业务调用,例如发送公众号消息 @@ -106,10 +105,17 @@ public class WechatAccessTokenUtil { return ticket; } catch (Exception e) { log.error("微信JsApi签名异常", e); - throw new ServiceException("微信JsApi签名异常"); + throw new ServiceException(ResultCode.WECHAT_JSAPI_SIGN_ERROR); } } + /** + * 清除 token + * @param clientTypeEnum + */ + public void removeAccessToken(ClientTypeEnum clientTypeEnum) { + cache.remove(CachePrefix.WECHAT_CGI_ACCESS_TOKEN.getPrefix() + clientTypeEnum.name()); + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/message/util/WechatMessageData.java b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageData.java similarity index 88% rename from framework/src/main/java/cn/lili/modules/message/util/WechatMessageData.java rename to framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageData.java index 6d5d9a90..8e952736 100644 --- a/framework/src/main/java/cn/lili/modules/message/util/WechatMessageData.java +++ b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageData.java @@ -1,6 +1,5 @@ -package cn.lili.modules.message.util; +package cn.lili.modules.wechat.util; -import cn.hutool.json.JSONUtil; import lombok.Data; import java.util.HashMap; @@ -13,7 +12,6 @@ import java.util.Map; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/12/11 09:52 */ @Data @@ -49,7 +47,7 @@ public class WechatMessageData { * * @return */ - public String createData() { + public Map> createData() { Map> dataMap = new LinkedHashMap<>(); @@ -63,7 +61,7 @@ public class WechatMessageData { //拼接备注 dataMap.put("remark", createValue(this.remark)); - return JSONUtil.toJsonStr(dataMap); + return dataMap; } @@ -89,7 +87,7 @@ public class WechatMessageData { * @return */ private Map createValue(String msg) { - Map map = new HashMap<>(); + Map map = new HashMap<>(2); map.put("value", msg); return map; } diff --git a/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageUtil.java b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageUtil.java new file mode 100644 index 00000000..0ea798f6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMessageUtil.java @@ -0,0 +1,305 @@ +package cn.lili.modules.wechat.util; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ClientTypeEnum; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.DateUtil; +import cn.lili.common.utils.StringUtils; +import cn.lili.modules.connect.entity.Connect; +import cn.lili.modules.connect.entity.enums.SourceEnum; +import cn.lili.modules.connect.service.ConnectService; +import cn.lili.modules.member.entity.dto.ConnectQueryDTO; +import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dos.OrderItem; +import cn.lili.modules.order.order.service.OrderItemService; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.wechat.entity.dos.WechatMPMessage; +import cn.lili.modules.wechat.entity.dos.WechatMessage; +import cn.lili.modules.wechat.entity.enums.WechatMessageItemEnums; +import cn.lili.modules.wechat.service.WechatMPMessageService; +import cn.lili.modules.wechat.service.WechatMessageService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * 微信消息 + * + * @author Chopper + * @version v1.0 + * 2020-12-10 19:12 + */ +@Slf4j +@Component +public class WechatMessageUtil { + + @Autowired + private ConnectService connectService; + @Autowired + private OrderService orderService; + @Autowired + private OrderItemService orderItemService; + @Autowired + private WechatAccessTokenUtil wechatAccessTokenUtil; + @Autowired + private WechatMessageService wechatMessageService; + + @Autowired + private WechatMPMessageService wechatMPMessageService; + + public void sendWechatMessage(String sn) { + try { + this.wechatMessage(sn); + } catch (Exception e) { + log.error("微信公众号消息异常:", e); + } + try { + this.wechatMpMessage(sn); + } catch (Exception e) { + log.error("小程序消息订阅异常:", e); + } + + } + + /** + * 发送微信消息 + * + * @param sn + */ + public void wechatMessage(String sn) { + + Order order = orderService.getBySn(sn); + if (order == null) { + throw new ServiceException("订单" + sn + "不存在,发送微信公众号消息错误"); + } + if (ClientTypeEnum.H5.name().equals(order.getClientType())) { + //获取微信消息 + LambdaQueryWrapper wechatMessageQueryWrapper = new LambdaQueryWrapper(); + wechatMessageQueryWrapper.eq(WechatMessage::getOrderStatus, order.getOrderStatus()); + WechatMessage wechatMessage = wechatMessageService.getOne(wechatMessageQueryWrapper); + + if (wechatMessage == null) { + log.error("未配置微信公众号消息"); + return; + } + + Connect connect = connectService.queryConnect( + ConnectQueryDTO.builder() + .userId(order.getMemberId()) + .unionType(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name()) + .build() + ); + if (connect == null) { + return; + } + + log.info("微信消息发送消息:{}", order.getMemberId() + "-" + sn); + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.H5); + + //发送url + String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token; + + Map map = new HashMap<>(4); + //用户id + map.put("touser", connect.getUnionId()); + //模版id + map.put("template_id", wechatMessage.getCode()); + //模版中所需数据 + map.put("data", createData(order, wechatMessage)); + + log.info("参数内容:" + JSONUtil.toJsonStr(map)); + String content = HttpUtil.post(url, JSONUtil.toJsonStr(map)); + JSONObject json = new JSONObject(content); + log.info("微信消息发送结果:" + content); + String errorMessage = json.getStr("errmsg"); + String errcode = json.getStr("errcode"); + //发送失败 + if (!"0".equals(errcode)) { + log.error("消息发送失败:" + errorMessage); + log.error("消息发送请求token:" + token); + log.error("消息发送请求:" + map.get("data")); + } + } + } + + /** + * 发送微信消息 + * + * @param sn + */ + public void wechatMpMessage(String sn) { + + log.info("发送消息订阅"); + Order order = orderService.getBySn(sn); + if (order == null) { + throw new ServiceException("订单" + sn + "不存在,发送订阅消息错误"); + } + if (ClientTypeEnum.WECHAT_MP.name().equals(order.getClientType())) { + + //获取微信消息 + LambdaQueryWrapper wechatMPMessageQueryWrapper = new LambdaQueryWrapper(); + wechatMPMessageQueryWrapper.eq(WechatMPMessage::getOrderStatus, order.getOrderStatus()); + WechatMPMessage wechatMPMessage = wechatMPMessageService.getOne(wechatMPMessageQueryWrapper); + if (wechatMPMessage == null) { + log.info("未配置微信消息订阅"); + return; + } + + Connect connect = connectService.queryConnect( + ConnectQueryDTO.builder().userId(order.getMemberId()).unionType(SourceEnum.WECHAT_MP_OPEN_ID.name()).build() + ); + if (connect == null) { + return; + } + + log.info("微信消息订阅消息发送:{}", order.getMemberId() + "-" + sn); + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + + //发送url + String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token; + + Map map = new HashMap<>(4); + //用户id + map.put("touser", connect.getUnionId()); + //模版id + map.put("template_id", wechatMPMessage.getCode()); + //模版中所需数据 + map.put("data", createData(order, wechatMPMessage)); + map.put("page", "pages/order/orderDetail?sn=" + order.getSn()); + log.info("参数内容:" + JSONUtil.toJsonStr(map)); + String content = null; + try { + content = HttpUtil.post(url, JSONUtil.toJsonStr(map)); + } catch (Exception e) { + log.error("微信消息发送错误", e); + } + JSONObject json = new JSONObject(content); + log.info("微信小程序消息发送结果:" + content); + String errorMessage = json.getStr("errmsg"); + String errcode = json.getStr("errcode"); + //发送失败 + if (!"0".equals(errcode)) { + log.error("消息发送失败:" + errorMessage); + log.error("消息发送请求token:" + token); + log.error("消息发送请求:" + map.get("data")); + } + } + } + + /** + * 构造数据中所需的内容 + * + * @param order + * @param wechatMessage + * @return + */ + private Map> createData(Order order, WechatMessage wechatMessage) { + WechatMessageData wechatMessageData = new WechatMessageData(); + wechatMessageData.setFirst(wechatMessage.getFirst()); + wechatMessageData.setRemark(wechatMessage.getRemark()); + String[] paramArray = wechatMessage.getKeywords().split(","); + LinkedList params = new LinkedList(); + + for (String param : paramArray) { + WechatMessageItemEnums wechatMessageItemEnums = WechatMessageItemEnums.valueOf(param); + //初始化参数内容 + String val = getParams(wechatMessageItemEnums, order); + params.add(val); + } + wechatMessageData.setMessageData(params); + return wechatMessageData.createData(); + } + + /** + * 构造数据中所需的内容 + * + * @param order + * @param wechatMPMessage + * @return + */ + private Map> createData(Order order, WechatMPMessage wechatMPMessage) { + WechatMessageData wechatMessageData = new WechatMessageData(); + List paramArray = JSONUtil.toList(wechatMPMessage.getKeywords(), String.class); + List texts = JSONUtil.toList(wechatMPMessage.getKeywordsText(), String.class); + Map params = new LinkedHashMap<>(); + for (int i = 0; i < paramArray.size(); i++) { + WechatMessageItemEnums wechatMessageItemEnums = WechatMessageItemEnums.valueOf(paramArray.get(i)); + //初始化参数内容 + String val = getParams(wechatMessageItemEnums, order); + val = StringUtils.subStringLength(val, 20); + params.put(texts.get(i), val); + } + wechatMessageData.setMpMessageData(params); + return wechatMessageData.createMPData(); + } + + /** + * 获取具体参数 + * + * @param itemEnums + * @param order + * @return + */ + private String getParams(WechatMessageItemEnums itemEnums, Order order) { + switch (itemEnums) { + case PRICE: + return order.getPriceDetailDTO().getFlowPrice().toString(); + case ORDER_SN: + return order.getSn(); + case SHOP_NAME: + return order.getStoreName(); + case GOODS_INFO: + List orderItems = orderItemService.getByOrderSn(order.getSn()); + StringBuffer stringBuffer = new StringBuffer(); + orderItems.forEach(orderItem -> { + stringBuffer.append(orderItem.getGoodsName() + "*" + orderItem.getNum() + " "); + }); + return stringBuffer.toString(); + case MEMBER_NAME: + return order.getMemberName(); + case LOGISTICS_NO: + return order.getLogisticsNo(); + case LOGISTICS_NAME: + return order.getLogisticsName(); + case LOGISTICS_TIME: + return DateUtil.toString(order.getLogisticsTime(), DateUtil.STANDARD_FORMAT); + default: + return ""; + } + } + + /** + * 如果返回信息有错误 + * + * @param jsonObject 返回消息 + */ + public static void wechatHandler(JSONObject jsonObject) { + if (jsonObject.containsKey("errmsg")) { + if (("ok").equals(jsonObject.getStr("errmsg"))) { + return; + } + log.error("微信接口异常,错误码" + jsonObject.get("errcode") + "," + jsonObject.getStr("errmsg")); + throw new ServiceException(ResultCode.WECHAT_ERROR); + } + } + + /** + * 如果返回信息有错误 + * + * @param string 返回消息 + */ + public static String wechatHandler(String string) { + JSONObject jsonObject = new JSONObject(); + wechatHandler(jsonObject); + return string; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/message/util/WechatMpCodeUtil.java b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMpCodeUtil.java similarity index 74% rename from framework/src/main/java/cn/lili/modules/message/util/WechatMpCodeUtil.java rename to framework/src/main/java/cn/lili/modules/wechat/util/WechatMpCodeUtil.java index 09600fda..9ff0890a 100644 --- a/framework/src/main/java/cn/lili/modules/message/util/WechatMpCodeUtil.java +++ b/framework/src/main/java/cn/lili/modules/wechat/util/WechatMpCodeUtil.java @@ -1,13 +1,11 @@ -package cn.lili.modules.message.util; +package cn.lili.modules.wechat.util; +import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; -import cn.lili.modules.base.entity.enums.ClientTypeEnum; import cn.lili.modules.message.entity.dos.ShortLink; import cn.lili.modules.message.service.ShortLinkService; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; @@ -38,16 +36,13 @@ import java.util.Map; */ @Slf4j @Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WechatMpCodeUtil { private static String UN_LIMIT_API = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="; private static String CREATE_QR_CODE = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token="; - @Autowired private WechatAccessTokenUtil wechatAccessTokenUtil; - @Autowired private ShortLinkService shortLinkService; @@ -60,34 +55,34 @@ public class WechatMpCodeUtil { public String createQrCode(String path) { try { String accessToken = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); - Map params = new HashMap<>(); + Map params = new HashMap<>(2); params.put("path", path); params.put("width", "280"); - // ======================================================================// - // 执行URL Post调用 - // ======================================================================// + //======================================================================// + //执行URL Post调用 + //======================================================================// CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(CREATE_QR_CODE + accessToken); httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json"); - // 必须是json模式的 post + //必须是json模式的 post String body = JSON.toJSONString(params); StringEntity entity = new StringEntity(body); entity.setContentType("image/png"); httpPost.setEntity(entity); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); - // ======================================================================// - // 处理HTTP返回结果 - // ======================================================================// + //======================================================================// + //处理HTTP返回结果 + //======================================================================// InputStream contentStream = httpEntity.getContent(); byte[] bytes = toByteArray(contentStream); contentStream.read(bytes); - // 返回内容 + //返回内容 return Base64.getEncoder().encodeToString(bytes); } catch (Exception e) { log.error("生成二维码错误:", e); - throw new ServiceException(ResultCode.ERROR); + throw new ServiceException(ResultCode.WECHAT_QRCODE_ERROR); } } @@ -104,47 +99,45 @@ public class WechatMpCodeUtil { //短链接存储 ShortLink shortLink = new ShortLink(); - //已经保存过则不再保存 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); - queryWrapper.eq(ShortLink::getOriginalParams, scene); - List shortLinks = shortLinkService.list(queryWrapper); + shortLink.setOriginalParams(scene); + List shortLinks = shortLinkService.queryShortLinks(shortLink); if (shortLinks.size() > 0) { shortLink = shortLinks.get(0); } else { shortLink.setOriginalParams(scene); shortLinkService.save(shortLink); - shortLink = shortLinkService.getOne(queryWrapper); + shortLink = shortLinkService.queryShortLinks(shortLink).get(0); } String accessToken = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); - Map params = new HashMap<>(); + Map params = new HashMap<>(4); params.put("page", page); params.put("scene", shortLink.getId()); params.put("width", "280"); - // ======================================================================// - // 执行URL Post调用 - // ======================================================================// + //======================================================================// + //执行URL Post调用 + //======================================================================// CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(UN_LIMIT_API + accessToken); httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json"); - // 必须是json模式的 post + //必须是json模式的 post String body = JSON.toJSONString(params); StringEntity entity = new StringEntity(body); entity.setContentType("image/png"); httpPost.setEntity(entity); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); - // ======================================================================// - // 处理HTTP返回结果 - // ======================================================================// + //======================================================================// + //处理HTTP返回结果 + //======================================================================// InputStream contentStream = httpEntity.getContent(); byte[] bytes = toByteArray(contentStream); contentStream.read(bytes); - // 返回内容 + //返回内容 return Base64.getEncoder().encodeToString(bytes); } catch (Exception e) { log.error("生成二维码错误:", e); - throw new ServiceException(ResultCode.ERROR); + throw new ServiceException(ResultCode.WECHAT_QRCODE_ERROR); } } diff --git a/framework/src/main/java/cn/lili/base/BaseEntity.java b/framework/src/main/java/cn/lili/mybatis/BaseEntity.java similarity index 74% rename from framework/src/main/java/cn/lili/base/BaseEntity.java rename to framework/src/main/java/cn/lili/mybatis/BaseEntity.java index b87c511a..126c6cbc 100644 --- a/framework/src/main/java/cn/lili/base/BaseEntity.java +++ b/framework/src/main/java/cn/lili/mybatis/BaseEntity.java @@ -1,4 +1,4 @@ -package cn.lili.base; +package cn.lili.mybatis; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; @@ -13,13 +13,11 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.EntityListeners; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; import java.io.Serializable; import java.util.Date; @@ -32,9 +30,7 @@ import java.util.Date; * @since 2020/8/20 14:34 */ @Data -@MappedSuperclass -@EntityListeners(AuditingEntityListener.class) -@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"}) +@JsonIgnoreProperties(value = { "handler", "fieldHandler"}) @AllArgsConstructor @NoArgsConstructor public abstract class BaseEntity implements Serializable { @@ -42,10 +38,7 @@ public abstract class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; - @Id @TableId - @TableField - @Column(columnDefinition = "bigint(20)") @ApiModelProperty(value = "唯一标识", hidden = true) private String id; @@ -60,6 +53,7 @@ public abstract class BaseEntity implements Serializable { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间", hidden = true) + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date createTime; @LastModifiedBy @@ -70,12 +64,13 @@ public abstract class BaseEntity implements Serializable { @LastModifiedDate @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @TableField(fill = FieldFill.UPDATE) + @TableField(fill = FieldFill.INSERT_UPDATE) @ApiModelProperty(value = "更新时间", hidden = true) + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") private Date updateTime; @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "删除标志 true/false 删除/未删除", hidden = true) - private Boolean deleteFlag ; + private Boolean deleteFlag; } diff --git a/framework/src/main/java/cn/lili/base/IdEntity.java b/framework/src/main/java/cn/lili/mybatis/BaseIdEntity.java similarity index 50% rename from framework/src/main/java/cn/lili/base/IdEntity.java rename to framework/src/main/java/cn/lili/mybatis/BaseIdEntity.java index 5909ebce..9b926c74 100644 --- a/framework/src/main/java/cn/lili/base/IdEntity.java +++ b/framework/src/main/java/cn/lili/mybatis/BaseIdEntity.java @@ -1,18 +1,12 @@ -package cn.lili.base; +package cn.lili.mybatis; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import javax.persistence.Column; -import javax.persistence.EntityListeners; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; import java.io.Serializable; @@ -24,20 +18,15 @@ import java.io.Serializable; * @since 2020/8/20 14:34 */ @Data -@MappedSuperclass -@EntityListeners(AuditingEntityListener.class) -@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"}) +@JsonIgnoreProperties(value = {"handler", "fieldHandler"}) @AllArgsConstructor @NoArgsConstructor -public abstract class IdEntity implements Serializable { +public abstract class BaseIdEntity implements Serializable { private static final long serialVersionUID = 1L; - @Id @TableId - @TableField - @Column(columnDefinition = "bigint(20)") @ApiModelProperty(value = "唯一标识", hidden = true) private String id; diff --git a/framework/src/main/java/cn/lili/mybatis/BaseTenantEntity.java b/framework/src/main/java/cn/lili/mybatis/BaseTenantEntity.java new file mode 100644 index 00000000..c0fc647c --- /dev/null +++ b/framework/src/main/java/cn/lili/mybatis/BaseTenantEntity.java @@ -0,0 +1,24 @@ +package cn.lili.mybatis; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * 租户超级类 + * + * @author Chopper + * @version v1.0 + * @since 2020/8/20 14:34 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public abstract class BaseTenantEntity extends BaseEntity { + + @ApiModelProperty(value = "租户id", hidden = true) + private String tenantId; + +} diff --git a/framework/src/main/java/cn/lili/common/heath/DataSourceHealthConfig.java b/framework/src/main/java/cn/lili/mybatis/heath/DataSourceHealthConfig.java similarity index 96% rename from framework/src/main/java/cn/lili/common/heath/DataSourceHealthConfig.java rename to framework/src/main/java/cn/lili/mybatis/heath/DataSourceHealthConfig.java index 2437cc99..ec1e7037 100644 --- a/framework/src/main/java/cn/lili/common/heath/DataSourceHealthConfig.java +++ b/framework/src/main/java/cn/lili/mybatis/heath/DataSourceHealthConfig.java @@ -1,4 +1,4 @@ -package cn.lili.common.heath; +package cn.lili.mybatis.heath; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Value; @@ -17,7 +17,6 @@ import java.util.Map; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/12/24 19:31 */ diff --git a/framework/src/main/java/cn/lili/base/mybatisplus/MyMetaObjectHandler.java b/framework/src/main/java/cn/lili/mybatis/mybatisplus/MyMetaObjectHandler.java similarity index 70% rename from framework/src/main/java/cn/lili/base/mybatisplus/MyMetaObjectHandler.java rename to framework/src/main/java/cn/lili/mybatis/mybatisplus/MyMetaObjectHandler.java index fd966853..eadaa7e3 100644 --- a/framework/src/main/java/cn/lili/base/mybatisplus/MyMetaObjectHandler.java +++ b/framework/src/main/java/cn/lili/mybatis/mybatisplus/MyMetaObjectHandler.java @@ -1,4 +1,4 @@ -package cn.lili.base.mybatisplus; +package cn.lili.mybatis.mybatisplus; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; @@ -22,14 +22,23 @@ public class MyMetaObjectHandler implements MetaObjectHandler { AuthUser authUser = UserContext.getCurrentUser(); if (authUser != null) { this.setFieldValByName("createBy", authUser.getUsername(), metaObject); + } else { + + this.setFieldValByName("createBy", "SYSTEM", metaObject); + } + //有创建时间字段,切字段值为空 + if (metaObject.hasGetter("createTime")) { + this.setFieldValByName("createTime", new Date(), metaObject); } - this.setFieldValByName("createTime", new Date(), metaObject); //有值,则写入 if (metaObject.hasGetter("deleteFlag")) { this.setFieldValByName("deleteFlag", false, metaObject); } if (metaObject.hasGetter("id")) { - this.setFieldValByName("id", String.valueOf(SnowFlake.getId()), metaObject); + //如果已经配置id,则不再写入 + if (metaObject.getValue("id") == null) { + this.setFieldValByName("id", String.valueOf(SnowFlake.getId()), metaObject); + } } } diff --git a/framework/src/main/java/cn/lili/mybatis/mybatisplus/MybatisPlusConfig.java b/framework/src/main/java/cn/lili/mybatis/mybatisplus/MybatisPlusConfig.java new file mode 100644 index 00000000..87bb2f2c --- /dev/null +++ b/framework/src/main/java/cn/lili/mybatis/mybatisplus/MybatisPlusConfig.java @@ -0,0 +1,34 @@ +package cn.lili.mybatis.mybatisplus; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Chopper + */ +@Configuration +@MapperScan({"cn.lili.modules.*.*.mapper", "cn.lili.modules.*.mapper"}) +public class MybatisPlusConfig { + /** + * 分页插件,自动识别数据库类型 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + + //阻断解析器,测试环境使用 +// PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); +// +// List sqlParserList = new ArrayList<>(); +// //攻击 SQL 阻断解析器、加入解析链 +// sqlParserList.add(new BlockAttackSqlParser()); +// paginationInterceptor.setSqlParserList(sqlParserList); +// return paginationInterceptor; + } +} diff --git a/framework/src/main/java/cn/lili/mybatis/mybatisplus/external/SpiceBaseMapper.java b/framework/src/main/java/cn/lili/mybatis/mybatisplus/external/SpiceBaseMapper.java new file mode 100644 index 00000000..8d56ccec --- /dev/null +++ b/framework/src/main/java/cn/lili/mybatis/mybatisplus/external/SpiceBaseMapper.java @@ -0,0 +1,19 @@ +package cn.lili.mybatis.mybatisplus.external; + +import java.util.List; + +/** + * @author paulG + * @since 2022/7/18 + **/ +public interface SpiceBaseMapper { + + /** + * 批量插入 + * {@link com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn} + * + * @param entityList 要插入的数据 + * @return 成功插入的数据条数 + */ + long insertBatchSomeColumn(List entityList); +} diff --git a/framework/src/main/java/cn/lili/mybatis/mybatisplus/external/SpiceSqlInjector.java b/framework/src/main/java/cn/lili/mybatis/mybatisplus/external/SpiceSqlInjector.java new file mode 100644 index 00000000..5481579a --- /dev/null +++ b/framework/src/main/java/cn/lili/mybatis/mybatisplus/external/SpiceSqlInjector.java @@ -0,0 +1,33 @@ +package cn.lili.mybatis.mybatisplus.external; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author paulG + * @since 2022/7/18 + **/ +@Component +public class SpiceSqlInjector extends DefaultSqlInjector { + + /** + * 如果只需增加方法,保留mybatis plus自带方法, + * 可以先获取super.getMethodList(),再添加add + */ + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + // 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法 + List methodList = super.getMethodList(mapperClass, tableInfo); + // 注入InsertBatchSomeColumn + // 在!t.isLogicDelete()表示不要逻辑删除字段,!"update_time".equals(t.getColumn())表示不要字段名为 update_time 的字段,不对进行操作 + // methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete() && !"update_time".equals(t.getColumn()))); + // 要逻辑删除 t.isLogicDelete() 默认不要 + methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete())); + return methodList; + } +} diff --git a/framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingDatabaseAlgorithm.java b/framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingDatabaseAlgorithm.java similarity index 90% rename from framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingDatabaseAlgorithm.java rename to framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingDatabaseAlgorithm.java index d25be592..164c2027 100644 --- a/framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingDatabaseAlgorithm.java +++ b/framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingDatabaseAlgorithm.java @@ -1,4 +1,4 @@ -package cn.lili.config.sharding; +package cn.lili.mybatis.sharding; import cn.lili.common.utils.DateUtil; import com.google.common.collect.Range; @@ -20,8 +20,8 @@ public class CreateTimeShardingDatabaseAlgorithm implements PreciseShardingAlgor @Override public String doSharding(Collection collection, PreciseShardingValue preciseShardingValue) { - Long create_time = preciseShardingValue.getValue(); - String value = DateUtil.toString(create_time, "yyyy"); + Long createTime = preciseShardingValue.getValue(); + String value = DateUtil.toString(createTime, "yyyy"); //data2019,data2020 return "data" + value; } diff --git a/framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingTableAlgorithm.java b/framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingTableAlgorithm.java similarity index 78% rename from framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingTableAlgorithm.java rename to framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingTableAlgorithm.java index e640e877..5d07ec38 100644 --- a/framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingTableAlgorithm.java +++ b/framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingTableAlgorithm.java @@ -1,5 +1,6 @@ -package cn.lili.config.sharding; +package cn.lili.mybatis.sharding; +import cn.hutool.core.convert.Convert; import cn.lili.common.utils.DateUtil; import com.google.common.collect.Range; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; @@ -20,9 +21,9 @@ public class CreateTimeShardingTableAlgorithm implements PreciseShardingAlgorith @Override public String doSharding(Collection collection, PreciseShardingValue preciseShardingValue) { - Long create_time = preciseShardingValue.getValue(); - String monthValue = DateUtil.toString(create_time, "MM"); - String yearValue = DateUtil.toString(create_time, "yyyy"); + Long createTime = preciseShardingValue.getValue(); + String monthValue = DateUtil.toString(createTime, "MM"); + String yearValue = DateUtil.toString(createTime, "yyyy"); Integer month = Integer.valueOf(monthValue); Integer year = Integer.valueOf(yearValue); //li_order_1,li_order_2~ @@ -34,10 +35,10 @@ public class CreateTimeShardingTableAlgorithm implements PreciseShardingAlgorith Collection collect = new ArrayList<>(); Range valueRange = rangeShardingValue.getValueRange(); - Integer startMonth = Integer.parseInt(DateUtil.toString(valueRange.lowerEndpoint().longValue(), "MM")); - Integer endMonth = Integer.parseInt(DateUtil.toString(valueRange.upperEndpoint().longValue(), "MM")); - Integer startYear = Integer.parseInt(DateUtil.toString(valueRange.lowerEndpoint().longValue(), "yyyy")); - Integer endYear = Integer.parseInt(DateUtil.toString(valueRange.upperEndpoint().longValue(), "yyyy")); + Integer startMonth = Convert.toInt(DateUtil.toString(valueRange.lowerEndpoint().longValue(), "MM")); + Integer endMonth = Convert.toInt(DateUtil.toString(valueRange.upperEndpoint().longValue(), "MM")); + Integer startYear = Convert.toInt(DateUtil.toString(valueRange.lowerEndpoint().longValue(), "yyyy")); + Integer endYear = Convert.toInt(DateUtil.toString(valueRange.upperEndpoint().longValue(), "yyyy")); //如果是同一年查询 //2020-1~2020-2 diff --git a/framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingTableAlgorithmBak.java b/framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingTableAlgorithmBak.java similarity index 57% rename from framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingTableAlgorithmBak.java rename to framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingTableAlgorithmBak.java index 8818e31b..a35f7b52 100644 --- a/framework/src/main/java/cn/lili/config/sharding/CreateTimeShardingTableAlgorithmBak.java +++ b/framework/src/main/java/cn/lili/mybatis/sharding/CreateTimeShardingTableAlgorithmBak.java @@ -1,4 +1,4 @@ -package cn.lili.config.sharding; +package cn.lili.mybatis.sharding; import cn.lili.common.utils.DateUtil; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; @@ -19,8 +19,8 @@ public class CreateTimeShardingTableAlgorithmBak implements PreciseShardingAlgor @Override public String doSharding(Collection collection, PreciseShardingValue preciseShardingValue) { - Long create_time = preciseShardingValue.getValue(); - String value = DateUtil.toString(create_time, "MM"); + Long createTime = preciseShardingValue.getValue(); + String value = DateUtil.toString(createTime, "MM"); Integer month = Integer.valueOf(value); //li_order_1,li_order_2~ return "li_order_" + month; @@ -30,17 +30,9 @@ public class CreateTimeShardingTableAlgorithmBak implements PreciseShardingAlgor @Override public Collection doSharding(Collection collection, RangeShardingValue rangeShardingValue) { Collection collect = new ArrayList<>(); - //Range valueRange = rangeShardingValue.getValueRange(); - //开始年份结束年份 - //String start = DateUtil.toString(valueRange.lowerEndpoint().longValue(), "MM"); - //String end = DateUtil.toString(valueRange.upperEndpoint().longValue(), "MM"); - //循环增加区间的查询条件 - - - // 因为考虑到 假设2019-05~2020-05 - // 这快是没办法处理的,因为分库分表之后,每个库都要进行查询,如果操作为,1-4月,那么2020年数据查询正确了,可是2019年到5-12月数据就查询不到了 - // 这里需要做一些性能的浪费,现在看来是没办法处理到 - + //因为考虑到 假设2019-05~2020-05 + //这快是没办法处理的,因为分库分表之后,每个库都要进行查询,如果操作为,1-4月,那么2020年数据查询正确了,可是2019年到5-12月数据就查询不到了 + //这里需要做一些性能的浪费,现在看来是没办法处理到 for (Integer i = 1; i <= 12; i++) { collect.add("li_order_" + i); } diff --git a/framework/src/main/java/cn/lili/common/utils/PageUtil.java b/framework/src/main/java/cn/lili/mybatis/util/PageUtil.java similarity index 74% rename from framework/src/main/java/cn/lili/common/utils/PageUtil.java rename to framework/src/main/java/cn/lili/mybatis/util/PageUtil.java index 84f87983..e2d5f63a 100644 --- a/framework/src/main/java/cn/lili/common/utils/PageUtil.java +++ b/framework/src/main/java/cn/lili/mybatis/util/PageUtil.java @@ -1,10 +1,13 @@ -package cn.lili.common.utils; +package cn.lili.mybatis.util; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.SearchVO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -17,7 +20,6 @@ import java.util.List; * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/26 15:23 */ public class PageUtil { @@ -26,8 +28,9 @@ public class PageUtil { /** * Mybatis-Plus分页封装 * - * @param page - * @return + * @param page 分页VO + * @param 范型 + * @return 分页响应 */ public static Page initPage(PageVO page) { @@ -74,8 +77,8 @@ public class PageUtil { * 生成条件搜索 全对象对比 equals * 如果需要like 需要另行处理 * - * @param object - * @return + * @param object 对象(根据对象构建查询条件) + * @return 查询wrapper */ public static QueryWrapper initWrapper(Object object) { return initWrapper(object, null); @@ -84,16 +87,16 @@ public class PageUtil { /** * 生成条件搜索 全对象对比 * - * @param object - * @param searchVo - * @return + * @param object 对象 + * @param searchVo 查询条件 + * @return 查询wrapper */ public static QueryWrapper initWrapper(Object object, SearchVO searchVo) { QueryWrapper queryWrapper = new QueryWrapper<>(); - // 创建时间区间判定 + //创建时间区间判定 if (searchVo != null && StrUtil.isNotBlank(searchVo.getStartDate()) && StrUtil.isNotBlank(searchVo.getEndDate())) { - Date start = cn.hutool.core.date.DateUtil.parse(searchVo.getStartDate()); - Date end = cn.hutool.core.date.DateUtil.parse(searchVo.getEndDate()); + Date start = DateUtil.parse(searchVo.getStartDate()); + Date end = DateUtil.parse(searchVo.getEndDate()); queryWrapper.between("create_time", start, DateUtil.endOfDay(end)); } if (object != null) { @@ -118,9 +121,9 @@ public class PageUtil { /** * List 手动分页 * - * @param page - * @param list - * @return + * @param page 分页对象 + * @param list 分页集合 + * @return 范型结果 */ public static List listToPage(PageVO page, List list) { @@ -148,4 +151,25 @@ public class PageUtil { return list.subList(fromIndex, toIndex); } } + + /** + * 转换分页类型 + * + * @param originPage 原分页 + * @param records 新分页数据 + * @param 新类型 + * @return 新类型分页 + */ + public static IPage convertPage(IPage originPage, List records) { + IPage resultPage = new Page<>(); + if (originPage != null) { + resultPage.setCurrent(originPage.getCurrent()); + resultPage.setPages(originPage.getPages()); + resultPage.setTotal(originPage.getTotal()); + resultPage.setSize(originPage.getSize()); + resultPage.setRecords(records); + } + return resultPage; + } + } diff --git a/framework/src/main/java/cn/lili/common/rocketmq/RocketmqSendCallback.java b/framework/src/main/java/cn/lili/rocketmq/RocketmqSendCallback.java similarity index 94% rename from framework/src/main/java/cn/lili/common/rocketmq/RocketmqSendCallback.java rename to framework/src/main/java/cn/lili/rocketmq/RocketmqSendCallback.java index 088420b3..797bc467 100644 --- a/framework/src/main/java/cn/lili/common/rocketmq/RocketmqSendCallback.java +++ b/framework/src/main/java/cn/lili/rocketmq/RocketmqSendCallback.java @@ -1,4 +1,4 @@ -package cn.lili.common.rocketmq; +package cn.lili.rocketmq; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendCallback; diff --git a/framework/src/main/java/cn/lili/common/rocketmq/RocketmqSendCallbackBuilder.java b/framework/src/main/java/cn/lili/rocketmq/RocketmqSendCallbackBuilder.java similarity index 85% rename from framework/src/main/java/cn/lili/common/rocketmq/RocketmqSendCallbackBuilder.java rename to framework/src/main/java/cn/lili/rocketmq/RocketmqSendCallbackBuilder.java index d29c25eb..13691db7 100644 --- a/framework/src/main/java/cn/lili/common/rocketmq/RocketmqSendCallbackBuilder.java +++ b/framework/src/main/java/cn/lili/rocketmq/RocketmqSendCallbackBuilder.java @@ -1,4 +1,4 @@ -package cn.lili.common.rocketmq; +package cn.lili.rocketmq; /** * @author paulG diff --git a/framework/src/main/java/cn/lili/common/rocketmq/tags/AfterSaleTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/AfterSaleTagsEnum.java similarity index 72% rename from framework/src/main/java/cn/lili/common/rocketmq/tags/AfterSaleTagsEnum.java rename to framework/src/main/java/cn/lili/rocketmq/tags/AfterSaleTagsEnum.java index 98322812..174f3ecc 100644 --- a/framework/src/main/java/cn/lili/common/rocketmq/tags/AfterSaleTagsEnum.java +++ b/framework/src/main/java/cn/lili/rocketmq/tags/AfterSaleTagsEnum.java @@ -1,12 +1,20 @@ -package cn.lili.common.rocketmq.tags; +package cn.lili.rocketmq.tags; /** + * 售后标签枚举 + * * @author paulG * @since 2020/12/9 **/ public enum AfterSaleTagsEnum { + /** + * "售后退款" + */ REFUND("售后退款"), + /** + * "售后单状态改变" + */ AFTER_SALE_STATUS_CHANGE("售后单状态改变"); private final String description; diff --git a/framework/src/main/java/cn/lili/rocketmq/tags/GoodsTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/GoodsTagsEnum.java new file mode 100644 index 00000000..86ef5c8b --- /dev/null +++ b/framework/src/main/java/cn/lili/rocketmq/tags/GoodsTagsEnum.java @@ -0,0 +1,90 @@ +package cn.lili.rocketmq.tags; + +/** + * @author paulG + * @since 2020/12/9 + **/ +public enum GoodsTagsEnum { + + /** + * "生成商品索引" + */ + GENERATOR_GOODS_INDEX("生成商品索引"), + /** + * "生成店铺商品索引" + */ + GENERATOR_STORE_GOODS_INDEX("生成店铺商品索引"), + /** + * "更新商品索引" + */ + UPDATE_GOODS_INDEX("更新商品索引"), + /** + * "更新商品索引促销信息" + */ + UPDATE_GOODS_INDEX_PROMOTIONS("更新商品索引促销信息"), + /** + * "更新商品索引促销信息" + */ + DELETE_GOODS_INDEX_PROMOTIONS("更新商品索引促销信息"), + + /** + * "更新商品索引部分字段" + */ + UPDATE_GOODS_INDEX_FIELD("更新商品索引部分字段"), + /** + * "重置商品索引" + */ + RESET_GOODS_INDEX("重置商品索引"), + /** + * "删除店铺商品索引" + */ + STORE_GOODS_DELETE("删除店铺商品索引"), + /** + * 下架商品" + */ + DOWN("下架商品"), + /** + * "删除商品" + */ + GOODS_DELETE("删除商品"), + /** + * "审核商品" + */ + GOODS_AUDIT("审核商品"), + /** + * "收藏商品" + */ + GOODS_COLLECTION("收藏商品"), + /** + * 同步商品分类名称 + */ + CATEGORY_GOODS_NAME("同步商品分类名称"), + /** + * "购买商品完成" + */ + BUY_GOODS_COMPLETE("购买商品完成"), + /** + * "删除商品SKU" + */ + SKU_DELETE("删除商品SKU"), + /** + * "查看商品" + */ + VIEW_GOODS("查看商品"), + /** + * "商品评价" + */ + GOODS_COMMENT_COMPLETE("商品评价"); + + private final String description; + + GoodsTagsEnum(String description) { + this.description = description; + } + + public String description() { + return description; + } + + +} diff --git a/framework/src/main/java/cn/lili/rocketmq/tags/MemberTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/MemberTagsEnum.java new file mode 100644 index 00000000..2781da0a --- /dev/null +++ b/framework/src/main/java/cn/lili/rocketmq/tags/MemberTagsEnum.java @@ -0,0 +1,50 @@ +package cn.lili.rocketmq.tags; + +/** + * 会员操作枚举 + * + * @author paulG + * @since 2020/12/9 + **/ +public enum MemberTagsEnum { + /** + * 会员注册 + */ + MEMBER_REGISTER("会员注册"), + /** + * 会员注册 + */ + MEMBER_LOGIN("会员登录"), + /** + * 会员签到 + */ + MEMBER_SING("会员签到"), + /** + * 会员提现 + */ + MEMBER_WITHDRAWAL("会员提现"), + /** + * 会员信息更改 + */ + MEMBER_INFO_EDIT("会员信息更改"), + /** + * 会员积分变动 + */ + MEMBER_POINT_CHANGE("会员积分变动"), + /** + * 会员使用联合登录 + */ + MEMBER_CONNECT_LOGIN("会员使用联合登录"); + + private final String description; + + MemberTagsEnum(String description) { + this.description = description; + } + + public String description() { + return description; + } + + +} diff --git a/framework/src/main/java/cn/lili/common/rocketmq/tags/MqOrderTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/OrderTagsEnum.java similarity index 58% rename from framework/src/main/java/cn/lili/common/rocketmq/tags/MqOrderTagsEnum.java rename to framework/src/main/java/cn/lili/rocketmq/tags/OrderTagsEnum.java index baf6bdf6..20363e3d 100644 --- a/framework/src/main/java/cn/lili/common/rocketmq/tags/MqOrderTagsEnum.java +++ b/framework/src/main/java/cn/lili/rocketmq/tags/OrderTagsEnum.java @@ -1,21 +1,26 @@ -package cn.lili.common.rocketmq.tags; +package cn.lili.rocketmq.tags; /** + * 订单操作枚举 + * * @author paulG * @since 2020/12/9 **/ -public enum MqOrderTagsEnum { - +public enum OrderTagsEnum { + /** + * 订单创建 + */ ORDER_CREATE("订单创建"), + /** + * 订单状态改变 + */ STATUS_CHANGE("订单状态改变"); - - private final String description; - MqOrderTagsEnum(String description) { + OrderTagsEnum(String description) { this.description = description; } diff --git a/framework/src/main/java/cn/lili/common/rocketmq/tags/OtherTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/OtherTagsEnum.java similarity index 70% rename from framework/src/main/java/cn/lili/common/rocketmq/tags/OtherTagsEnum.java rename to framework/src/main/java/cn/lili/rocketmq/tags/OtherTagsEnum.java index 91e9dcf3..c4c2000e 100644 --- a/framework/src/main/java/cn/lili/common/rocketmq/tags/OtherTagsEnum.java +++ b/framework/src/main/java/cn/lili/rocketmq/tags/OtherTagsEnum.java @@ -1,12 +1,19 @@ -package cn.lili.common.rocketmq.tags; +package cn.lili.rocketmq.tags; /** + * 其他操作枚举 + * * @author paulG * @since 2020/12/9 **/ public enum OtherTagsEnum { - + /** + * 站内消息提醒 + */ MESSAGE("站内消息提醒"), + /** + * 短信消息提醒 + */ SMS("短信消息提醒"); private final String description; diff --git a/framework/src/main/java/cn/lili/rocketmq/tags/StoreTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/StoreTagsEnum.java new file mode 100644 index 00000000..f18a7428 --- /dev/null +++ b/framework/src/main/java/cn/lili/rocketmq/tags/StoreTagsEnum.java @@ -0,0 +1,20 @@ +package cn.lili.rocketmq.tags; + +/** + * @author chc + * @since 2022/6/2114:46 + */ +public enum StoreTagsEnum { + + EDIT_STORE_SETTING("修改商家设置"); + + private final String description; + + StoreTagsEnum(String description) { + this.description = description; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/trigger/delay/AbstractDelayQueueMachineFactory.java b/framework/src/main/java/cn/lili/trigger/delay/AbstractDelayQueueMachineFactory.java new file mode 100644 index 00000000..18d3b7bd --- /dev/null +++ b/framework/src/main/java/cn/lili/trigger/delay/AbstractDelayQueueMachineFactory.java @@ -0,0 +1,45 @@ +package cn.lili.trigger.delay; + +import cn.lili.cache.Cache; +import cn.lili.common.utils.DateUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 延时队列工厂 + * + * @author paulG + * @since 2020/11/7 + **/ +@Slf4j +public abstract class AbstractDelayQueueMachineFactory { + + @Autowired + private Cache cache; + + /** + * 插入任务id + * + * @param jobId 任务id(队列内唯一) + * @param triggerTime 执行时间 时间戳(毫秒) + * @return 是否插入成功 + */ + public boolean addJob(String jobId, Long triggerTime) { + + //redis 中排序时间 + long delaySeconds = triggerTime / 1000; + //增加延时任务 参数依次为:队列名称、执行时间、任务id + boolean result = cache.zAdd(setDelayQueueName(), delaySeconds, jobId); + log.info("增加延时任务, 缓存key {}, 执行时间 {},任务id {}", setDelayQueueName(), DateUtil.toString(triggerTime), jobId); + return result; + + } + + + /** + * 要实现延时队列的名字 + * @return 延时队列的名字 + */ + public abstract String setDelayQueueName(); + +} diff --git a/framework/src/main/java/cn/lili/trigger/delay/queue/PromotionDelayQueue.java b/framework/src/main/java/cn/lili/trigger/delay/queue/PromotionDelayQueue.java new file mode 100644 index 00000000..523756bb --- /dev/null +++ b/framework/src/main/java/cn/lili/trigger/delay/queue/PromotionDelayQueue.java @@ -0,0 +1,23 @@ +package cn.lili.trigger.delay.queue; + +import cn.lili.trigger.delay.AbstractDelayQueueMachineFactory; +import cn.lili.trigger.enums.DelayQueueEnums; +import org.springframework.stereotype.Component; + +/** + * 促销延迟队列 + * + * @author paulG + * @version v4.1 + * @since 2020/11/17 7:19 下午 + * @since 1 + */ +@Component +public class PromotionDelayQueue extends AbstractDelayQueueMachineFactory { + + + @Override + public String setDelayQueueName() { + return DelayQueueEnums.PROMOTION.name(); + } +} diff --git a/framework/src/main/java/cn/lili/trigger/enums/DelayQueueEnums.java b/framework/src/main/java/cn/lili/trigger/enums/DelayQueueEnums.java new file mode 100644 index 00000000..df1a488f --- /dev/null +++ b/framework/src/main/java/cn/lili/trigger/enums/DelayQueueEnums.java @@ -0,0 +1,21 @@ +package cn.lili.trigger.enums; + +/** + * 队列枚举 + * + * @author Bulbasaur + */ +public enum DelayQueueEnums { + + + /** + * 促销活动 + */ + PROMOTION("促销活动"); + + private String description; + + DelayQueueEnums(String description) { + this.description = description; + } +} diff --git a/framework/src/main/java/cn/lili/trigger/enums/DelayTypeEnums.java b/framework/src/main/java/cn/lili/trigger/enums/DelayTypeEnums.java new file mode 100644 index 00000000..85345f90 --- /dev/null +++ b/framework/src/main/java/cn/lili/trigger/enums/DelayTypeEnums.java @@ -0,0 +1,31 @@ +package cn.lili.trigger.enums; + +/** + * 延时任务类型 + * + * @author paulG + * @since 2021/5/7 + */ +public enum DelayTypeEnums { + + /** + * 促销活动 + */ + PROMOTION("促销活动"), + /** + * 拼团订单 + */ + PINTUAN_ORDER("拼团订单"), + + /** + * 直播 + */ + BROADCAST("直播"); + + private String description; + + DelayTypeEnums(String description) { + this.description = description; + } + +} diff --git a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTrigger.java b/framework/src/main/java/cn/lili/trigger/interfaces/TimeTrigger.java similarity index 53% rename from framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTrigger.java rename to framework/src/main/java/cn/lili/trigger/interfaces/TimeTrigger.java index b0099950..3e2e95b2 100644 --- a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTrigger.java +++ b/framework/src/main/java/cn/lili/trigger/interfaces/TimeTrigger.java @@ -1,6 +1,6 @@ -package cn.lili.common.trigger.interfaces; +package cn.lili.trigger.interfaces; -import cn.lili.common.trigger.model.TimeTriggerMsg; +import cn.lili.trigger.model.TimeTriggerMsg; /** * 延时执行接口 @@ -9,35 +9,20 @@ import cn.lili.common.trigger.model.TimeTriggerMsg; */ public interface TimeTrigger { - /** - * 添加延时任务 - * - * @param executorName 执行器beanId - * @param param 执行参数 - * @param triggerTime 执行时间 时间戳 秒为单位 - * @param uniqueKey 如果是一个 需要有 修改/取消 延时任务功能的延时任务,
- * 请填写此参数,作为后续删除,修改做为唯一凭证
- * 建议参数为:COUPON_{ACTIVITY_ID} 例如 coupon_123
- * 业务内全局唯一 - * @param topic rocketmq topic - */ - void add(String executorName, Object param, Long triggerTime, String uniqueKey, String topic); - /** * 添加延时任务 * * @param timeTriggerMsg 延时任务信息 */ - void add(TimeTriggerMsg timeTriggerMsg); + void addDelay(TimeTriggerMsg timeTriggerMsg); /** - * 添加延时任务 + * 执行延时任务 * * @param timeTriggerMsg 延时任务信息 - * @param delayTime 延时时间(秒) */ - void addDelay(TimeTriggerMsg timeTriggerMsg, int delayTime); + void execute(TimeTriggerMsg timeTriggerMsg); /** * 修改延时任务 diff --git a/framework/src/main/java/cn/lili/trigger/interfaces/impl/RocketmqTimerTrigger.java b/framework/src/main/java/cn/lili/trigger/interfaces/impl/RocketmqTimerTrigger.java new file mode 100644 index 00000000..32ce4084 --- /dev/null +++ b/framework/src/main/java/cn/lili/trigger/interfaces/impl/RocketmqTimerTrigger.java @@ -0,0 +1,99 @@ +package cn.lili.trigger.interfaces.impl; + +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.trigger.delay.queue.PromotionDelayQueue; +import cn.lili.trigger.interfaces.TimeTrigger; +import cn.lili.trigger.model.TimeTriggerMsg; +import cn.lili.trigger.util.DelayQueueTools; +import cn.lili.common.utils.DateUtil; +import cn.lili.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +/** + * 延时任务实现 + * + * @author paulG + * @since 2020/11/5 + **/ +@Component +@Slf4j +public class RocketmqTimerTrigger implements TimeTrigger { + @Autowired + private RocketMQTemplate rocketMQTemplate; + @Autowired + private Cache cache; + @Autowired + private PromotionDelayQueue promotionDelayQueue; + + + @Override + public void addDelay(TimeTriggerMsg timeTriggerMsg) { + //执行器唯一key + String uniqueKey = timeTriggerMsg.getUniqueKey(); + if (StringUtils.isEmpty(uniqueKey)) { + uniqueKey = StringUtils.getRandStr(10); + } + //执行任务key + String generateKey = DelayQueueTools.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), uniqueKey); + this.cache.put(generateKey, 1); + //设置延时任务 + if (Boolean.TRUE.equals(promotionDelayQueue.addJob(JSONUtil.toJsonStr(timeTriggerMsg), timeTriggerMsg.getTriggerTime()))) { + log.info("延时任务标识: {}", generateKey); + log.info("定时执行在【" + DateUtil.toString(timeTriggerMsg.getTriggerTime(), "yyyy-MM-dd HH:mm:ss") + "】,消费【" + timeTriggerMsg.getParam().toString() + "】"); + } else { + log.error("延时任务添加失败:{}", timeTriggerMsg); + } + } + + @Override + public void execute(TimeTriggerMsg timeTriggerMsg) { + this.addExecute(timeTriggerMsg.getTriggerExecutor(), + timeTriggerMsg.getParam(), + timeTriggerMsg.getTriggerTime(), + timeTriggerMsg.getUniqueKey(), + timeTriggerMsg.getTopic() + ); + } + + /** + * 将任务添加到mq,mq异步队列执行。 + *

+ * 本系统中redis相当于延时任务吊起机制,而mq才是实际的业务消费,执行任务的存在 + * + * @param executorName 执行器beanId + * @param param 执行参数 + * @param triggerTime 执行时间 时间戳 秒为单位 + * @param uniqueKey 如果是一个 需要有 修改/取消 延时任务功能的延时任务,
+ * 请填写此参数,作为后续删除,修改做为唯一凭证
+ * 建议参数为:COUPON_{ACTIVITY_ID} 例如 coupon_123
+ * 业务内全局唯一 + * @param topic rocketmq topic + */ + private void addExecute(String executorName, Object param, Long triggerTime, String uniqueKey, String topic) { + + TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic); + Message message = MessageBuilder.withPayload(timeTriggerMsg).build(); + log.info("延时任务发送信息:{}", message); + this.rocketMQTemplate.asyncSend(topic, message, RocketmqSendCallbackBuilder.commonCallback()); + } + + @Override + public void edit(String executorName, Object param, Long oldTriggerTime, Long triggerTime, String uniqueKey, int delayTime, String topic) { + this.delete(executorName, oldTriggerTime, uniqueKey, topic); + this.addDelay(new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic)); + } + + @Override + public void delete(String executorName, Long triggerTime, String uniqueKey, String topic) { + String generateKey = DelayQueueTools.generateKey(executorName, triggerTime, uniqueKey); + log.info("删除延时任务{}", generateKey); + this.cache.remove(generateKey); + } +} diff --git a/framework/src/main/java/cn/lili/trigger/message/BroadcastMessage.java b/framework/src/main/java/cn/lili/trigger/message/BroadcastMessage.java new file mode 100644 index 00000000..489fe303 --- /dev/null +++ b/framework/src/main/java/cn/lili/trigger/message/BroadcastMessage.java @@ -0,0 +1,31 @@ +package cn.lili.trigger.message; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 直播消息实体 + * + * @author Bulbasaur + * @since 2021/6/1 4:48 下午 + */ +@Data +@NoArgsConstructor +public class BroadcastMessage { + + /** + * 直播间ID + */ + private String studioId; + + /** + * 状态 + */ + private String status; + + + public BroadcastMessage(String studioId, String status) { + this.studioId = studioId; + this.status = status; + } +} diff --git a/framework/src/main/java/cn/lili/common/delayqueue/PintuanOrderMessage.java b/framework/src/main/java/cn/lili/trigger/message/PintuanOrderMessage.java similarity index 91% rename from framework/src/main/java/cn/lili/common/delayqueue/PintuanOrderMessage.java rename to framework/src/main/java/cn/lili/trigger/message/PintuanOrderMessage.java index 75b17a11..b331ee22 100644 --- a/framework/src/main/java/cn/lili/common/delayqueue/PintuanOrderMessage.java +++ b/framework/src/main/java/cn/lili/trigger/message/PintuanOrderMessage.java @@ -1,4 +1,4 @@ -package cn.lili.common.delayqueue; +package cn.lili.trigger.message; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/framework/src/main/java/cn/lili/common/delayqueue/PromotionMessage.java b/framework/src/main/java/cn/lili/trigger/message/PromotionMessage.java similarity index 55% rename from framework/src/main/java/cn/lili/common/delayqueue/PromotionMessage.java rename to framework/src/main/java/cn/lili/trigger/message/PromotionMessage.java index c266f022..a49c907c 100644 --- a/framework/src/main/java/cn/lili/common/delayqueue/PromotionMessage.java +++ b/framework/src/main/java/cn/lili/trigger/message/PromotionMessage.java @@ -1,7 +1,5 @@ -package cn.lili.common.delayqueue; +package cn.lili.trigger.message; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,7 +10,7 @@ import java.util.Date; * 信息队列传输促销信息实体 * * @author paulG - * @date 2020/10/30 + * @since 2020/10/30 **/ @Data @AllArgsConstructor @@ -43,10 +41,4 @@ public class PromotionMessage { */ private Date endTime; - public UpdateWrapper updateWrapper() { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", promotionId); - updateWrapper.set("promotion_status", PromotionStatusEnum.valueOf(promotionStatus)); - return updateWrapper; - } } diff --git a/framework/src/main/java/cn/lili/trigger/model/TimeExecuteConstant.java b/framework/src/main/java/cn/lili/trigger/model/TimeExecuteConstant.java new file mode 100644 index 00000000..b0e3da8d --- /dev/null +++ b/framework/src/main/java/cn/lili/trigger/model/TimeExecuteConstant.java @@ -0,0 +1,21 @@ +package cn.lili.trigger.model; + +/** + * 延时任务执行器常量 + * + * @author paulG + * @since 2020/8/20 + **/ +public interface TimeExecuteConstant { + + /** + * 促销延迟加载执行器 + */ + public static final String PROMOTION_EXECUTOR = "promotionTimeTriggerExecutor"; + + /** + * 直播间延迟加载执行器 + */ + public static final String BROADCAST_EXECUTOR = "broadcastTimeTriggerExecutor"; + +} diff --git a/framework/src/main/java/cn/lili/common/trigger/model/TimeTriggerMsg.java b/framework/src/main/java/cn/lili/trigger/model/TimeTriggerMsg.java similarity index 95% rename from framework/src/main/java/cn/lili/common/trigger/model/TimeTriggerMsg.java rename to framework/src/main/java/cn/lili/trigger/model/TimeTriggerMsg.java index 09ed7b00..8b620c00 100644 --- a/framework/src/main/java/cn/lili/common/trigger/model/TimeTriggerMsg.java +++ b/framework/src/main/java/cn/lili/trigger/model/TimeTriggerMsg.java @@ -1,4 +1,4 @@ -package cn.lili.common.trigger.model; +package cn.lili.trigger.model; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/framework/src/main/java/cn/lili/common/trigger/util/TimeTriggerUtil.java b/framework/src/main/java/cn/lili/trigger/util/DelayQueueTools.java similarity index 52% rename from framework/src/main/java/cn/lili/common/trigger/util/TimeTriggerUtil.java rename to framework/src/main/java/cn/lili/trigger/util/DelayQueueTools.java index 7475c10d..22074a45 100644 --- a/framework/src/main/java/cn/lili/common/trigger/util/TimeTriggerUtil.java +++ b/framework/src/main/java/cn/lili/trigger/util/DelayQueueTools.java @@ -1,17 +1,32 @@ -package cn.lili.common.trigger.util; +package cn.lili.trigger.util; + +import cn.lili.trigger.enums.DelayTypeEnums; /** - * 延时任务mq实现内容,提供加密算法以及任务前缀参数 + * 延时任务工具类 * - * @author Chopper - */ -public class TimeTriggerUtil { + * @author paulG + * @since 2021/5/7 + **/ +public class DelayQueueTools { /** * 前缀 */ private static final String PREFIX = "{rocketmq_trigger}_"; + /** + * 组装延时任务唯一键 + * + * @param type 延时任务类型 + * @param id id + * @return 唯一键 + */ + public static String wrapperUniqueKey(DelayTypeEnums type, String id) { + return "{TIME_TRIGGER_" + type.name() + "}_" + id; + } + + /** * 生成延时任务标识key * @@ -24,5 +39,4 @@ public class TimeTriggerUtil { return PREFIX + (executorName + triggerTime + uniqueKey).hashCode(); } - } diff --git a/framework/src/main/resources/banner.txt b/framework/src/main/resources/banner.txt index be6731c5..ee9c3e52 100644 --- a/framework/src/main/resources/banner.txt +++ b/framework/src/main/resources/banner.txt @@ -1,19 +1,9 @@ - ___ ___ ___ ___ ________ ________ _______ ________ _____ ______ ___ __ ________ ________ ___ __ -|\ \ |\ \|\ \ |\ \ |\ _____\\ __ \|\ ___ \ |\ __ \|\ _ \ _ \|\ \ |\ \|\ __ \|\ __ \|\ \|\ \ -\ \ \ \ \ \ \ \ \ \ \ ____________\ \ \__/\ \ \|\ \ \ __/|\ \ \|\ \ \ \\\__\ \ \ \ \ \ \ \ \ \|\ \ \ \|\ \ \ \/ /|_ - \ \ \ \ \ \ \ \ \ \ \|\____________\ \ __\\ \ _ _\ \ \_|/_\ \ __ \ \ \\|__| \ \ \ \ __\ \ \ \ \\\ \ \ _ _\ \ ___ \ - \ \ \____\ \ \ \ \____\ \ \|____________|\ \ \_| \ \ \\ \\ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \|\__\_\ \ \ \\\ \ \ \\ \\ \ \\ \ \ - \ \_______\ \__\ \_______\ \__\ \ \__\ \ \__\\ _\\ \_______\ \__\ \__\ \__\ \ \__\ \____________\ \_______\ \__\\ _\\ \__\\ \__\ - \|_______|\|__|\|_______|\|__| \|__| \|__|\|__|\|_______|\|__|\|__|\|__| \|__|\|____________|\|_______|\|__|\|__|\|__| \|__| - - - - ___ ___ ___ ___ ________ ___ ___ ________ ________ - |\ \ |\ \|\ \ |\ \ |\ ____\|\ \|\ \|\ __ \|\ __ \ - \ \ \ \ \ \ \ \ \ \ \ ____________\ \ \___|\ \ \\\ \ \ \|\ \ \ \|\ \ - \ \ \ \ \ \ \ \ \ \ \|\____________\ \_____ \ \ __ \ \ \\\ \ \ ____\ - \ \ \____\ \ \ \ \____\ \ \|____________|\|____|\ \ \ \ \ \ \ \\\ \ \ \___| - \ \_______\ \__\ \_______\ \__\ ____\_\ \ \__\ \__\ \_______\ \__\ - \|_______|\|__|\|_______|\|__| |\_________\|__|\|__|\|_______|\|__| - \|_________| +${AnsiColor.CYAN} ___ ___ ___ ___ ________ ___ ___ ________ ________ +${AnsiColor.CYAN} |\ \ |\ \|\ \ |\ \ |\ ____\|\ \|\ \|\ __ \|\ __ \ +${AnsiColor.CYAN} \ \ \ \ \ \ \ \ \ \ \ ____________\ \ \___|\ \ \\\ \ \ \|\ \ \ \|\ \ +${AnsiColor.CYAN} \ \ \ \ \ \ \ \ \ \ \|\____________\ \_____ \ \ __ \ \ \\\ \ \ ____\ +${AnsiColor.CYAN} \ \ \____\ \ \ \ \____\ \ \|____________|\|____|\ \ \ \ \ \ \ \\\ \ \ \___| +${AnsiColor.CYAN} \ \_______\ \__\ \_______\ \__\ ____\_\ \ \__\ \__\ \_______\ \__\ +${AnsiColor.CYAN} \|_______|\|__|\|_______|\|__| |\_________\|__|\|__|\|_______|\|__| +${AnsiColor.CYAN} \|_________| diff --git a/framework/src/main/resources/hibernate.properties b/framework/src/main/resources/hibernate.properties deleted file mode 100644 index c0d0fe46..00000000 --- a/framework/src/main/resources/hibernate.properties +++ /dev/null @@ -1,2 +0,0 @@ -# 自动生成数据库表引擎为InnoDB -hibernate.dialect.storage_engine=innodb diff --git a/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn.csr b/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn.csr deleted file mode 100644 index d16c6275..00000000 --- a/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn.csr +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIC2DCCAcACAQAwgZIxDzANBgNVBAYMBuS4reWbvTEPMA0GA1UECAwG5YyX5Lqs -MQ8wDQYDVQQHDAbmtbfmt4AxLTArBgNVBAoMJOWMl+S6rOWuj+S4muaxh+aIkOen -keaKgOaciemZkOWFrOWPuDEPMA0GA1UECwwG5oqA5pyvMR0wGwYDVQQDExR6MTcx -bDkxNjA2LjUxbXlwYy5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AIfj8IYemfNMBLuN6o+rXTHYoCpKadfaYFDaKTCPdqZVnf0l6dBie9xqx7dxc+40 -T8NlylJdbnVzerKGjtOcRQ3xDZp/bcciL3T0MvZ0e/zP5/Zx4U9biuOtBaZbu4yx -i8pDFZAn4/rIgwf/tChPg2y1hs+JpDxQWvhA/1TxNTBH0k3fN7HBsDDmdabPdVVW -d245vR08vhOZYv3d/SWCymHvJW+20W3cZDYUBfuNyswQ5T6sWL3eopOwPOWkOfIF -U7eEVuVHUeVKAggdYTV5lSUQbVjKrHVh/AndaslAgNLX2Vl5RHmvI9+aOtXX+edz -zs8mLVRMHSV3Opd4aJCzzf8CAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4IBAQASJKf5 -xBRd63zynwTWebIHKvJumWMI4jhS7Sk3SnRICc+ZihlM0K0R/kR00MpRkiLDu7j6 -uPWD/lcQwDDRzDsuN9iRHjpUiexSkgrtgX8BYHJkLTUOD2fuBpf8C0yonepeGM3B -jRsCS1O2BT1/pHVJTbCdqx95/U9Vwjaiddckh8LpFLUUB09i3XYsnbNzTCaIHp2K -/NqgkEptZswQfT2Vfiz1xrrtLZpaesnUaDryqUbg13QmB+cvkHxbJnyVkeFEDSTW -oAfmttYSDQ+Ihz5SjB2POSXNB95QkfzK+vkalEIO7kYBQ3YAojTBv2ORsy1trpgu -1erWy6VN36go9zfK ------END CERTIFICATE REQUEST----- diff --git a/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn_公钥.txt b/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn_公钥.txt deleted file mode 100644 index 08ec401c..00000000 --- a/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn_公钥.txt +++ /dev/null @@ -1 +0,0 @@ -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh+Pwhh6Z80wEu43qj6tdMdigKkpp19pgUNopMI92plWd/SXp0GJ73GrHt3Fz7jRPw2XKUl1udXN6soaO05xFDfENmn9txyIvdPQy9nR7/M/n9nHhT1uK460Fplu7jLGLykMVkCfj+siDB/+0KE+DbLWGz4mkPFBa+ED/VPE1MEfSTd83scGwMOZ1ps91VVZ3bjm9HTy+E5li/d39JYLKYe8lb7bRbdxkNhQF+43KzBDlPqxYvd6ik7A85aQ58gVTt4RW5UdR5UoCCB1hNXmVJRBtWMqsdWH8Cd1qyUCA0tfZWXlEea8j35o61df553POzyYtVEwdJXc6l3hokLPN/wIDAQAB \ No newline at end of file diff --git a/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn_私钥.txt b/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn_私钥.txt deleted file mode 100644 index d881e959..00000000 --- a/framework/src/main/resources/lili-alipay/CSR/z171l91606.51mypc.cn_私钥.txt +++ /dev/null @@ -1 +0,0 @@ -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCH4/CGHpnzTAS7jeqPq10x2KAqSmnX2mBQ2ikwj3amVZ39JenQYnvcase3cXPuNE/DZcpSXW51c3qyho7TnEUN8Q2af23HIi909DL2dHv8z+f2ceFPW4rjrQWmW7uMsYvKQxWQJ+P6yIMH/7QoT4NstYbPiaQ8UFr4QP9U8TUwR9JN3zexwbAw5nWmz3VVVnduOb0dPL4TmWL93f0lgsph7yVvttFt3GQ2FAX7jcrMEOU+rFi93qKTsDzlpDnyBVO3hFblR1HlSgIIHWE1eZUlEG1Yyqx1YfwJ3WrJQIDS19lZeUR5ryPfmjrV1/nnc87PJi1UTB0ldzqXeGiQs83/AgMBAAECggEAd//IeZdyWY/qqfkThlVMUeU64r2do/h6j0tnjjNSEmaOwmqFg/hD6ov82zh7qIFXYnRz6rIJBfy5AAek/qcDr+ELI0CeH3hHsh6nFk4c405xR4ae8WYkSxOSZqqg/wgWKsF8vDUNtHr2gszCOcqlgwz2BDVG6+AFxS4Yi9kJIB0khnu8ClE+z35mplDvuDdAYH3/SrJMEdOcMEyE7+7PV1nuXSpyYWqa8UQL1pFvy2mD/mXnBXV3vQi8Qdcc3E2MTsZUg3k+2FYQANdsrYLofpZw28Go4hpWZpdw7BA8fYh/8Gl0is9omTgonj7EZF2MpIEikOhoGPT/Dfnxlgw6gQKBgQD6W6Qsi5pz851kuzQhgMWOAOyA9iKrrV9yfIID2jxrBLFk2rzQm2cRhid9+UgvWDAWJA3pwC448L7T6U9ku48kfI60oQh/P/YaTP3CKwPlzJdNk4FNHWhESjZ95qe4deJCOgKzN9qSKWJQFQNDN362/gWxuK/XMlimC6q3YEY8vwKBgQCK8+oynpgwMyi9GeDPsifsHzrlbEYK02YyQZ0ikUlSXyssx6Fzm4lULI9Yh2m5LLdeOLreyLGUXpf/PWdOf47OqzPUxBE7qTrLyKlyGl9vUESTXBXL2AMX44t79djatDHfFHycLpWBmmZ2KW1CR0oPJqxseHPnkHZR5c24eqZ+wQKBgQD3LQMp96rGT/9VNH6DlV92k/LsYBZa6RETN1ol85EzF68Mo+lHDCb2Zj0XYsah96+CLJaP8e2wyf+duPtpuMPagh9itpptB/kyflELIuz2NMgtDzTZre8DfUHPi6qLs9dvC1cfGkXxiGpIJnbSJjg08xcsH+t7y3k6dspVwfeWgQKBgAmnzVxbHOQsieYqCC8miBOmT+dlULCr4+wWFx8xzVCGAHAKJzPrWO2acxOJxVTywIMxmfqlI4HV2OYJlEYmIvxFdUKRpUjqB4XlmbCuGHeZskozGeiiSAS+8RBaEwmPf++qcsY/jnAFFJ2dX1Q9s+29mDmpXRR4O2CRgWwSScOBAoGAWkovHm4T7KvujeN2ZzQ9b1u2BosBMW14J8C0RgW6hR1Twjk61pv7tjcSfZdQmD1ss8aqR2byFGJq86vRjE4tsFbPCSitF01xRbvSExGAb8ZI5fJoNiQPTuIvkW7chvrzj2KWuffkjcivhQJ6ExlWco3ncqRQ6QMPoaE0xNPqGuE= \ No newline at end of file diff --git a/framework/src/main/resources/lili-alipay/alipayCertPublicKey_RSA2.crt b/framework/src/main/resources/lili-alipay/alipayCertPublicKey_RSA2.crt deleted file mode 100644 index 50817761..00000000 --- a/framework/src/main/resources/lili-alipay/alipayCertPublicKey_RSA2.crt +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDsjCCApqgAwIBAgIQICASFdUt4pOdF6AF49Xo2TANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE -BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs -YXNzIDIgUjEwHhcNMjAxMjE1MTAzMDUwWhcNMjIxMjE1MTAzMDUwWjCBkjELMAkGA1UEBhMCQ04x -LTArBgNVBAoMJOWMl+S6rOWuj+S4muaxh+aIkOenkeaKgOaciemZkOWFrOWPuDEPMA0GA1UECwwG -QWxpcGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZkOWFrOWP -uC0yMDg4NzMxNDAxODM4MzQ2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjTjdq5cN -F/7o1pFf8woNQkWget8kmJb/pKwbZWUWrH8lv+BUzCJIrZDC/QnlPGEmC6D8zHVs8CTm73XuRzmu -y6zapUYAhY4Zwd9NC1izZxSkuS7KHfKltaCcRCfEbIQpILL7rTIazBDlgBYRFFaeWF1g1uXrgzt/ -axTg8D/sQN2QwkpdAue1WyXo8OTIxULdkNSISw6BRrTisncrD6TwXtth+okVDEaU5JUrtTBzapdM -WCGqM4dIT9nSAZ7ibRNAbtC41rCHYBGELtDcSkrrLpWyiGRTnyJ9HgdiQlhY5SG1nKmPvrRuTpgR -LZqGAC2rmXv/ymDtYa6Ldw9zB64yDwIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJKoZIhvcN -AQELBQADggEBAGJzZpqeMk0/TbgEaAqXe33w7hhYRDt3K70r7R4J4U5DXm3gbXX6Mw/wOq2/ZR4/ -BswxkwbOsAxkAG2Be3ShjW4FD1r54bWZJNYpXKRUEoCEZvIeLH+bRTCnr9y5NFxTTXXiT2NS6Oox -JaSDymQHX0DrgiA+9L/8xMuibe16/zHcSTMUSrCk1CHhw8QDFHtxUa4pe6DwRsqVoQbfp+Rw9wM8 -7FdHpAXT5Mnchl5d0jywTAa1EAFfZ6hty9/XiFI9ferUdqMUdI8SnTe6tx67+QIY8lOyUh3ZmITM -GnoWdjLdHlSHHCrTA7SauhylhwhsjPaLCdTq8q2jwQhmmhwNVnM= ------END CERTIFICATE----- diff --git a/framework/src/main/resources/lili-alipay/alipayRootCert.crt b/framework/src/main/resources/lili-alipay/alipayRootCert.crt deleted file mode 100644 index d370e5b3..00000000 --- a/framework/src/main/resources/lili-alipay/alipayRootCert.crt +++ /dev/null @@ -1,88 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBszCCAVegAwIBAgIIaeL+wBcKxnswDAYIKoEcz1UBg3UFADAuMQswCQYDVQQG -EwJDTjEOMAwGA1UECgwFTlJDQUMxDzANBgNVBAMMBlJPT1RDQTAeFw0xMjA3MTQw -MzExNTlaFw00MjA3MDcwMzExNTlaMC4xCzAJBgNVBAYTAkNOMQ4wDAYDVQQKDAVO -UkNBQzEPMA0GA1UEAwwGUk9PVENBMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE -MPCca6pmgcchsTf2UnBeL9rtp4nw+itk1Kzrmbnqo05lUwkwlWK+4OIrtFdAqnRT -V7Q9v1htkv42TsIutzd126NdMFswHwYDVR0jBBgwFoAUTDKxl9kzG8SmBcHG5Yti -W/CXdlgwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFEwysZfZ -MxvEpgXBxuWLYlvwl3ZYMAwGCCqBHM9VAYN1BQADSAAwRQIgG1bSLeOXp3oB8H7b -53W+CKOPl2PknmWEq/lMhtn25HkCIQDaHDgWxWFtnCrBjH16/W3Ezn7/U/Vjo5xI -pDoiVhsLwg== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIF0zCCA7ugAwIBAgIIH8+hjWpIDREwDQYJKoZIhvcNAQELBQAwejELMAkGA1UE -BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMyMTEzNDg0MFoXDTM4MDIyODEzNDg0 -MFowejELMAkGA1UEBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNV -BAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEAtytTRcBNuur5h8xuxnlKJetT65cHGemGi8oD+beHFPTk -rUTlFt9Xn7fAVGo6QSsPb9uGLpUFGEdGmbsQ2q9cV4P89qkH04VzIPwT7AywJdt2 -xAvMs+MgHFJzOYfL1QkdOOVO7NwKxH8IvlQgFabWomWk2Ei9WfUyxFjVO1LVh0Bp -dRBeWLMkdudx0tl3+21t1apnReFNQ5nfX29xeSxIhesaMHDZFViO/DXDNW2BcTs6 -vSWKyJ4YIIIzStumD8K1xMsoaZBMDxg4itjWFaKRgNuPiIn4kjDY3kC66Sl/6yTl -YUz8AybbEsICZzssdZh7jcNb1VRfk79lgAprm/Ktl+mgrU1gaMGP1OE25JCbqli1 -Pbw/BpPynyP9+XulE+2mxFwTYhKAwpDIDKuYsFUXuo8t261pCovI1CXFzAQM2w7H -DtA2nOXSW6q0jGDJ5+WauH+K8ZSvA6x4sFo4u0KNCx0ROTBpLif6GTngqo3sj+98 -SZiMNLFMQoQkjkdN5Q5g9N6CFZPVZ6QpO0JcIc7S1le/g9z5iBKnifrKxy0TQjtG -PsDwc8ubPnRm/F82RReCoyNyx63indpgFfhN7+KxUIQ9cOwwTvemmor0A+ZQamRe -9LMuiEfEaWUDK+6O0Gl8lO571uI5onYdN1VIgOmwFbe+D8TcuzVjIZ/zvHrAGUcC -AwEAAaNdMFswCwYDVR0PBAQDAgEGMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFF90 -tATATwda6uWx2yKjh0GynOEBMB8GA1UdIwQYMBaAFF90tATATwda6uWx2yKjh0Gy -nOEBMA0GCSqGSIb3DQEBCwUAA4ICAQCVYaOtqOLIpsrEikE5lb+UARNSFJg6tpkf -tJ2U8QF/DejemEHx5IClQu6ajxjtu0Aie4/3UnIXop8nH/Q57l+Wyt9T7N2WPiNq -JSlYKYbJpPF8LXbuKYG3BTFTdOVFIeRe2NUyYh/xs6bXGr4WKTXb3qBmzR02FSy3 -IODQw5Q6zpXj8prYqFHYsOvGCEc1CwJaSaYwRhTkFedJUxiyhyB5GQwoFfExCVHW -05ZFCAVYFldCJvUzfzrWubN6wX0DD2dwultgmldOn/W/n8at52mpPNvIdbZb2F41 -T0YZeoWnCJrYXjq/32oc1cmifIHqySnyMnavi75DxPCdZsCOpSAT4j4lAQRGsfgI -kkLPGQieMfNNkMCKh7qjwdXAVtdqhf0RVtFILH3OyEodlk1HYXqX5iE5wlaKzDop -PKwf2Q3BErq1xChYGGVS+dEvyXc/2nIBlt7uLWKp4XFjqekKbaGaLJdjYP5b2s7N -1dM0MXQ/f8XoXKBkJNzEiM3hfsU6DOREgMc1DIsFKxfuMwX3EkVQM1If8ghb6x5Y -jXayv+NLbidOSzk4vl5QwngO/JYFMkoc6i9LNwEaEtR9PhnrdubxmrtM+RjfBm02 -77q3dSWFESFQ4QxYWew4pHE0DpWbWy/iMIKQ6UZ5RLvB8GEcgt8ON7BBJeMc+Dyi -kT9qhqn+lw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICiDCCAgygAwIBAgIIQX76UsB/30owDAYIKoZIzj0EAwMFADB6MQswCQYDVQQG -EwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UECwwXQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNpYWwgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgRTEwHhcNMTkwNDI4MTYyMDQ0WhcNNDkwNDIwMTYyMDQ0 -WjB6MQswCQYDVQQGEwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UE -CwwXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNp -YWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRTEwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAASCCRa94QI0vR5Up9Yr9HEupz6hSoyjySYqo7v837KnmjveUIUNiuC9pWAU -WP3jwLX3HkzeiNdeg22a0IZPoSUCpasufiLAnfXh6NInLiWBrjLJXDSGaY7vaokt -rpZvAdmjXTBbMAsGA1UdDwQEAwIBBjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRZ -4ZTgDpksHL2qcpkFkxD2zVd16TAfBgNVHSMEGDAWgBRZ4ZTgDpksHL2qcpkFkxD2 -zVd16TAMBggqhkjOPQQDAwUAA2gAMGUCMQD4IoqT2hTUn0jt7oXLdMJ8q4vLp6sg -wHfPiOr9gxreb+e6Oidwd2LDnC4OUqCWiF8CMAzwKs4SnDJYcMLf2vpkbuVE4dTH -Rglz+HGcTLWsFs4KxLsq7MuU+vJTBUeDJeDjdA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIUEMdk6dVgOEIS2cCP0Q43P90Ps5YwDQYJKoZIhvcNAQEF -BQAwajELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM -E0NoaW5hIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMMH2lUcnVzQ2hpbmEgQ2xhc3Mg -MiBSb290IENBIC0gRzMwHhcNMTMwNDE4MDkzNjU2WhcNMzMwNDE4MDkzNjU2WjBq -MQswCQYDVQQGEwJDTjETMBEGA1UECgwKaVRydXNDaGluYTEcMBoGA1UECwwTQ2hp -bmEgVHJ1c3QgTmV0d29yazEoMCYGA1UEAwwfaVRydXNDaGluYSBDbGFzcyAyIFJv -b3QgQ0EgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOPPShpV -nJbMqqCw6Bz1kehnoPst9pkr0V9idOwU2oyS47/HjJXk9Rd5a9xfwkPO88trUpz5 -4GmmwspDXjVFu9L0eFaRuH3KMha1Ak01citbF7cQLJlS7XI+tpkTGHEY5pt3EsQg -wykfZl/A1jrnSkspMS997r2Gim54cwz+mTMgDRhZsKK/lbOeBPpWtcFizjXYCqhw -WktvQfZBYi6o4sHCshnOswi4yV1p+LuFcQ2ciYdWvULh1eZhLxHbGXyznYHi0dGN -z+I9H8aXxqAQfHVhbdHNzi77hCxFjOy+hHrGsyzjrd2swVQ2iUWP8BfEQqGLqM1g -KgWKYfcTGdbPB1MCAwEAAaNjMGEwHQYDVR0OBBYEFG/oAMxTVe7y0+408CTAK8hA -uTyRMB8GA1UdIwQYMBaAFG/oAMxTVe7y0+408CTAK8hAuTyRMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBLnUTfW7hp -emMbuUGCk7RBswzOT83bDM6824EkUnf+X0iKS95SUNGeeSWK2o/3ALJo5hi7GZr3 -U8eLaWAcYizfO99UXMRBPw5PRR+gXGEronGUugLpxsjuynoLQu8GQAeysSXKbN1I -UugDo9u8igJORYA+5ms0s5sCUySqbQ2R5z/GoceyI9LdxIVa1RjVX8pYOj8JFwtn -DJN3ftSFvNMYwRuILKuqUYSHc2GPYiHVflDh5nDymCMOQFcFG3WsEuB+EYQPFgIU -1DHmdZcz7Llx8UOZXX2JupWCYzK1XhJb+r4hK5ncf/w8qGtYlmyJpxk3hr1TfUJX -Yf4Zr0fJsGuv ------END CERTIFICATE----- \ No newline at end of file diff --git a/framework/src/main/resources/lili-alipay/appCertPublicKey_2021002107649773.crt b/framework/src/main/resources/lili-alipay/appCertPublicKey_2021002107649773.crt deleted file mode 100644 index 3d76730b..00000000 --- a/framework/src/main/resources/lili-alipay/appCertPublicKey_2021002107649773.crt +++ /dev/null @@ -1,24 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEsTCCA5mgAwIBAgIQICASFoAHYjkCdKIRVlK0fjANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE -BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs -YXNzIDEgUjEwHhcNMjAxMjE2MTEyNTUyWhcNMjIxMjE2MTEyNTUyWjB5MQswCQYDVQQGEwJDTjEt -MCsGA1UECgwk5YyX5Lqs5a6P5Lia5rGH5oiQ56eR5oqA5pyJ6ZmQ5YWs5Y+4MQ8wDQYDVQQLDAZB -bGlwYXkxKjAoBgNVBAMMITIwODg3MzE0MDE4MzgzNDYtMjAyMTAwMjEwNzY0OTc3MzCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAIfj8IYemfNMBLuN6o+rXTHYoCpKadfaYFDaKTCPdqZV -nf0l6dBie9xqx7dxc+40T8NlylJdbnVzerKGjtOcRQ3xDZp/bcciL3T0MvZ0e/zP5/Zx4U9biuOt -BaZbu4yxi8pDFZAn4/rIgwf/tChPg2y1hs+JpDxQWvhA/1TxNTBH0k3fN7HBsDDmdabPdVVWd245 -vR08vhOZYv3d/SWCymHvJW+20W3cZDYUBfuNyswQ5T6sWL3eopOwPOWkOfIFU7eEVuVHUeVKAggd -YTV5lSUQbVjKrHVh/AndaslAgNLX2Vl5RHmvI9+aOtXX+edzzs8mLVRMHSV3Opd4aJCzzf8CAwEA -AaOCASkwggElMB8GA1UdIwQYMBaAFHEH4gRhFuTl8mXrMQ/J4PQ8mtWRMB0GA1UdDgQWBBS9rOZn -eNQ2jrdlC4nkw8nw+Rn3xDBABgNVHSAEOTA3MDUGB2CBHAFuAQEwKjAoBggrBgEFBQcCARYcaHR0 -cDovL2NhLmFsaXBheS5jb20vY3BzLnBkZjAOBgNVHQ8BAf8EBAMCBsAwLwYDVR0fBCgwJjAkoCKg -IIYeaHR0cDovL2NhLmFsaXBheS5jb20vY3JsNDguY3JsMGAGCCsGAQUFBwEBBFQwUjAoBggrBgEF -BQcwAoYcaHR0cDovL2NhLmFsaXBheS5jb20vY2E2LmNlcjAmBggrBgEFBQcwAYYaaHR0cDovL2Nh -LmFsaXBheS5jb206ODM0MC8wDQYJKoZIhvcNAQELBQADggEBAEkTDAVJ15SzJbSq85qASGxHPOl6 -XUrgZQRQJX9zkgkXd98O5PQmoEgLx9EssAUaUuEsEUkIueDsp8uMiw6Ndj73pNJs6uoYiTVc9Bbk -fE4Cl+zxHqJRat0/ifSnEKnn668d2Mwcrlm6ygbsPi4dm9cVTy+a/09LQH+LD3jyL0/SetBYvNes -b//0xCTNNqRkedsJjjs01oR1P6RWfkoeF6yICGblsHkKUgekKzCEAo2B1tePi1zY2hF+51GPLTDk -sH+8gqJRtJqqQA2YoghxXen61Tw4DFx6t+z1YmAOJXnTfjnv7W+9fmBA4acHqrU6nq/rxoSl5uuK -b2OxNEwyTfs= ------END CERTIFICATE----- \ No newline at end of file diff --git a/framework/src/main/resources/lili-wechat/apiclient_cert.p12 b/framework/src/main/resources/lili-wechat/apiclient_cert.p12 deleted file mode 100644 index 8615edff..00000000 Binary files a/framework/src/main/resources/lili-wechat/apiclient_cert.p12 and /dev/null differ diff --git a/framework/src/main/resources/lili-wechat/apiclient_cert.pem b/framework/src/main/resources/lili-wechat/apiclient_cert.pem deleted file mode 100644 index c0502c8a..00000000 --- a/framework/src/main/resources/lili-wechat/apiclient_cert.pem +++ /dev/null @@ -1,24 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID8DCCAtigAwIBAgIUMHAf6+fRKNPVyiRvVOwGwAiFCfIwDQYJKoZIhvcNAQEL -BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT -FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg -Q0EwHhcNMjAwMTEzMDMyMDQwWhcNMjUwMTExMDMyMDQwWjCBgTETMBEGA1UEAwwK -MTU3NDE4MTIxMTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL -DCTljJfkuqzlro/kuJrmsYfmiJDnp5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYM -AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAPUtUG5V+OoOxXsoYALT6xY4xJqhy2zlGwQZ238cl4e4lM2SWFxx+8AW -7Vu1cPx+c1xqkWQqCxhD+UYT7Tap9o5TlCTaQ5ZCkU3X1o8rtpJTR83eHHJUELqu -+SB0v+8Fhbe8ekb+4b3mf31aqzla3bglfpxsj8WofmF3ZM2CPw1L7zrt+F9GbdjA -ObipcLLeq0OoJg9r5oJPEPZPQ3/vkAoDf+8Cyat9sUoyNeui+8aO7qliBV6Q7SiY -NfsGg3xe8THtNTxJtMj/NAe7blGciNvIPLV/9ipS0lOCI0tv/8kCcXaWxjLX8XUB -Ei2bkKSSzVpNZh7OH9RzLlXGzXpQrhMCAwEAAaOBgTB/MAkGA1UdEwQCMAAwCwYD -VR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVzLmNv -bS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1 -NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAu38/E6xw/cr+SDQA -KFFVByBtMIBcISHKAuMdyM1LXefvpTqDivtcn/ZiEI96y47h48P+QkLseoFw/k+q -r8/+02pBZHMlnRpXeE0DexoB2pNR+lGAmhDll0qHL9ycSj1tS4/auFlDrljY/ike -5t40x67hfcKfFKUhv1zhekoX38ri4UTR0T/OqzPii2Zr7CTbGEoSDXy7Xjolp6BL -vrbNkwzchJbLRQRmyXILJ1MWzAGJNafLUKChBa/pxnxp+KEvExQ/LN0/5T/DfYev -XFjRlGGfIzVUEopo2O56/phO4y+VMspsuos2TeFunZInCQDoUo0AynUhi4Ipqjwe -M8Pjow== ------END CERTIFICATE----- diff --git a/framework/src/main/resources/lili-wechat/apiclient_key.pem b/framework/src/main/resources/lili-wechat/apiclient_key.pem deleted file mode 100644 index c3915749..00000000 --- a/framework/src/main/resources/lili-wechat/apiclient_key.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQD1LVBuVfjqDsV7 -KGAC0+sWOMSaocts5RsEGdt/HJeHuJTNklhccfvAFu1btXD8fnNcapFkKgsYQ/lG -E+02qfaOU5Qk2kOWQpFN19aPK7aSU0fN3hxyVBC6rvkgdL/vBYW3vHpG/uG95n99 -Wqs5Wt24JX6cbI/FqH5hd2TNgj8NS+867fhfRm3YwDm4qXCy3qtDqCYPa+aCTxD2 -T0N/75AKA3/vAsmrfbFKMjXrovvGju6pYgVekO0omDX7BoN8XvEx7TU8SbTI/zQH -u25RnIjbyDy1f/YqUtJTgiNLb//JAnF2lsYy1/F1ARItm5Ckks1aTWYezh/Ucy5V -xs16UK4TAgMBAAECggEBAMdEUherFkidQtHrKcWCmZIRB3GqSFy0BHYb0fMIuPud -AIvoApr4JSWlPLsJx8/fskENeCeRqDzLmkDjlyuTjgl1UnV1U/M/HTvITeFFJPje -aQCgIjylqIciCObhHNHWiiygKj2jkLO4MCwg0gMmoAe3qaTW8y8x1629zRbeYgKZ -+pIt4ZK/Ditj1P+fn9YfP+5poYsYoEm2G5MgxJZ9Z8Y4X0HFNw5RZVUeAVHskmke -dPsZlR9JdncCaXwh1nd7guWpARjqykKoPBcZzzJ2/PpkEZvlp36mMRRhisUANit+ -Irjnh0sA7Di8R0+IqPiuSegN3n8dRfuxfq+A2lGeLZkCgYEA+4e9h7fgpyTiAs/s -8La+NE+dXK4RamrHH/zZun72SR3VLMWrgEQ13p1jVJ4tGOvGdNbWMiYSGGwYubrL -sL+W1pzKpFL+dV7SEZ84nB13WiE7bjhXtTcoOKT2P57JszqZe1tKTBWaLycWPy8e -mo72NQJg2QLahi36KuHCkpAa5NcCgYEA+Yir+VLW/Y2bL5oA7/qrjfsw5RbPI1DV -O4k6mARaPXEb5U+upitZtBr7nRu8i2/Yw3H/VJV3vjyGZ2J/ApTI8DN2+k+LpQKN -nBCd0heCXy69GU+zB5ZAHmkluCWxWjZF8VHLaBzTrmOoboR4M2PfuYTKZCV5Qkxs -F7w1DUwg3SUCgYEAsb23Abu/JX2btE8H6QXJnJ+R3JcouWFg+sqrdO0YzowlQrEg -QtBwnLHtKjNoPM8HezMBQ4jBir6ALmbAX1LTnS5IyBvZskjh+w/fafosh+Up4PYx -jF3Ar15qoIRtlZhYMuJMuz0cqitdviJm5uMVOlpG47LvhpfgywKjgvwP9RsCgYEA -s7sBQ1+rgo1QTYT7T96ZWnamzRsUrzc1nuBE1+Gqrb6efRhbj0yCG/ujZ5Hmx/gT -hRLC+cV+rgMiO6zyFoXcBUbMV5ab2opwPQyq3/wW5z/e7DA/nyNVo5HQnUZo67VT -w3FKtP6uaVlWo+O+QCWbqyA+NsvW/y3UXXQuMhm3QhECgYEAhy6hubIfUw05Msv0 -CK5VTxU/B+uE+WZo1PoYUeYfU1KUYsELyb/XbtiAYuI5z3lw75vLAuiYEUtc28Kb -ZSUv1z36DNGuRuj5wOAr1cfpMmqKA6IZpyAEdRZC8XXvl1+U3NZ3C2qeyGMJ06/N -YtbBEJ3p2CaDuUr3AFEDDNg1WKw= ------END PRIVATE KEY----- diff --git a/framework/src/main/resources/lili-wechat/platform_cert.p12 b/framework/src/main/resources/lili-wechat/platform_cert.p12 deleted file mode 100644 index e7c20023..00000000 --- a/framework/src/main/resources/lili-wechat/platform_cert.p12 +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID3DCCAsSgAwIBAgIUV+as/5BHXy5fyCESrE6g2onbgtAwDQYJKoZIhvcNAQEL -BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT -FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg -Q0EwHhcNMjAwMTEzMDMyMDQwWhcNMjUwMTExMDMyMDQwWjBuMRgwFgYDVQQDDA9U -ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl -bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo -ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1cnBvpt8zKcj9LNen -u/fmqC9FYDmC7EJ8OWpEdUFIdI5jmzwj8enLqVUIcboObA+1B9tqQBhQEIi+mBdd -sIRk9+YXFhmNbOPZiRiFnIC5B2tCq84ieDr7WZZAzRwUH1585Tiv3CsOTBib2xQs -hSMwglvnHsXCjlqUybejOk5FMahgm0ejgs8omRm3nBfcMfilOxXH4UUP56cfeDYO -YdaAQhuJ5bDILnQYm2SD0d+aN8VV5d0WjXW01NFLzxpyMUYHEXNcDC7pLjgNVgKl -0sk5TJlIUgxEIRli8RdfE1qrcnBqYKDgym4LfHCY6T2cBc0PQY4Q7cww8G7jHn4I -snjDAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc -MFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js -P0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ -KoZIhvcNAQELBQADggEBAJLIwFYvFLaT3BECVuapQu1t3Od+Oy6EY/PjLOhYlo5k -ALXWPJ5v8EsisFQhSRsZMWd+ynr3/tnLXcfU+fQMjU8lvYN3mXSp2fnSlzzublZB -fL06nt5PWBnUgAASDfC0MCEBLrIrRX/yiNrzS6tkjc6NYQJ1i7jovaC++6TjdyNp -DO2aasitXV5TUF1a2TKsoqcWlFO9X6cP5Dwqc81aeFU3ncQNzDcpauXU/5pmF5Jd -2nNaJnuo0uIY43szcpzUHvCNHX7lQZUQulOThW8EspLJZWaPbawvn/tCOL7Vnkko -APr31mGbXOZV5lNNSLuoTn5/bueLP/TkrcpmM9Xw+9Y= ------END CERTIFICATE----- \ No newline at end of file diff --git a/framework/src/main/resources/lili-wechat/证书使用说明.txt b/framework/src/main/resources/lili-wechat/证书使用说明.txt deleted file mode 100644 index 041befb4..00000000 --- a/framework/src/main/resources/lili-wechat/证书使用说明.txt +++ /dev/null @@ -1,18 +0,0 @@ -欢迎使用微信支付! -附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。 -证书属于敏感信息,请妥善保管不要泄露和被他人复制。 -不同开发语言下的证书格式不同,以下为说明指引: - 证书pkcs12格式(apiclient_cert.p12) - 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 - 部分安全性要求较高的API需要使用该证书来确认您的调用身份 - windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031) - 证书pem格式(apiclient_cert.pem) - 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 - 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 - 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem - 证书密钥pem格式(apiclient_key.pem) - 从apiclient_cert.p12中导出密钥部分的文件,为pem格式 - 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 - 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem -备注说明: - 由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书, 2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载 \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ArticleCategoryMapper.xml b/framework/src/main/resources/mapper/ArticleCategoryMapper.xml deleted file mode 100644 index ce5612b9..00000000 --- a/framework/src/main/resources/mapper/ArticleCategoryMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ArticleMapper.xml b/framework/src/main/resources/mapper/ArticleMapper.xml deleted file mode 100644 index e005dc3f..00000000 --- a/framework/src/main/resources/mapper/ArticleMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/BillMapper.xml b/framework/src/main/resources/mapper/BillMapper.xml deleted file mode 100644 index 97b15e6e..00000000 --- a/framework/src/main/resources/mapper/BillMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/BrandMapper.xml b/framework/src/main/resources/mapper/BrandMapper.xml deleted file mode 100644 index fc5ee370..00000000 --- a/framework/src/main/resources/mapper/BrandMapper.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/CategoryBrandMapper.xml b/framework/src/main/resources/mapper/CategoryBrandMapper.xml deleted file mode 100644 index b4edf6f7..00000000 --- a/framework/src/main/resources/mapper/CategoryBrandMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/CategoryParameterGroupMapper.xml b/framework/src/main/resources/mapper/CategoryParameterGroupMapper.xml deleted file mode 100644 index eb629109..00000000 --- a/framework/src/main/resources/mapper/CategoryParameterGroupMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/CategorySpecificationMapper.xml b/framework/src/main/resources/mapper/CategorySpecificationMapper.xml deleted file mode 100644 index f622e1a5..00000000 --- a/framework/src/main/resources/mapper/CategorySpecificationMapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ConnectConfigMapper.xml b/framework/src/main/resources/mapper/ConnectConfigMapper.xml deleted file mode 100644 index dbd74bbf..00000000 --- a/framework/src/main/resources/mapper/ConnectConfigMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ConnectMapper.xml b/framework/src/main/resources/mapper/ConnectMapper.xml deleted file mode 100644 index 7b72b2cd..00000000 --- a/framework/src/main/resources/mapper/ConnectMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/CouponMapper.xml b/framework/src/main/resources/mapper/CouponMapper.xml deleted file mode 100644 index 9b18097f..00000000 --- a/framework/src/main/resources/mapper/CouponMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/DepartmentMapper.xml b/framework/src/main/resources/mapper/DepartmentMapper.xml deleted file mode 100644 index 20af930a..00000000 --- a/framework/src/main/resources/mapper/DepartmentMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/DepartmentRoleMapper.xml b/framework/src/main/resources/mapper/DepartmentRoleMapper.xml deleted file mode 100644 index 4241a205..00000000 --- a/framework/src/main/resources/mapper/DepartmentRoleMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/DepositLogMapper.xml b/framework/src/main/resources/mapper/DepositLogMapper.xml deleted file mode 100644 index 470c65eb..00000000 --- a/framework/src/main/resources/mapper/DepositLogMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/DistributionCashMapper.xml b/framework/src/main/resources/mapper/DistributionCashMapper.xml deleted file mode 100644 index 5998314d..00000000 --- a/framework/src/main/resources/mapper/DistributionCashMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/DistributionGoodsMapper.xml b/framework/src/main/resources/mapper/DistributionGoodsMapper.xml deleted file mode 100644 index 199f46da..00000000 --- a/framework/src/main/resources/mapper/DistributionGoodsMapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/DistributionOrderMapper.xml b/framework/src/main/resources/mapper/DistributionOrderMapper.xml deleted file mode 100644 index deb20d73..00000000 --- a/framework/src/main/resources/mapper/DistributionOrderMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ExpressPlatformMapper.xml b/framework/src/main/resources/mapper/ExpressPlatformMapper.xml deleted file mode 100644 index 4dbc5f38..00000000 --- a/framework/src/main/resources/mapper/ExpressPlatformMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/FocusPictureMapper.xml b/framework/src/main/resources/mapper/FocusPictureMapper.xml deleted file mode 100644 index 07c95c92..00000000 --- a/framework/src/main/resources/mapper/FocusPictureMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/FootprintMapper.xml b/framework/src/main/resources/mapper/FootprintMapper.xml deleted file mode 100644 index 9be92429..00000000 --- a/framework/src/main/resources/mapper/FootprintMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/FullDiscountMapper.xml b/framework/src/main/resources/mapper/FullDiscountMapper.xml deleted file mode 100644 index d62e32ce..00000000 --- a/framework/src/main/resources/mapper/FullDiscountMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/GoodsCollectionMapper.xml b/framework/src/main/resources/mapper/GoodsCollectionMapper.xml deleted file mode 100644 index 4ff9b1f1..00000000 --- a/framework/src/main/resources/mapper/GoodsCollectionMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/GoodsGalleryMapper.xml b/framework/src/main/resources/mapper/GoodsGalleryMapper.xml deleted file mode 100644 index 882df260..00000000 --- a/framework/src/main/resources/mapper/GoodsGalleryMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/GoodsMapper.xml b/framework/src/main/resources/mapper/GoodsMapper.xml deleted file mode 100644 index 864362a0..00000000 --- a/framework/src/main/resources/mapper/GoodsMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/GoodsParamsMapper.xml b/framework/src/main/resources/mapper/GoodsParamsMapper.xml deleted file mode 100644 index 9472dc41..00000000 --- a/framework/src/main/resources/mapper/GoodsParamsMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/GoodsSkuMapper.xml b/framework/src/main/resources/mapper/GoodsSkuMapper.xml deleted file mode 100644 index 4ca8bb3f..00000000 --- a/framework/src/main/resources/mapper/GoodsSkuMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/GoodsUnitMapper.xml b/framework/src/main/resources/mapper/GoodsUnitMapper.xml deleted file mode 100644 index 516ea99e..00000000 --- a/framework/src/main/resources/mapper/GoodsUnitMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/LogisticsMapper.xml b/framework/src/main/resources/mapper/LogisticsMapper.xml deleted file mode 100644 index 48045bad..00000000 --- a/framework/src/main/resources/mapper/LogisticsMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberAddressMapper.xml b/framework/src/main/resources/mapper/MemberAddressMapper.xml deleted file mode 100644 index 12579d10..00000000 --- a/framework/src/main/resources/mapper/MemberAddressMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberCouponMapper.xml b/framework/src/main/resources/mapper/MemberCouponMapper.xml deleted file mode 100644 index d1a02fce..00000000 --- a/framework/src/main/resources/mapper/MemberCouponMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberEvaluationMapper.xml b/framework/src/main/resources/mapper/MemberEvaluationMapper.xml deleted file mode 100644 index 26a0befb..00000000 --- a/framework/src/main/resources/mapper/MemberEvaluationMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberMapper.xml b/framework/src/main/resources/mapper/MemberMapper.xml deleted file mode 100644 index 6dcff501..00000000 --- a/framework/src/main/resources/mapper/MemberMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberNoticeLogMapper.xml b/framework/src/main/resources/mapper/MemberNoticeLogMapper.xml deleted file mode 100644 index 5ded7a70..00000000 --- a/framework/src/main/resources/mapper/MemberNoticeLogMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberNoticeMapper.xml b/framework/src/main/resources/mapper/MemberNoticeMapper.xml deleted file mode 100644 index f418e98c..00000000 --- a/framework/src/main/resources/mapper/MemberNoticeMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberNoticeSenterMapper.xml b/framework/src/main/resources/mapper/MemberNoticeSenterMapper.xml deleted file mode 100644 index caf65eb8..00000000 --- a/framework/src/main/resources/mapper/MemberNoticeSenterMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberPointsHistoryMapper.xml b/framework/src/main/resources/mapper/MemberPointsHistoryMapper.xml deleted file mode 100644 index 1f72c95d..00000000 --- a/framework/src/main/resources/mapper/MemberPointsHistoryMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberSign.xml b/framework/src/main/resources/mapper/MemberSign.xml deleted file mode 100644 index 7a69fe9f..00000000 --- a/framework/src/main/resources/mapper/MemberSign.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberStatisticsDataMapper.xml b/framework/src/main/resources/mapper/MemberStatisticsDataMapper.xml deleted file mode 100644 index 343ba5fe..00000000 --- a/framework/src/main/resources/mapper/MemberStatisticsDataMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MemberWalletMapper.xml b/framework/src/main/resources/mapper/MemberWalletMapper.xml deleted file mode 100644 index cad94a66..00000000 --- a/framework/src/main/resources/mapper/MemberWalletMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/MessageMapper.xml b/framework/src/main/resources/mapper/MessageMapper.xml deleted file mode 100644 index 6f02e518..00000000 --- a/framework/src/main/resources/mapper/MessageMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/OrderItemMapper.xml b/framework/src/main/resources/mapper/OrderItemMapper.xml deleted file mode 100644 index 40032662..00000000 --- a/framework/src/main/resources/mapper/OrderItemMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/OrderLogMapper.xml b/framework/src/main/resources/mapper/OrderLogMapper.xml deleted file mode 100644 index 7b87b503..00000000 --- a/framework/src/main/resources/mapper/OrderLogMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/OrderMapper.xml b/framework/src/main/resources/mapper/OrderMapper.xml deleted file mode 100644 index a41b6c94..00000000 --- a/framework/src/main/resources/mapper/OrderMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PageMapper.xml b/framework/src/main/resources/mapper/PageMapper.xml deleted file mode 100644 index 180dec09..00000000 --- a/framework/src/main/resources/mapper/PageMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ParametersMapper.xml b/framework/src/main/resources/mapper/ParametersMapper.xml deleted file mode 100644 index 88e60be1..00000000 --- a/framework/src/main/resources/mapper/ParametersMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PaymentLogMapper.xml b/framework/src/main/resources/mapper/PaymentLogMapper.xml deleted file mode 100644 index 1af3e778..00000000 --- a/framework/src/main/resources/mapper/PaymentLogMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PermissionMapper.xml b/framework/src/main/resources/mapper/PermissionMapper.xml deleted file mode 100644 index 1a7ba370..00000000 --- a/framework/src/main/resources/mapper/PermissionMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PintuanMapper.xml b/framework/src/main/resources/mapper/PintuanMapper.xml deleted file mode 100644 index c7f2ad03..00000000 --- a/framework/src/main/resources/mapper/PintuanMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PlatformSettingMapper.xml b/framework/src/main/resources/mapper/PlatformSettingMapper.xml deleted file mode 100644 index 093d2318..00000000 --- a/framework/src/main/resources/mapper/PlatformSettingMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PointLogMapper.xml b/framework/src/main/resources/mapper/PointLogMapper.xml deleted file mode 100644 index 4c1f1611..00000000 --- a/framework/src/main/resources/mapper/PointLogMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PromotionGoodsMapper.xml b/framework/src/main/resources/mapper/PromotionGoodsMapper.xml deleted file mode 100644 index 6f9e25ea..00000000 --- a/framework/src/main/resources/mapper/PromotionGoodsMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PurchaseOrderItemMapper.xml b/framework/src/main/resources/mapper/PurchaseOrderItemMapper.xml deleted file mode 100644 index 819b75e4..00000000 --- a/framework/src/main/resources/mapper/PurchaseOrderItemMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PurchaseOrderMapper.xml b/framework/src/main/resources/mapper/PurchaseOrderMapper.xml deleted file mode 100644 index cd72f34b..00000000 --- a/framework/src/main/resources/mapper/PurchaseOrderMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PurchaseQuotedItemMapper.xml b/framework/src/main/resources/mapper/PurchaseQuotedItemMapper.xml deleted file mode 100644 index bf83a637..00000000 --- a/framework/src/main/resources/mapper/PurchaseQuotedItemMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/PurchaseQuotedMapper.xml b/framework/src/main/resources/mapper/PurchaseQuotedMapper.xml deleted file mode 100644 index 7572cead..00000000 --- a/framework/src/main/resources/mapper/PurchaseQuotedMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ReceiptMapper.xml b/framework/src/main/resources/mapper/ReceiptMapper.xml deleted file mode 100644 index 559fe312..00000000 --- a/framework/src/main/resources/mapper/ReceiptMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/RechargeMapper.xml b/framework/src/main/resources/mapper/RechargeMapper.xml deleted file mode 100644 index a393e9f8..00000000 --- a/framework/src/main/resources/mapper/RechargeMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/RefundLogMapper.xml b/framework/src/main/resources/mapper/RefundLogMapper.xml deleted file mode 100644 index d5fed122..00000000 --- a/framework/src/main/resources/mapper/RefundLogMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/RegionMapper.xml b/framework/src/main/resources/mapper/RegionMapper.xml deleted file mode 100644 index fe38f09b..00000000 --- a/framework/src/main/resources/mapper/RegionMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/RoleMapper.xml b/framework/src/main/resources/mapper/RoleMapper.xml deleted file mode 100644 index 2731ffa3..00000000 --- a/framework/src/main/resources/mapper/RoleMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/RoleMenuMapper.xml b/framework/src/main/resources/mapper/RoleMenuMapper.xml deleted file mode 100644 index 586913d5..00000000 --- a/framework/src/main/resources/mapper/RoleMenuMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/SeckillApplyMapper.xml b/framework/src/main/resources/mapper/SeckillApplyMapper.xml deleted file mode 100644 index c6a1c7f1..00000000 --- a/framework/src/main/resources/mapper/SeckillApplyMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/SeckillMapper.xml b/framework/src/main/resources/mapper/SeckillMapper.xml deleted file mode 100644 index 467d68ae..00000000 --- a/framework/src/main/resources/mapper/SeckillMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/SensitiveWordsMapper.xml b/framework/src/main/resources/mapper/SensitiveWordsMapper.xml deleted file mode 100644 index 6ce6ff07..00000000 --- a/framework/src/main/resources/mapper/SensitiveWordsMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ServiceNoticeMapper.xml b/framework/src/main/resources/mapper/ServiceNoticeMapper.xml deleted file mode 100644 index 50eff690..00000000 --- a/framework/src/main/resources/mapper/ServiceNoticeMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ShippingAddressMapper.xml b/framework/src/main/resources/mapper/ShippingAddressMapper.xml deleted file mode 100644 index 8b80fce0..00000000 --- a/framework/src/main/resources/mapper/ShippingAddressMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/ShortLinkMapper.xml b/framework/src/main/resources/mapper/ShortLinkMapper.xml deleted file mode 100644 index 7c6e4c6a..00000000 --- a/framework/src/main/resources/mapper/ShortLinkMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/SiteNavigationMapper.xml b/framework/src/main/resources/mapper/SiteNavigationMapper.xml deleted file mode 100644 index d91ffe98..00000000 --- a/framework/src/main/resources/mapper/SiteNavigationMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/SpecValuesMapper.xml b/framework/src/main/resources/mapper/SpecValuesMapper.xml deleted file mode 100644 index bd9c7a25..00000000 --- a/framework/src/main/resources/mapper/SpecValuesMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/SpecificationMapper.xml b/framework/src/main/resources/mapper/SpecificationMapper.xml deleted file mode 100644 index e7b1d8b2..00000000 --- a/framework/src/main/resources/mapper/SpecificationMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/StoreAddressMapper.xml b/framework/src/main/resources/mapper/StoreAddressMapper.xml deleted file mode 100644 index 73d8604a..00000000 --- a/framework/src/main/resources/mapper/StoreAddressMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/StoreCollectionMapper.xml b/framework/src/main/resources/mapper/StoreCollectionMapper.xml deleted file mode 100644 index 0c8a40b6..00000000 --- a/framework/src/main/resources/mapper/StoreCollectionMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/StoreFlowMapper.xml b/framework/src/main/resources/mapper/StoreFlowMapper.xml deleted file mode 100644 index 4d526cba..00000000 --- a/framework/src/main/resources/mapper/StoreFlowMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/StoreLogisticsMapper.xml b/framework/src/main/resources/mapper/StoreLogisticsMapper.xml deleted file mode 100644 index 9df71ce2..00000000 --- a/framework/src/main/resources/mapper/StoreLogisticsMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/StoreMapper.xml b/framework/src/main/resources/mapper/StoreMapper.xml deleted file mode 100644 index a1be516a..00000000 --- a/framework/src/main/resources/mapper/StoreMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/TradeMapper.xml b/framework/src/main/resources/mapper/TradeMapper.xml deleted file mode 100644 index be1e03c3..00000000 --- a/framework/src/main/resources/mapper/TradeMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/UserRoleMapper.xml b/framework/src/main/resources/mapper/UserRoleMapper.xml deleted file mode 100644 index 0c6da826..00000000 --- a/framework/src/main/resources/mapper/UserRoleMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/VerificationSourceMapper.xml b/framework/src/main/resources/mapper/VerificationSourceMapper.xml deleted file mode 100644 index c80edca5..00000000 --- a/framework/src/main/resources/mapper/VerificationSourceMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/WechatMPMessageMapper.xml b/framework/src/main/resources/mapper/WechatMPMessageMapper.xml deleted file mode 100644 index 9d639de1..00000000 --- a/framework/src/main/resources/mapper/WechatMPMessageMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/mapper/WechatMessageMapper.xml b/framework/src/main/resources/mapper/WechatMessageMapper.xml deleted file mode 100644 index ed6244e7..00000000 --- a/framework/src/main/resources/mapper/WechatMessageMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/maven-repository/SF-CSIM-EXPRESS-SDK-V2.1.7.jar b/framework/src/main/resources/maven-repository/SF-CSIM-EXPRESS-SDK-V2.1.7.jar new file mode 100644 index 00000000..f7028c96 Binary files /dev/null and b/framework/src/main/resources/maven-repository/SF-CSIM-EXPRESS-SDK-V2.1.7.jar differ diff --git a/framework/src/main/resources/sensitive/sensitive_words.txt b/framework/src/main/resources/sensitive/sensitive_words.txt deleted file mode 100644 index 04912c08..00000000 --- a/framework/src/main/resources/sensitive/sensitive_words.txt +++ /dev/null @@ -1,6 +0,0 @@ -共产党 -习近平 -毛泽东 -胡锦涛 -邓小平 -强奸 \ No newline at end of file diff --git a/framework/src/main/resources/sensitive_words.txt b/framework/src/main/resources/sensitive_words.txt deleted file mode 100644 index 04912c08..00000000 --- a/framework/src/main/resources/sensitive_words.txt +++ /dev/null @@ -1,6 +0,0 @@ -共产党 -习近平 -毛泽东 -胡锦涛 -邓小平 -强奸 \ No newline at end of file diff --git a/framework/src/main/resources/templates/java/controller.btl b/framework/src/main/resources/templates/java/controller.btl deleted file mode 100644 index 20bdc5bd..00000000 --- a/framework/src/main/resources/templates/java/controller.btl +++ /dev/null @@ -1,77 +0,0 @@ -package ${entity.controllerPackage}; - -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.SearchVO; -import cn.lili.common.vo.ResultMessage; -import ${entity.entityPackage}.${entity.className}; -import ${entity.servicePackage}.${entity.className}Service; -import com.baomidou.mybatisplus.core.metadata.IPage; -import lombok.RequiredArgsConstructor; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - - -/** - * @author ${entity.author} - */ -@RestController -@Api(tags = "${entity.description}接口") -@RequestMapping("/lili/${entity.classNameLowerCase}") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ${entity.className}Controller { - - private final ${entity.className}Service ${entity.classNameLowerCase}Service; - - @GetMapping(value = "/{id}") - @ApiOperation(value = "查看${entity.description}详情") - public ResultMessage<${entity.className}> get(@PathVariable ${entity.primaryKeyType} id){ - - ${entity.className} ${entity.classNameLowerCase} = ${entity.classNameLowerCase}Service.getById(id); - return new ResultUtil<${entity.className}>().setData(${entity.classNameLowerCase}); - } - - @GetMapping - @ApiOperation(value = "分页获取${entity.description}") - public ResultMessage> getByPage(${entity.className} entity, - SearchVO searchVo, - PageVO page){ - IPage<${entity.className}> data = ${entity.classNameLowerCase}Service.page(PageUtil.initPage(page),PageUtil.initWrapper(entity, searchVo)); - return new ResultUtil>().setData(data); - } - - @PostMapping - @ApiOperation(value = "新增${entity.description}") - public ResultMessage<${entity.className}> save(${entity.className} ${entity.classNameLowerCase}){ - - if(${entity.classNameLowerCase}Service.save(${entity.classNameLowerCase})){ - return new ResultUtil<${entity.className}>().setData(${entity.classNameLowerCase}); - } - return new ResultUtil<${entity.className}>().setErrorMsg("未知异常,请稍后重试"); - } - - @PutMapping("/{id}") - @ApiOperation(value = "更新${entity.description}") - public ResultMessage<${entity.className}> update(@PathVariable String id, ${entity.className} ${entity.classNameLowerCase}){ - if(${entity.classNameLowerCase}Service.updateById(${entity.classNameLowerCase})){ - return new ResultUtil<${entity.className}>().setData(${entity.classNameLowerCase}); - } - return new ResultUtil<${entity.className}>().setErrorMsg("未知异常,请稍后重试"); - } - - @DeleteMapping(value = "/{ids}") - @ApiOperation(value = "删除${entity.description}") - public ResultMessage delAllByIds(@PathVariable List ids){ - - ${entity.classNameLowerCase}Service.removeByIds(ids); - return ResultUtil.success("成功删除"); - } -} diff --git a/framework/src/main/resources/templates/java/entity.btl b/framework/src/main/resources/templates/java/entity.btl deleted file mode 100644 index 0c4df5e6..00000000 --- a/framework/src/main/resources/templates/java/entity.btl +++ /dev/null @@ -1,23 +0,0 @@ -package ${entity.entityPackage}; - -import cn.lili.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import javax.persistence.Entity; -import javax.persistence.Table; - -/** - * @author ${entity.author} - */ -@Data -@Entity -@Table(name = "${entity.tableName}") -@TableName("${entity.tableName}") -@ApiModel(value = "${entity.description}") -public class ${entity.className} extends BaseEntity { - - private static final long serialVersionUID = 1L; - -} \ No newline at end of file diff --git a/framework/src/main/resources/templates/java/mapper.btl b/framework/src/main/resources/templates/java/mapper.btl deleted file mode 100644 index 05dcbe57..00000000 --- a/framework/src/main/resources/templates/java/mapper.btl +++ /dev/null @@ -1,14 +0,0 @@ -package ${entity.daoPackage}; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import ${entity.entityPackage}.${entity.className}; - -import java.util.List; - -/** - * ${entity.description} Dao层 - * @author ${entity.author} - */ -public interface ${entity.className}Mapper extends BaseMapper<${entity.className}> { - -} \ No newline at end of file diff --git a/framework/src/main/resources/templates/java/mapperXml.btl b/framework/src/main/resources/templates/java/mapperXml.btl deleted file mode 100644 index 09236adf..00000000 --- a/framework/src/main/resources/templates/java/mapperXml.btl +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/framework/src/main/resources/templates/java/service.btl b/framework/src/main/resources/templates/java/service.btl deleted file mode 100644 index 611cf9b6..00000000 --- a/framework/src/main/resources/templates/java/service.btl +++ /dev/null @@ -1,14 +0,0 @@ -package ${entity.servicePackage}; - -import com.baomidou.mybatisplus.extension.service.IService; -import ${entity.entityPackage}.${entity.className}; - -import java.util.List; - -/** - * ${entity.description} 业务层 - * @author ${entity.author} - */ -public interface ${entity.className}Service extends IService<${entity.className}> { - -} \ No newline at end of file diff --git a/framework/src/main/resources/templates/java/serviceImpl.btl b/framework/src/main/resources/templates/java/serviceImpl.btl deleted file mode 100644 index 556514f7..00000000 --- a/framework/src/main/resources/templates/java/serviceImpl.btl +++ /dev/null @@ -1,23 +0,0 @@ -package ${entity.serviceImplPackage}; - -import ${entity.daoPackage}.${entity.className}Mapper; -import ${entity.entityPackage}.${entity.className}; -import ${entity.servicePackage}.${entity.className}Service; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -/** - * ${entity.description} 业务实现 - * @author ${entity.author} - */ -@Service -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ${entity.className}ServiceImpl extends ServiceImpl<${entity.className}Mapper, ${entity.className}> implements ${entity.className}Service { - - private final ${entity.className}Mapper ${entity.classNameLowerCase}Mapper; -} \ No newline at end of file diff --git a/framework/src/main/resources/templates/vue/table.btl b/framework/src/main/resources/templates/vue/table.btl deleted file mode 100644 index 260f5772..00000000 --- a/framework/src/main/resources/templates/vue/table.btl +++ /dev/null @@ -1,735 +0,0 @@ - - - - \ No newline at end of file diff --git a/framework/src/main/resources/templates/vue/tree.btl b/framework/src/main/resources/templates/vue/tree.btl deleted file mode 100644 index 269738b6..00000000 --- a/framework/src/main/resources/templates/vue/tree.btl +++ /dev/null @@ -1,687 +0,0 @@ - - - - \ No newline at end of file diff --git a/framework/src/test/java/cn/lili/test/RedisLimiterHelperTest.java b/framework/src/test/java/cn/lili/test/RedisLimiterHelperTest.java deleted file mode 100644 index 1ac8a419..00000000 --- a/framework/src/test/java/cn/lili/test/RedisLimiterHelperTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.lili.test; - -import cn.lili.modules.order.order.entity.dos.OrderItem; -import cn.lili.modules.order.order.service.OrderItemService; -import cn.lili.modules.statistics.serviceimpl.OrderStatisticsDataServiceImpl; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.ArrayList; -import java.util.List; - -/** - * RedisLimiterHelperTest - * - * @author Chopper - * @version v1.0 - * @since 2020-06-13 12:17 - */ - -@RunWith(SpringRunner.class) -@SpringBootTest -public class RedisLimiterHelperTest { - - @Autowired - private OrderItemService orderItemService; - - @Autowired - private OrderStatisticsDataServiceImpl orderStatisticsDataService; - - - @Test - public void orderTest() { - - - - } - - - @Test - public void testBatchUpdate() { - OrderItem orderItem = new OrderItem(); - orderItem.setId("1356539557729796097"); - orderItem.setCreateBy("1356539557729796097"); - - - OrderItem orderItem1 = new OrderItem(); - orderItem1.setId("1356787800921341953"); - orderItem1.setCreateBy("1356787800921341953"); - - - List orderItemList = new ArrayList<>(); - orderItemList.add(orderItem); - orderItemList.add(orderItem1); - - orderItemService.updateBatchById(orderItemList); - - } -} diff --git a/framework/src/test/java/cn/lili/test/script/ScriptTest.java b/framework/src/test/java/cn/lili/test/script/ScriptTest.java deleted file mode 100644 index 6dd5b284..00000000 --- a/framework/src/test/java/cn/lili/test/script/ScriptTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.lili.test.script; - -import cn.lili.common.test.BaseTest; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.script.DefaultRedisScript; -import org.springframework.scripting.support.ResourceScriptSource; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; - -/** - * redis 事务测试 - * - * @author Chopper - * @version v1.0 - * @since - * 2020-02-22 20:26 - */ -@RunWith(SpringRunner.class) -@SpringBootTest -@Transactional(rollbackFor = Exception.class) -@Rollback() -@ContextConfiguration -@Configuration -@ComponentScan("cn.lili") -public class ScriptTest extends BaseTest { - @Resource - private DefaultRedisScript redisScript; - @Resource - private StringRedisTemplate stringRedisTemplate; - - @Test - public void lua() { - stringRedisTemplate.opsForValue().set("key_1", "100"); - stringRedisTemplate.opsForValue().set("key_2", "95"); - stringRedisTemplate.opsForValue().set("key_3", "90"); - stringRedisTemplate.opsForValue().set("key_4", "85"); - List keys = new ArrayList<>(); - keys.add("key_1"); - keys.add("key_2"); - keys.add("key_3"); - keys.add("key_4"); - List value = new ArrayList<>(); - value.add("-1"); - value.add("-1"); - value.add("-1"); - value.add("-1"); - //启用十个线程 - for (int i = 0; i <= 10; i++) { - //每个线程循环十次 - Thread thread = new Thread(() -> { - for (int i1 = 0; i1 <= 10; i1++) { - Boolean execute = stringRedisTemplate.execute(redisScript, keys, value.toArray()); - System.out.println(Thread.currentThread().getName() + "|" + i1 + "|" + execute); - } - }); - thread.start(); - } - } - -} - -@Configuration -class LuaConfiguration { - @Bean - public DefaultRedisScript redisScript() { - DefaultRedisScript redisScript = new DefaultRedisScript<>(); - redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("script/quantity.lua"))); - redisScript.setResultType(Boolean.class); - return redisScript; - } -} diff --git a/framework/src/test/java/cn/lili/test/trigger/TestTimeTrigger.java b/framework/src/test/java/cn/lili/test/trigger/TestTimeTrigger.java deleted file mode 100644 index 71c45ecb..00000000 --- a/framework/src/test/java/cn/lili/test/trigger/TestTimeTrigger.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.lili.test.trigger; - -import cn.lili.common.cache.Cache; -import cn.lili.common.trigger.interfaces.TimeTriggerExecutor; -import cn.lili.common.utils.DateUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * TestTimeTrigger - * - * @author Chopper - * @version v1.0 - * @since - * 2019-02-19 下午3:01 - */ -@Component -public class TestTimeTrigger implements TimeTriggerExecutor { - - public static String key = "rabbitmq_test_value"; - @Autowired - private Cache cache; - - /** - * 执行任务 - * - * @param object 任务参数 - */ - @Override - public void execute(Object object) { - System.out.println(DateUtil.toString(DateUtil.getDateline(), "yyyy-MM-dd HH:mm:ss")); - System.out.println(key + "===" + object); - cache.put(key, object); - } -} diff --git a/im-api/README.md b/im-api/README.md new file mode 100644 index 00000000..f3e99eee --- /dev/null +++ b/im-api/README.md @@ -0,0 +1,56 @@ +### IM 配置文档 + +#### websocket连接中,ws=http协议,wss=https协议,在前端配置时也许注意同步修改(PS:微信小程序只支持https) + +微信小程序配置需额外配置:前往微信平台,登陆自己的小程序 +https://mp.weixin.qq.com/ + +配置内容: 开发 -> 开发设置 -> 服务器域名 -> socket合法域名 -> 添加 https://im-api.pickmall.cn(参考) + +##### https NGINX配置参考 + +``` +server { +listen 443 ssl; +ssl_certificate "/etc/nginx/ssl/pickmall.cn.pem"; +ssl_certificate_key "/etc/nginx/ssl/pickmall.cn.key"; +ssl_session_cache shared:SSL:1m; +ssl_session_timeout 10m; +ssl_ciphers HIGH:!aNULL:!MD5; +ssl_prefer_server_ciphers on; +include /etc/nginx/default.d/*.conf; +server_name im-api.pickmall.cn; + +location / { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header X-real-ip $remote_addr; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_pass http://127.0.0.1:8885; + } +} +``` + +##### http 参考配置 + +``` +server { +listen 8885; +ssl_session_cache shared:SSL:1m; +ssl_session_timeout 10m; +ssl_ciphers HIGH:!aNULL:!MD5; +ssl_prefer_server_ciphers on; +include /etc/nginx/default.d/*.conf; +server_name im-api.pickmall.cn; + +location / { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header X-real-ip $remote_addr; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_pass http://127.0.0.1:8885; + } +} +``` diff --git a/socket-api/pom.xml b/im-api/pom.xml similarity index 70% rename from socket-api/pom.xml rename to im-api/pom.xml index f798e24c..8f6efc47 100644 --- a/socket-api/pom.xml +++ b/im-api/pom.xml @@ -4,18 +4,25 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - socket-api + im-api + cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml cn.lili framework - 1.0.1 + ${revision} + + + + org.springframework.boot + spring-boot-starter-websocket @@ -27,5 +34,6 @@ - + + \ No newline at end of file diff --git a/im-api/src/main/java/cn/lili/ImApiApplication.java b/im-api/src/main/java/cn/lili/ImApiApplication.java new file mode 100644 index 00000000..67078506 --- /dev/null +++ b/im-api/src/main/java/cn/lili/ImApiApplication.java @@ -0,0 +1,31 @@ +package cn.lili; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + + +/** + * @author liushuai + */ +@SpringBootApplication +public class ImApiApplication { + + public static void main(String[] args) { + SpringApplication.run(ImApiApplication.class, args); + } + + /** + * 如果使用独立的servlet容器, + * 而不是直接使用springboot的内置容器, + * 就不要注入ServerEndpointExporter, + * 因为它将由容器自己提供和管理 + * + * @return + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/im-api/src/main/java/cn/lili/controller/im/ImMessageController.java b/im-api/src/main/java/cn/lili/controller/im/ImMessageController.java new file mode 100644 index 00000000..ab562631 --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/im/ImMessageController.java @@ -0,0 +1,90 @@ +package cn.lili.controller.im; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.im.entity.dos.ImMessage; +import cn.lili.modules.im.entity.dto.MessageQueryParams; +import cn.lili.modules.im.service.ImMessageService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * @author Chopper + */ +@RestController +@Api(tags = "Im消息接口") +@RequestMapping("/im/message") +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ImMessageController { + + private final ImMessageService imMessageService; + + @GetMapping(value = "/{id}") + @ApiOperation(value = "查看Im消息详情") + public ResultMessage get(@PathVariable String id) { + ImMessage imMessage = imMessageService.getById(id); + return ResultUtil.data(imMessage); + } + + @GetMapping + @ApiOperation(value = "分页获取Im消息") + public ResultMessage> historyMessage(MessageQueryParams messageQueryParams) { + List data = imMessageService.getList(messageQueryParams); + return ResultUtil.data(data); + } + + @PostMapping + @ApiOperation(value = "新增Im消息") + public ResultMessage save(ImMessage imMessage) { + if (imMessageService.save(imMessage)) { + return ResultUtil.data(imMessage); + } + throw new ServiceException(ResultCode.IM_MESSAGE_ADD_ERROR); + } + + @PutMapping("/{id}") + @ApiOperation(value = "更新Im消息") + public ResultMessage update(@PathVariable String id, ImMessage imMessage) { + if (imMessageService.updateById(imMessage)) { + return ResultUtil.data(imMessage); + } + throw new ServiceException(ResultCode.IM_MESSAGE_EDIT_ERROR); + } + + @DeleteMapping(value = "/{ids}") + @ApiOperation(value = "删除Im消息") + public ResultMessage delAllByIds(@PathVariable List ids) { + imMessageService.removeByIds(ids); + return ResultUtil.success(); + } + + + @GetMapping(value = "/newMessage") + @ApiOperation(value = "查看是否有新消息") + public ResultMessage hasNewMessage(String accessToken) { + return ResultUtil.data(imMessageService.hasNewMessage(accessToken)); + } + + @GetMapping(value = "/unreadMessage") + @ApiOperation(value = "获取所有未读消息") + public ResultMessage getUnreadMessageCount() { + return ResultUtil.data(imMessageService.unreadMessageCount()); + } + + @PutMapping(value = "/clean/unred") + @ApiOperation(value = "清除所有未读消息") + public ResultMessage cleanUnreadMessage() { + imMessageService.cleanUnreadMessage(); + return ResultUtil.success(); + } +} diff --git a/im-api/src/main/java/cn/lili/controller/im/ImTalkController.java b/im-api/src/main/java/cn/lili/controller/im/ImTalkController.java new file mode 100644 index 00000000..eee31a4a --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/im/ImTalkController.java @@ -0,0 +1,77 @@ +package cn.lili.controller.im; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.im.entity.dos.ImTalk; +import cn.lili.modules.im.entity.vo.ImTalkVO; +import cn.lili.modules.im.service.ImTalkService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * @author Chopper + */ +@RestController +@Api(tags = "聊天接口") +@RequestMapping("/im/talk") +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ImTalkController { + + private final ImTalkService imTalkService; + + @GetMapping(value = "/{id}") + @ApiOperation(value = "查看聊天详情") + public ResultMessage get(@PathVariable String id) { + + ImTalk imTalk = imTalkService.getById(id); + return ResultUtil.data(imTalk); + } + + @GetMapping(value = "/user/{uid}") + @ApiOperation(value = "查看与某人聊天详情") + public ResultMessage getUser(@PathVariable String uid) { + //通过长度判断,保证每次都是同一个聊天 + return ResultUtil.data(imTalkService.getTalkByUser(uid)); + } + + @GetMapping(value = "/by/user/{userId}") + @ApiOperation(value = "查看与某人聊天详情") + public ResultMessage getByUser(@PathVariable String userId) { + return ResultUtil.data(imTalkService.getTalkByUserId(userId)); + } + + @GetMapping(value = "/top") + @ApiOperation(value = "查看与某人聊天详情") + public ResultMessage top(String id, Boolean top) { + imTalkService.top(id, top); + return ResultUtil.success(); + } + + @GetMapping("/list") + @ApiOperation(value = "分页获取用户聊天") + public ResultMessage> getUserTalkList() { + return ResultUtil.data(imTalkService.getUserTalkList()); + } + + @GetMapping("/store/list") + @ApiOperation(value = "分页获取商家聊天") + public ResultMessage> getStoreTalkList() { + return ResultUtil.data(imTalkService.getStoreTalkList()); + } + + @DeleteMapping(value = "/{id}") + @ApiOperation(value = "删除聊天") + public ResultMessage disable(@PathVariable String id) { + imTalkService.disable(id); + return ResultUtil.success(ResultCode.SUCCESS); + } +} diff --git a/im-api/src/main/java/cn/lili/controller/im/WebSocketServer.java b/im-api/src/main/java/cn/lili/controller/im/WebSocketServer.java new file mode 100644 index 00000000..97db2ad9 --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/im/WebSocketServer.java @@ -0,0 +1,180 @@ +package cn.lili.controller.im; + +import cn.hutool.json.JSONUtil; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.modules.im.config.CustomSpringConfigurator; +import cn.lili.modules.im.entity.dos.ImMessage; +import cn.lili.modules.im.entity.dos.ImTalk; +import cn.lili.modules.im.entity.enums.MessageResultType; +import cn.lili.modules.im.entity.vo.MessageOperation; +import cn.lili.modules.im.entity.vo.MessageVO; +import cn.lili.modules.im.service.ImMessageService; +import cn.lili.modules.im.service.ImTalkService; +import com.alibaba.druid.util.StringUtils; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author liushuai + */ +@Component +@ServerEndpoint(value = "/lili/webSocket/{accessToken}", configurator = CustomSpringConfigurator.class) +@Scope("prototype") +@Slf4j +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class WebSocketServer { + /** + * 消息服务 + */ + private final ImMessageService imMessageService; + + private final ImTalkService imTalkService; + + /** + * 在线人数 + * PS 注意,只能单节点,如果多节点部署需要自行寻找方案 + */ + private static ConcurrentHashMap sessionPools = new ConcurrentHashMap<>(); + + + /** + * 建立连接 + * + * @param session + */ + @OnOpen + public void onOpen(@PathParam("accessToken") String accessToken, Session session) { + + + AuthUser authUser = UserContext.getAuthUser(accessToken); + + String sessionId = UserEnums.STORE.equals(authUser.getRole()) ? authUser.getStoreId() : authUser.getId(); + //如果已有会话,则进行下线提醒。 + if (sessionPools.containsKey(sessionId)) { + log.info("用户重复登陆,旧用户下线"); + Session oldSession = sessionPools.get(sessionId); + sendMessage(oldSession, MessageVO.builder().messageResultType(MessageResultType.OFFLINE).result("用户异地登陆").build()); + try { + oldSession.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + sessionPools.put(sessionId, session); + } + + /** + * 关闭连接 + */ + @OnClose + public void onClose(@PathParam("accessToken") String accessToken) { + AuthUser authUser = UserContext.getAuthUser(accessToken); + log.info("用户断开断开连接:{}", JSONUtil.toJsonStr(authUser)); + sessionPools.remove(authUser); + } + + /** + * 发送消息 + * + * @param msg + * @throws IOException + */ + @OnMessage + public void onMessage(@PathParam("accessToken") String accessToken, String msg) { + log.info("发送消息:{}", msg); + MessageOperation messageOperation = JSON.parseObject(msg, MessageOperation.class); + operation(accessToken, messageOperation); + } + + /** + * IM操作 + * + * @param accessToken + * @param messageOperation + */ + private void operation(String accessToken, MessageOperation messageOperation) { + + AuthUser authUser = UserContext.getAuthUser(accessToken); + switch (messageOperation.getOperationType()) { + case PING: + break; + case MESSAGE: + //保存消息 + ImMessage imMessage = new ImMessage(messageOperation); + imMessageService.save(imMessage); + //修改最后消息信息 + imTalkService.update(new LambdaUpdateWrapper().eq(ImTalk::getId, messageOperation.getTalkId()).set(ImTalk::getLastTalkMessage, messageOperation.getContext()) + .set(ImTalk::getLastTalkTime, imMessage.getCreateTime()) + .set(ImTalk::getLastMessageType, imMessage.getMessageType())); + //发送消息 + sendMessage(messageOperation.getTo(), new MessageVO(MessageResultType.MESSAGE, imMessage)); + break; + case READ: + if (!StringUtils.isEmpty(messageOperation.getContext())) { + imMessageService.read(messageOperation.getTalkId(), accessToken); + } + break; + case UNREAD: + sendMessage(authUser.getId(), new MessageVO(MessageResultType.UN_READ, imMessageService.unReadMessages(accessToken))); + break; + case HISTORY: + sendMessage(authUser.getId(), new MessageVO(MessageResultType.HISTORY, imMessageService.historyMessage(accessToken, messageOperation.getTo()))); + break; + default: + break; + } + } + + /** + * 发送消息 + * + * @param sessionId sessionId + * @param message 消息对象 + */ + private void sendMessage(String sessionId, MessageVO message) { + Session session = sessionPools.get(sessionId); + sendMessage(session, message); + } + + /** + * 发送消息 + * + * @param session 会话 + * @param message 消息对象 + */ + private void sendMessage(Session session, MessageVO message) { + if (session != null) { + try { + session.getBasicRemote().sendText(JSON.toJSONString(message, true)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * socket exception + * + * @param session + * @param throwable + */ + @OnError + public void onError(Session session, Throwable throwable) { + log.error("socket异常: {}", session.getId(), throwable); + } + + +} diff --git a/socket-api/src/main/java/cn/lili/scocket/listener/ScoketSecurityConfig.java b/im-api/src/main/java/cn/lili/controller/security/ImSecurityConfig.java similarity index 51% rename from socket-api/src/main/java/cn/lili/scocket/listener/ScoketSecurityConfig.java rename to im-api/src/main/java/cn/lili/controller/security/ImSecurityConfig.java index d317190a..185b3ad9 100644 --- a/socket-api/src/main/java/cn/lili/scocket/listener/ScoketSecurityConfig.java +++ b/im-api/src/main/java/cn/lili/controller/security/ImSecurityConfig.java @@ -1,6 +1,5 @@ -package cn.lili.scocket.listener; +package cn.lili.controller.security; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -8,28 +7,47 @@ import org.springframework.security.config.annotation.method.configuration.Enabl import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; +import org.springframework.web.cors.CorsConfigurationSource; /** - * spring Security 核心配置类 Store安全配置中心 + * spring Security 核心配置类 通用安全 * * @author Chopper * @version v4.0 - * @Description: * @since 2020/11/14 16:20 */ @Slf4j @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ScoketSecurityConfig extends WebSecurityConfigurerAdapter { +public class ImSecurityConfig extends WebSecurityConfigurerAdapter { + /** + * spring security -》 权限不足处理 + */ + @Autowired + private CorsConfigurationSource corsConfigurationSource; + @Override protected void configure(HttpSecurity http) throws Exception { ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = http .authorizeRequests(); - registry.antMatchers("**").permitAll(); + registry + .and() + //禁止网页iframe + .headers().frameOptions().disable() + .and() + .authorizeRequests() + //任何请求 + .anyRequest() + //需要身份认证 + .permitAll() + .and() + //允许跨域 + .cors().configurationSource(corsConfigurationSource).and() + //关闭跨站请求防护 + .csrf().disable(); } } diff --git a/im-api/src/main/java/cn/lili/controller/store/im/QAStoreController.java b/im-api/src/main/java/cn/lili/controller/store/im/QAStoreController.java new file mode 100644 index 00000000..d2dc9bd2 --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/store/im/QAStoreController.java @@ -0,0 +1,62 @@ +package cn.lili.controller.store.im; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.im.entity.dos.QA; +import cn.lili.modules.im.service.QAService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +/** + * 管理端,自定义分词接口 + * + * @author paulG + * @since 2020/10/16 + **/ +@Slf4j +@RestController +@Api(tags = "管理端,自定义分词接口") +@RequestMapping("/im/store/qa") +public class QAStoreController { + + @Autowired + private QAService qaService; + + @ApiOperation(value = "添加问答") + @PostMapping + public ResultMessage addCustomWords(@Valid QA qa) { + qaService.save(qa); + return ResultUtil.data(qa); + } + + @ApiOperation(value = "修改自定义问答") + @PutMapping + public ResultMessage updateCustomWords(@Valid QA qa) { + qaService.updateById(qa); + return ResultUtil.data(qa); + } + + @ApiOperation(value = "删除自定义分词") + @DeleteMapping("/{id}") + public ResultMessage deleteCustomWords(@NotNull @PathVariable String id) { + qaService.removeById(id); + return ResultUtil.success(); + } + + @ApiOperation(value = "分页获取自定义分词") + @ApiImplicitParam(name = "word", value = "问题", required = true, dataType = "String", paramType = "query") + @GetMapping("/page") + public ResultMessage> getCustomWords(@RequestParam String word, PageVO pageVo) { + return ResultUtil.data(qaService.getStoreQA(word, pageVo)); + } + +} diff --git a/im-api/src/main/java/cn/lili/controller/store/seat/SeatLogin.java b/im-api/src/main/java/cn/lili/controller/store/seat/SeatLogin.java new file mode 100644 index 00000000..1c7dcab6 --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/store/seat/SeatLogin.java @@ -0,0 +1,59 @@ +package cn.lili.controller.store.seat; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.im.service.SeatService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 坐席登录接口 + * + * @author Chopper + * @version v1.0 + * 2022-02-10 16:40 + */ +@Slf4j +@RestController +@Api(tags = "坐席端") +@RequestMapping("/seat/login") +public class SeatLogin { + + @Autowired + private SeatService seatService; + + @ApiOperation(value = "登录接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "username", value = "用户名", required = true, paramType = "query"), + @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query") + }) + @PostMapping("/userLogin") + public ResultMessage userLogin(String username, String password) { + return ResultUtil.data(this.seatService.usernameLogin(username, password)); + } + + @ApiOperation(value = "商家快捷登录客服") + @PostMapping("/quicklogin") + public ResultMessage quickLogin(String code) { + return ResultUtil.data(this.seatService.quickLogin(code)); + } + + + @ApiOperation(value = "登出") + @PostMapping("/logout") + public ResultMessage logout() { + //todo +// UserContext.getCurrentUser().getId() +// verificationServiceClient.check(uuid); + return ResultUtil.success(); + } + + +} diff --git a/im-api/src/main/java/cn/lili/controller/store/seat/SeatSettingStoreController.java b/im-api/src/main/java/cn/lili/controller/store/seat/SeatSettingStoreController.java new file mode 100644 index 00000000..68d4ec51 --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/store/seat/SeatSettingStoreController.java @@ -0,0 +1,44 @@ +package cn.lili.controller.store.seat; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.im.entity.dos.SeatSetting; +import cn.lili.modules.im.service.SeatSettingService;; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 店铺端,分类绑定参数组管理接口 + * + * @author pikachu + * @since 2020-02-18 15:18:56 + */ +@RestController +@Api(tags = "店铺端,坐席设置") +@RequestMapping("/store/seat/setting") +@Transactional(rollbackFor = Exception.class) +public class SeatSettingStoreController { + + @Autowired + private SeatSettingService seatSettingService; + + @ApiOperation(value = "查询坐席设置") + @GetMapping + public ResultMessage getSetting() { + return ResultUtil.data(seatSettingService.getSetting(UserContext.getCurrentUser().getTenantId())); + } + + @ApiOperation(value = "更新坐席设置") + @PutMapping + public void update(SeatSetting seatSetting) { + seatSetting.setTenantId(UserContext.getCurrentUser().getTenantId()); + seatSettingService.updateByStore(seatSetting); + } +} diff --git a/im-api/src/main/java/cn/lili/controller/store/seat/SeatStoreController.java b/im-api/src/main/java/cn/lili/controller/store/seat/SeatStoreController.java new file mode 100644 index 00000000..07c2ed8e --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/store/seat/SeatStoreController.java @@ -0,0 +1,42 @@ +package cn.lili.controller.store.seat; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.im.entity.vo.SeatVO; +import cn.lili.modules.im.service.SeatService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * SeatController + * + * @author Chopper + * @version v1.0 + * 2022-02-10 11:50 + */ +@RestController +@Api(tags = "店铺端,坐席管理") +@RequestMapping("/store/seat/setting") +@Transactional(rollbackFor = Exception.class) +public class SeatStoreController { + + + @Autowired + private SeatService seatService; + + @ApiOperation(value = "分页获取坐席") + @GetMapping("/list") + public ResultMessage> getSeats() { + return ResultUtil.data(seatService.seatVoList(UserContext.getCurrentUser().getTenantId())); + } + + +} diff --git a/im-api/src/main/java/cn/lili/controller/store/seat/SeatStoreManagerController.java b/im-api/src/main/java/cn/lili/controller/store/seat/SeatStoreManagerController.java new file mode 100644 index 00000000..ee33241e --- /dev/null +++ b/im-api/src/main/java/cn/lili/controller/store/seat/SeatStoreManagerController.java @@ -0,0 +1,39 @@ +package cn.lili.controller.store.seat; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.im.entity.vo.SeatVO; +import cn.lili.modules.im.service.SeatService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * SeatController + * + * @author Chopper + * @version v1.0 + * 2022-02-10 11:50 + */ +@RestController +@Api(tags = "店铺端,坐席管理") +@RequestMapping("/manager/seat/setting") +@Transactional(rollbackFor = Exception.class) +public class SeatStoreManagerController { + + @Autowired + private SeatService seatService; + + @ApiOperation(value = "查看店铺坐席列表") + @GetMapping("/list") + public ResultMessage> getSeats(String storeId) { + return ResultUtil.data(seatService.seatVoList(storeId)); + } + +} diff --git a/socket-api/src/main/resources/application.yml b/im-api/src/main/resources/application.yml similarity index 80% rename from socket-api/src/main/resources/application.yml rename to im-api/src/main/resources/application.yml index c10a84e8..da5cd1a2 100644 --- a/socket-api/src/main/resources/application.yml +++ b/im-api/src/main/resources/application.yml @@ -1,11 +1,9 @@ server: port: 8885 + servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -24,28 +22,15 @@ management: exposure: include: '*' spring: + application: + name: im-api # 要在其中注册的Spring Boot Admin Server的URL。 boot: admin: client: url: http://127.0.0.1:8000 - # mongodb - data: - mongodb: - host: 127.0.0.1 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset cache: type: redis - - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false # Redis redis: host: 127.0.0.1 @@ -117,13 +102,13 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: - show: true + show: false # 忽略鉴权url ignored: @@ -134,37 +119,19 @@ ignored: - /MP_verify_qSyvBPhDsPdxvOhC.txt - /weixin/** - /source/** - - /buyer/mini-program/** - - /buyer/cashier/** - - /buyer/pageData/** - - /buyer/article/** - - /buyer/goods/** - - /buyer/category/** - - /buyer/shop/** - - /buyer/connect/** - - /buyer/members/smsLogin - - /buyer/members/refresh/* - - /buyer/members/refresh** - - /buyer/promotion/pintuan - - /buyer/promotion/seckill - - /buyer/memberEvaluation/**/goodsEvaluation - - /buyer/memberEvaluation/**/evaluationNumber - - /store/login/** - - /manager/user/login - - /manager/user/refresh/** + - /manager/passport/user/login + - /manager/passport/user/refresh/** + - /manager/other/elasticsearch + - /manager/other/customWords - /druid/** - /swagger-ui.html - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - /v2/api-docs - /configuration/ui - /boot-admin - statics: - /**/*.js - /**/*.css - /**/*.png @@ -192,19 +159,21 @@ mybatis-plus: # 日志 logging: + config: classpath:logback-spring.xml # 输出级别 level: cn.lili: info # org.hibernate: debug # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 path: lili-logs - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-size: 5MB + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB #加密参数 jasypt: encryptor: @@ -213,6 +182,11 @@ jasypt: lili: system: isDemoSite: true + # 脱敏级别: + # 0:不做脱敏处理 + # 1:管理端用户手机号等信息脱敏 + # 2:商家端信息脱敏(为2时,表示管理端,商家端同时脱敏) + sensitiveLevel: 1 statistics: # 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数 onlineMember: 48 @@ -224,16 +198,16 @@ lili: sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6 #域名 domain: - pc: http://127.0.0.1:8888 - wap: http://127.0.0.1:8888 - seller: http://127.0.0.1:8888 - admin: http://127.0.0.1:8888 + pc: https://pc.b2b2c.pickmall.cn + wap: https://m.b2b2c.pickmall.cn + store: https://store.b2b2c.pickmall.cn + admin: https://admin.b2b2c.pickmall.cn #api地址 api: - buyer: https://z171l91606.51mypc.cn/ - base: http://127.0.0.1:8888 - manager: http://127.0.0.1:8888 - seller: http://127.0.0.1:8888 + buyer: https://buyer-api.pickmall.cn + common: https://common-api.pickmall.cn + manager: https://admin-api.pickmall.cn + store: https://store-api.pickmall.cn # jwt 细节设定 jwt-setting: @@ -261,7 +235,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 127.0.0.1:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group @@ -273,12 +248,16 @@ lili: order-group: lili_order_group member-topic: lili_member_topic member-group: lili_member_group + store-topic: lili_store_topic + store-group: lili_store_group other-topic: lili_other_topic other-group: lili_other_group notice-topic: lili_notice_topic notice-group: lili_notice_group notice-send-topic: lili_send_notice_topic notice-send-group: lili_send_notice_group + after-sale-topic: lili_after_sale_topic + after-sale-group: lili_after_sale_group rocketmq: name-server: 127.0.0.1:9876 producer: diff --git a/im-api/src/main/resources/logback-spring.xml b/im-api/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..b7c9425a --- /dev/null +++ b/im-api/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE_PATH}/rocketmq.log + + ${LOG_FILE_PATH}/rocketmq/rocketmq-%d{yyyy-MM-dd}.log + 30 + 30MB + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n + + + + + + + + + + + ${LOGSTASH_SERVER} + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/manager-api/pom.xml b/manager-api/pom.xml index bf583500..f2b40c40 100644 --- a/manager-api/pom.xml +++ b/manager-api/pom.xml @@ -8,14 +8,15 @@ cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml cn.lili framework - 1.0.1 + ${revision} diff --git a/manager-api/src/main/java/cn/lili/ManagerApiApplication.java b/manager-api/src/main/java/cn/lili/ManagerApiApplication.java index c9d22b70..f5e557ab 100644 --- a/manager-api/src/main/java/cn/lili/ManagerApiApplication.java +++ b/manager-api/src/main/java/cn/lili/ManagerApiApplication.java @@ -6,7 +6,6 @@ import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.core.task.TaskExecutor; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -14,23 +13,22 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; * 运营后台 API * * @author Chopper - * @date 2020/11/16 10:03 下午 + * @since 2020/11/16 10:03 下午 */ @SpringBootApplication @EnableCaching @EnableAsync -@EnableJpaAuditing public class ManagerApiApplication { @Primary @Bean public TaskExecutor primaryTask() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - return executor; + return new ThreadPoolTaskExecutor(); } public static void main(String[] args) { System.setProperty("es.set.netty.runtime.available.processors", "false"); + System.setProperty("rocketmq.client.logUseSlf4j","true"); SpringApplication.run(ManagerApiApplication.class, args); } diff --git a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionCashManagerController.java b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionCashManagerController.java index 1aff99ad..2c470682 100644 --- a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionCashManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionCashManagerController.java @@ -1,6 +1,7 @@ package cn.lili.controller.distribution; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.DistributionCash; import cn.lili.modules.distribution.entity.vos.DistributionCashSearchParams; @@ -10,7 +11,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,15 +20,15 @@ import javax.validation.constraints.NotNull; * 管理端,分销佣金管理接口 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @RestController @Api(tags = "管理端,分销佣金管理接口") @RequestMapping("/manager/distribution/cash") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionCashManagerController { - private final DistributionCashService distributorCashService; + @Autowired + private DistributionCashService distributorCashService; @ApiOperation(value = "通过id获取分销佣金详情") @GetMapping(value = "/get/{id}") @@ -44,6 +44,7 @@ public class DistributionCashManagerController { } + @PreventDuplicateSubmissions @ApiOperation(value = "审核") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "分销佣金ID", required = true, paramType = "path", dataType = "String"), diff --git a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsManagerController.java b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsManagerController.java index aeb003dc..a4182635 100644 --- a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsManagerController.java @@ -1,7 +1,6 @@ package cn.lili.controller.distribution; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dto.DistributionGoodsSearchParams; import cn.lili.modules.distribution.entity.vos.DistributionGoodsVO; @@ -9,7 +8,6 @@ import cn.lili.modules.distribution.service.DistributionGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,15 +17,15 @@ import java.util.List; * 管理端,分销商品管理接口 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @RestController @Api(tags = "管理端,分销商品管理接口") @RequestMapping("/manager/distribution/goods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionGoodsManagerController { - private final DistributionGoodsService distributionGoodsService; + @Autowired + private DistributionGoodsService distributionGoodsService; @GetMapping(value = "/getByPage") @ApiOperation(value = "分页获取") @@ -41,6 +39,6 @@ public class DistributionGoodsManagerController { public ResultMessage delAllByIds(@PathVariable List ids) { distributionGoodsService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionManagerController.java b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionManagerController.java index a4469cab..8ef39b1d 100644 --- a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionManagerController.java @@ -1,7 +1,9 @@ package cn.lili.controller.distribution; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.Distribution; @@ -12,7 +14,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,15 +23,15 @@ import javax.validation.constraints.NotNull; * 管理端,分销员管理接口 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @RestController @Api(tags = "管理端,分销员管理接口") -@RequestMapping("/manager/distribution") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/distribution/distribution") public class DistributionManagerController { - private final DistributionService distributionService; + @Autowired + private DistributionService distributionService; @ApiOperation(value = "分页获取") @GetMapping(value = "/getByPage") @@ -39,6 +40,7 @@ public class DistributionManagerController { } + @PreventDuplicateSubmissions @ApiOperation(value = "清退分销商") @PutMapping(value = "/retreat/{id}") @ApiImplicitParams({ @@ -46,13 +48,14 @@ public class DistributionManagerController { }) public ResultMessage retreat(@PathVariable String id) { if (distributionService.retreat(id)) { - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } else { - return ResultUtil.error(ResultCode.DISTRIBUTION_RETREAT_ERROR); + throw new ServiceException(ResultCode.DISTRIBUTION_RETREAT_ERROR); } } + @PreventDuplicateSubmissions @ApiOperation(value = "恢复分销商") @PutMapping(value = "/resume/{id}") @ApiImplicitParams({ @@ -60,13 +63,14 @@ public class DistributionManagerController { }) public ResultMessage resume(@PathVariable String id) { if (distributionService.resume(id)) { - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } else { - return ResultUtil.error(ResultCode.DISTRIBUTION_RETREAT_ERROR); + throw new ServiceException(ResultCode.DISTRIBUTION_RETREAT_ERROR); } } + @PreventDuplicateSubmissions @ApiOperation(value = "审核分销商") @PutMapping(value = "/audit/{id}") @ApiImplicitParams({ @@ -75,9 +79,9 @@ public class DistributionManagerController { }) public ResultMessage audit(@NotNull @PathVariable String id, @NotNull String status) { if (distributionService.audit(id, status)) { - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } else { - return ResultUtil.error(ResultCode.DISTRIBUTION_AUDIT_ERROR); + throw new ServiceException(ResultCode.DISTRIBUTION_AUDIT_ERROR); } } diff --git a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionOrderManagerController.java b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionOrderManagerController.java index 21ddaeee..acbbdb24 100644 --- a/manager-api/src/main/java/cn/lili/controller/distribution/DistributionOrderManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/distribution/DistributionOrderManagerController.java @@ -1,6 +1,6 @@ package cn.lili.controller.distribution; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams; @@ -8,7 +8,6 @@ import cn.lili.modules.distribution.service.DistributionOrderService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -19,15 +18,15 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,分销订单管理接口 * * @author pikachu - * @date 2020-03-14 23:04:56 + * @since 2020-03-14 23:04:56 */ @RestController @Api(tags = "管理端,分销订单管理接口") @RequestMapping("/manager/distribution/order") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DistributionOrderManagerController { - private final DistributionOrderService distributionOrderService; + @Autowired + private DistributionOrderService distributionOrderService; @ApiOperation(value = "通过id获取分销订单") @GetMapping(value = "/get/{id}") diff --git a/manager-api/src/main/java/cn/lili/controller/file/FileManagerController.java b/manager-api/src/main/java/cn/lili/controller/file/FileManagerController.java index d807733b..9667dc7d 100644 --- a/manager-api/src/main/java/cn/lili/controller/file/FileManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/file/FileManagerController.java @@ -1,7 +1,6 @@ package cn.lili.controller.file; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; @@ -11,7 +10,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,15 +20,15 @@ import java.util.List; * 管理端,文件管理管理接口 * * @author Chopper - * @date 2020/11/26 15:41 + * @since 2020/11/26 15:41 */ @RestController -@Api(tags = "管理端,文件管理管理接口") -@RequestMapping("/manager/file") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@Api(tags = "管理端,文件管理接口") +@RequestMapping("/manager/common/file") public class FileManagerController { - private final FileService fileService; + @Autowired + private FileService fileService; @ApiOperation(value = "管理端管理所有图片") @@ -55,7 +53,7 @@ public class FileManagerController { @DeleteMapping(value = "/delete/{ids}") public ResultMessage delete(@PathVariable List ids) { fileService.batchDelete(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java index 7ea4bd95..9cab9a3c 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java @@ -1,9 +1,9 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.MessageCode; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.Brand; import cn.lili.modules.goods.entity.dto.BrandPageDTO; @@ -15,7 +15,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -28,18 +27,18 @@ import java.util.List; * 管理端,品牌接口 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @RestController @Api(tags = "管理端,品牌接口") @RequestMapping("/manager/goods/brand") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class BrandManagerController { /** * 品牌 */ - private final BrandService brandService; + @Autowired + private BrandService brandService; @ApiOperation(value = "通过id获取") @ApiImplicitParam(name = "id", value = "品牌ID", required = true, dataType = "String", paramType = "path") @@ -67,7 +66,7 @@ public class BrandManagerController { if (brandService.addBrand(brand)) { return ResultUtil.data(brand); } - return ResultUtil.error(ResultCode.BRAND_SAVE_ERROR); + throw new ServiceException(ResultCode.BRAND_SAVE_ERROR); } @ApiOperation(value = "更新数据") @@ -78,33 +77,28 @@ public class BrandManagerController { if (brandService.updateBrand(brand)) { return ResultUtil.data(brand); } - return ResultUtil.error(ResultCode.BRAND_UPDATE_ERROR); + throw new ServiceException(ResultCode.BRAND_UPDATE_ERROR); } @ApiOperation(value = "后台禁用品牌") @ApiImplicitParams({ @ApiImplicitParam(name = "brandId", value = "品牌ID", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "id", value = "是否不可用", required = true, dataType = "String", paramType = "query") + @ApiImplicitParam(name = "disable", value = "是否可用", required = true, dataType = "boolean", paramType = "query") }) @PutMapping(value = "/disable/{brandId}") public ResultMessage disable(@PathVariable String brandId, @RequestParam Boolean disable) { if (brandService.brandDisable(brandId, disable)) { - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } - return ResultUtil.error(ResultCode.BRAND_DISABLE_ERROR); + throw new ServiceException(ResultCode.BRAND_DISABLE_ERROR); } @ApiOperation(value = "批量删除") @ApiImplicitParam(name = "ids", value = "品牌ID", required = true, dataType = "String", allowMultiple = true, paramType = "path") @DeleteMapping(value = "/delByIds/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { - - for (String id : ids) { - Brand brand = brandService.getById(id); - brand.setDeleteFlag(true); - brandService.updateById(brand); - } - return ResultUtil.success(ResultCode.BRAND_DELETE_ERROR); + brandService.deleteBrands(ids); + return ResultUtil.success(ResultCode.SUCCESS); } } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/CategoryBrandManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/CategoryBrandManagerController.java index 1708d609..05aaf8bc 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/CategoryBrandManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/CategoryBrandManagerController.java @@ -1,17 +1,13 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.goods.entity.dos.CategoryBrand; import cn.lili.modules.goods.entity.vos.CategoryBrandVO; import cn.lili.modules.goods.service.CategoryBrandService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,18 +17,18 @@ import java.util.List; * 管理端,分类品牌接口 * * @author pikachu - * @date 2020-02-27 15:18:56 + * @since 2020-02-27 15:18:56 */ @RestController @Api(tags = "管理端,分类品牌接口") -@RequestMapping("/manager/category/brand") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/goods/categoryBrand") public class CategoryBrandManagerController { /** * 规格品牌管理 */ - private final CategoryBrandService categoryBrandService; + @Autowired + private CategoryBrandService categoryBrandService; @ApiOperation(value = "查询某分类下绑定的品牌信息") @ApiImplicitParam(name = "categoryId", value = "分类id", required = true, dataType = "String", paramType = "path") @@ -47,15 +43,9 @@ public class CategoryBrandManagerController { @ApiImplicitParam(name = "categoryId", value = "分类id", required = true, paramType = "path", dataType = "String"), @ApiImplicitParam(name = "categoryBrands", value = "品牌id数组", required = true, paramType = "query", dataType = "String[]") }) - public ResultMessage saveCategoryBrand(@PathVariable String categoryId, @RequestParam String[] categoryBrands) { - //删除分类品牌绑定信息 - this.categoryBrandService.remove(new QueryWrapper().eq("category_id", categoryId)); - //绑定品牌信息 - for (String brandId : categoryBrands) { - CategoryBrand categoryBrand = new CategoryBrand(categoryId, brandId); - categoryBrandService.save(categoryBrand); - } - return ResultUtil.success(ResultCode.SUCCESS); + public ResultMessage saveCategoryBrand(@PathVariable String categoryId, @RequestParam List categoryBrands) { + categoryBrandService.saveCategoryBrandList(categoryId,categoryBrands); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java index 9a5cedfb..8b9e6fb9 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java @@ -1,8 +1,9 @@ package cn.lili.controller.goods; +import cn.lili.common.aop.annotation.DemoSite; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.utils.StringUtils; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.Category; import cn.lili.modules.goods.entity.vos.CategoryVO; @@ -12,7 +13,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.web.bind.annotation.*; @@ -25,24 +25,25 @@ import java.util.List; * 管理端,商品分类接口 * * @author pikachu - * @date 2020-02-27 15:18:56 + * @since 2020-02-27 15:18:56 */ @RestController @Api(tags = "管理端,商品分类接口") @RequestMapping("/manager/goods/category") @CacheConfig(cacheNames = "category") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CategoryManagerController { /** * 分类 */ - private final CategoryService categoryService; + @Autowired + private CategoryService categoryService; /** * 商品 */ - private final GoodsService goodsService; + @Autowired + private GoodsService goodsService; @ApiOperation(value = "查询某分类下的全部子分类列表") @ApiImplicitParam(name = "parentId", value = "父id,顶级为0", required = true, dataType = "String", paramType = "path") @@ -54,50 +55,36 @@ public class CategoryManagerController { @ApiOperation(value = "查询全部分类列表") @GetMapping(value = "/allChildren") public ResultMessage> list() { - return ResultUtil.data(this.categoryService.listAllChildrenDB()); + return ResultUtil.data(this.categoryService.listAllChildren()); } @PostMapping + @DemoSite @ApiOperation(value = "添加商品分类") public ResultMessage saveCategory(@Valid Category category) { - - //不能添加重复的分类名称 - Category category1 = new Category(); - category1.setName(category.getName()); - List list = categoryService.findByAllBySortOrder(category1); - if (StringUtils.isNotEmpty(list)) { - return ResultUtil.error(ResultCode.CATEGORY_NOT_EXIST); - } - // 非顶级分类 - if (category.getParentId() != null && !category.getParentId().equals("0")) { + //非顶级分类 + if (category.getParentId() != null && !"0".equals(category.getParentId())) { Category parent = categoryService.getById(category.getParentId()); if (parent == null) { - return ResultUtil.error(ResultCode.CATEGORY_PARENT_NOT_EXIST); + throw new ServiceException(ResultCode.CATEGORY_PARENT_NOT_EXIST); } if (category.getLevel() >= 4) { - return ResultUtil.error(ResultCode.CATEGORY_BEYOND_THREE); + throw new ServiceException(ResultCode.CATEGORY_BEYOND_THREE); } } if (categoryService.saveCategory(category)) { return ResultUtil.data(category); } - return ResultUtil.error(ResultCode.CATEGORY_SAVE_ERROR); + throw new ServiceException(ResultCode.CATEGORY_SAVE_ERROR); } @PutMapping + @DemoSite @ApiOperation(value = "修改商品分类") - public ResultMessage updateCategory(CategoryVO category) { + public ResultMessage updateCategory(@Valid CategoryVO category) { Category catTemp = categoryService.getById(category.getId()); if (catTemp == null) { - return ResultUtil.error(ResultCode.CATEGORY_PARENT_NOT_EXIST); - } - //不能添加重复的分类名称 - Category category1 = new Category(); - category1.setName(category.getName()); - category1.setId(category.getId()); - List list = categoryService.findByAllBySortOrder(category1); - if (StringUtils.isNotEmpty(list)) { - return ResultUtil.error(ResultCode.CATEGORY_NAME_IS_EXIST); + throw new ServiceException(ResultCode.CATEGORY_NOT_EXIST); } categoryService.updateCategory(category); @@ -105,38 +92,40 @@ public class CategoryManagerController { } @DeleteMapping(value = "/{id}") - @ApiImplicitParam(name = "goodsId", value = "分类ID", required = true, paramType = "path", dataType = "String") + @DemoSite + @ApiImplicitParam(name = "id", value = "分类ID", required = true, paramType = "path", dataType = "String") @ApiOperation(value = "通过id删除分类") public ResultMessage delAllByIds(@NotNull @PathVariable String id) { Category category = new Category(); category.setParentId(id); List list = categoryService.findByAllBySortOrder(category); if (list != null && !list.isEmpty()) { - return ResultUtil.error(ResultCode.CATEGORY_HAS_CHILDREN); + throw new ServiceException(ResultCode.CATEGORY_HAS_CHILDREN); } - // 查询某商品分类的商品数量 - Integer count = goodsService.getGoodsCountByCategory(id); + //查询某商品分类的商品数量 + long count = goodsService.getGoodsCountByCategory(id); if (count > 0) { - return ResultUtil.error(ResultCode.CATEGORY_HAS_GOODS); + throw new ServiceException(ResultCode.CATEGORY_HAS_GOODS); } categoryService.delete(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @PutMapping(value = "/disable/{id}") @ApiImplicitParams({ @ApiImplicitParam(name = "goodsId", value = "分类ID", required = true, paramType = "path", dataType = "String") }) + @DemoSite @ApiOperation(value = "后台 禁用/启用 分类") public ResultMessage disable(@PathVariable String id, @RequestParam Boolean enableOperations) { Category category = categoryService.getById(id); if (category == null) { - return ResultUtil.error(ResultCode.CATEGORY_NOT_EXIST); + throw new ServiceException(ResultCode.CATEGORY_NOT_EXIST); } categoryService.updateCategoryStatus(id, enableOperations); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } \ No newline at end of file diff --git a/manager-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupManagerController.java index 01604f18..db806e91 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupManagerController.java @@ -1,7 +1,8 @@ package cn.lili.controller.goods; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.CategoryParameterGroup; import cn.lili.modules.goods.entity.dos.Parameters; @@ -12,8 +13,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -22,23 +23,24 @@ import java.util.List; * 管理端,分类绑定参数组接口 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @RestController @Api(tags = "管理端,分类绑定参数组接口") -@RequestMapping("/manager/goods/category/parameters") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/goods/categoryParameters") public class CategoryParameterGroupManagerController { /** * 参数组 */ - private final ParametersService parametersService; + @Autowired + private ParametersService parametersService; /** * 分类参数 */ - private final CategoryParameterGroupService categoryParameterGroupService; + @Autowired + private CategoryParameterGroupService categoryParameterGroupService; @ApiOperation(value = "查询某分类下绑定的参数信息") @GetMapping(value = "/{categoryId}") @@ -49,22 +51,22 @@ public class CategoryParameterGroupManagerController { @ApiOperation(value = "保存数据") @PostMapping - public ResultMessage saveOrUpdate(CategoryParameterGroup categoryParameterGroup) { + public ResultMessage saveOrUpdate(@Validated CategoryParameterGroup categoryParameterGroup) { if (categoryParameterGroupService.save(categoryParameterGroup)) { return ResultUtil.data(categoryParameterGroup); } - return ResultUtil.error(ResultCode.CATEGORY_PARAMETER_SAVE_ERROR); + throw new ServiceException(ResultCode.CATEGORY_PARAMETER_SAVE_ERROR); } @ApiOperation(value = "更新数据") @PutMapping - public ResultMessage update(CategoryParameterGroup categoryParameterGroup) { + public ResultMessage update(@Validated CategoryParameterGroup categoryParameterGroup) { if (categoryParameterGroupService.updateById(categoryParameterGroup)) { return ResultUtil.data(categoryParameterGroup); } - return ResultUtil.error(ResultCode.CATEGORY_PARAMETER_UPDATE_ERROR); + throw new ServiceException(ResultCode.CATEGORY_PARAMETER_UPDATE_ERROR); } @ApiOperation(value = "通过id删除参数组") @@ -75,7 +77,7 @@ public class CategoryParameterGroupManagerController { parametersService.remove(new QueryWrapper().eq("group_id", id)); //删除参数组 categoryParameterGroupService.removeById(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/CategorySpecificationManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/CategorySpecificationManagerController.java index 541f3550..ab08d003 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/CategorySpecificationManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/CategorySpecificationManagerController.java @@ -1,11 +1,9 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.CategorySpecification; -import cn.lili.modules.goods.entity.vos.CategorySpecificationVO; -import cn.lili.modules.goods.entity.vos.GoodsSpecValueVO; +import cn.lili.modules.goods.entity.dos.Specification; import cn.lili.modules.goods.service.CategorySpecificationService; import cn.lili.modules.goods.service.SpecificationService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -13,47 +11,48 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; import java.util.List; /** * 管理端,商品分类规格接口 * * @author pikachu - * @date 2020-02-27 15:18:56 + * @since 2020-02-27 15:18:56 */ @RestController @Api(tags = "管理端,商品分类规格接口") -@RequestMapping("/manager/goods/category/spec") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/goods/categorySpec") public class CategorySpecificationManagerController { /** * 分类规格 */ - private final CategorySpecificationService categorySpecificationService; + @Autowired + private CategorySpecificationService categorySpecificationService; /** * 规格 */ - private final SpecificationService specificationService; + @Autowired + private SpecificationService specificationService; @ApiOperation(value = "查询某分类下绑定的规格信息") @GetMapping(value = "/{categoryId}") @ApiImplicitParam(name = "categoryId", value = "分类id", required = true, dataType = "String", paramType = "path") - public List getCategorySpec(@PathVariable String categoryId) { + public List getCategorySpec(@PathVariable String categoryId) { return categorySpecificationService.getCategorySpecList(categoryId); } @ApiOperation(value = "查询某分类下绑定的规格信息,商品操作使用") @GetMapping(value = "/goods/{categoryId}") @ApiImplicitParam(name = "categoryId", value = "分类id", required = true, dataType = "String", paramType = "path") - public List getSpec(@PathVariable String categoryId) { - return specificationService.getGoodsSpecValue(categoryId); + public List getSpec(@PathVariable String categoryId) { + return specificationService.list(); } @@ -68,11 +67,14 @@ public class CategorySpecificationManagerController { //删除分类规格绑定信息 this.categorySpecificationService.remove(new QueryWrapper().eq("category_id", categoryId)); //绑定规格信息 - for (String specId : categorySpecs) { - CategorySpecification categoryBrand = new CategorySpecification(categoryId, specId); - categorySpecificationService.save(categoryBrand); + if (categorySpecs != null && categorySpecs.length > 0) { + List categorySpecifications = new ArrayList<>(); + for (String categorySpec : categorySpecs) { + categorySpecifications.add(new CategorySpecification(categoryId, categorySpec)); + } + categorySpecificationService.saveBatch(categorySpecifications); } - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/GoodsManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/GoodsManagerController.java index 711d6757..18d82480 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/GoodsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/GoodsManagerController.java @@ -1,7 +1,10 @@ package cn.lili.controller.goods; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dos.GoodsSku; @@ -16,7 +19,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -28,22 +30,27 @@ import java.util.List; * 管理端,商品管理接口 * * @author pikachu - * @date 2020-02-23 15:18:56 + * @since 2020-02-23 15:18:56 */ @RestController @Api(tags = "管理端,商品管理接口") -@RequestMapping("/manager/goods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/goods/goods") public class GoodsManagerController { - //商品 - private final GoodsService goodsService; - //规格商品 - private final GoodsSkuService goodsSkuService; + /** + * 商品 + */ + @Autowired + private GoodsService goodsService; + /** + * 规格商品 + */ + @Autowired + private GoodsSkuService goodsSkuService; @ApiOperation(value = "分页获取") @GetMapping(value = "/list") - public IPage getByPage(GoodsSearchParams goodsSearchParams) { - return goodsService.queryByParams(goodsSearchParams); + public ResultMessage> getByPage(GoodsSearchParams goodsSearchParams) { + return ResultUtil.data(goodsService.queryByParams(goodsSearchParams)); } @ApiOperation(value = "分页获取商品列表") @@ -54,52 +61,54 @@ public class GoodsManagerController { @ApiOperation(value = "分页获取待审核商品") @GetMapping(value = "/auth/list") - public IPage getAuthPage(GoodsSearchParams goodsSearchParams) { - - goodsSearchParams.setIsAuth(GoodsAuthEnum.TOBEAUDITED.name()); - goodsSearchParams.setMarketEnable(GoodsStatusEnum.UPPER.name()); - return goodsService.queryByParams(goodsSearchParams); + public ResultMessage> getAuthPage(GoodsSearchParams goodsSearchParams) { + goodsSearchParams.setAuthFlag(GoodsAuthEnum.TOBEAUDITED.name()); + return ResultUtil.data(goodsService.queryByParams(goodsSearchParams)); } + @PreventDuplicateSubmissions @ApiOperation(value = "管理员下架商品", notes = "管理员下架商品时使用") @ApiImplicitParams({ @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "query", allowMultiple = true), @ApiImplicitParam(name = "reason", value = "下架理由", required = true, paramType = "query") }) + @DemoSite @PutMapping(value = "/{goodsId}/under") public ResultMessage underGoods(@PathVariable String goodsId, @NotEmpty(message = "下架原因不能为空") @RequestParam String reason) { List goodsIds = Arrays.asList(goodsId.split(",")); - if (Boolean.TRUE.equals(goodsService.updateGoodsMarketAble(goodsIds, GoodsStatusEnum.DOWN, reason))) { - return ResultUtil.success(ResultCode.SUCCESS); + if (Boolean.TRUE.equals(goodsService.managerUpdateGoodsMarketAble(goodsIds, GoodsStatusEnum.DOWN, reason))) { + return ResultUtil.success(); } - return ResultUtil.error(ResultCode.GOODS_UNDER_ERROR); + throw new ServiceException(ResultCode.GOODS_UNDER_ERROR); } + @PreventDuplicateSubmissions @ApiOperation(value = "管理员审核商品", notes = "管理员审核商品") @ApiImplicitParams({ @ApiImplicitParam(name = "goodsIds", value = "商品ID", required = true, paramType = "path", allowMultiple = true, dataType = "int"), - @ApiImplicitParam(name = "isAuth", value = "审核结果", required = true, paramType = "query", dataType = "string") + @ApiImplicitParam(name = "authFlag", value = "审核结果", required = true, paramType = "query", dataType = "string") }) @PutMapping(value = "{goodsIds}/auth") - public ResultMessage auth(@PathVariable List goodsIds, @RequestParam String isAuth) { + public ResultMessage auth(@PathVariable List goodsIds, @RequestParam String authFlag) { //校验商品是否存在 - if (goodsService.auditGoods(goodsIds, GoodsAuthEnum.valueOf(isAuth))) { - return ResultUtil.success(ResultCode.SUCCESS); + if (goodsService.auditGoods(goodsIds, GoodsAuthEnum.valueOf(authFlag))) { + return ResultUtil.success(); } - return ResultUtil.error(ResultCode.GOODS_AUTH_ERROR); + throw new ServiceException(ResultCode.GOODS_AUTH_ERROR); } + @PreventDuplicateSubmissions @ApiOperation(value = "管理员上架商品", notes = "管理员上架商品时使用") @PutMapping(value = "/{goodsId}/up") @ApiImplicitParams({ @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, allowMultiple = true) }) public ResultMessage unpGoods(@PathVariable List goodsId) { - if (goodsService.updateGoodsMarketAble(goodsId, GoodsStatusEnum.UPPER, "")) { - return ResultUtil.success(ResultCode.SUCCESS); + if (Boolean.TRUE.equals(goodsService.updateGoodsMarketAble(goodsId, GoodsStatusEnum.UPPER, ""))) { + return ResultUtil.success(); } - return ResultUtil.error(ResultCode.GOODS_UPPER_ERROR); + throw new ServiceException(ResultCode.GOODS_UPPER_ERROR); } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/GoodsParameterManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/GoodsParameterManagerController.java deleted file mode 100644 index 2ed5b661..00000000 --- a/manager-api/src/main/java/cn/lili/controller/goods/GoodsParameterManagerController.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.lili.controller.goods; - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.goods.entity.vos.GoodsParamsGroupVO; -import cn.lili.modules.goods.service.GoodsParamsService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -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.List; - -/** - * 管理端,商品关联参数管理接口 - * - * @author pikachu - * @date 2020-02-18 15:18:56 - */ -@RestController -@Api(tags = "管理端,商品关联参数管理接口") -@RequestMapping("/manager/goods/parameters") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class GoodsParameterManagerController { - - private final GoodsParamsService goodsParamsService; - - @ApiImplicitParams({ - @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path", dataType = "String"), - @ApiImplicitParam(name = "categoryId", value = "分类ID", required = true, paramType = "path", dataType = "String") - }) - @ApiOperation(value = "通过商品id和分类id查询参数信息") - @GetMapping(value = "/{goodsId}/{categoryId}") - public ResultMessage> getGoodsParameters(@PathVariable String goodsId, @PathVariable String categoryId) { - return ResultUtil.data(this.goodsParamsService.queryGoodsParams(goodsId, categoryId)); - } - -} diff --git a/manager-api/src/main/java/cn/lili/controller/goods/GoodsUnitManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/GoodsUnitManagerController.java index 75de6e86..bb3dcdb3 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/GoodsUnitManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/GoodsUnitManagerController.java @@ -1,19 +1,16 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.MessageCode; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.GoodsUnit; import cn.lili.modules.goods.service.GoodsUnitService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -25,15 +22,15 @@ import java.util.List; * 管理端,商品计量单位接口 * * @author Bulbasaur - * @date: 2020/11/26 16:15 + * @since 2020/11/26 16:15 */ @RestController @Api(tags = "管理端,商品计量单位接口") @RequestMapping("/manager/goods/goodsUnit") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsUnitManagerController { - private final GoodsUnitService goodsUnitService; + @Autowired + private GoodsUnitService goodsUnitService; @ApiOperation(value = "分页获取商品计量单位") @@ -70,7 +67,7 @@ public class GoodsUnitManagerController { @DeleteMapping("/delete/{ids}") public ResultMessage delete(@NotNull @PathVariable List ids) { goodsUnitService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/ParameterManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/ParameterManagerController.java index 60844fa2..5a6f06b3 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/ParameterManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/ParameterManagerController.java @@ -1,14 +1,14 @@ package cn.lili.controller.goods; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.Parameters; import cn.lili.modules.goods.service.ParametersService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -18,15 +18,16 @@ import javax.validation.Valid; * 管理端,分类绑定参数组管理接口 * * @author Bulbasaur - * @date: 2020/11/26 16:15 + * @since 2020/11/26 16:15 */ @RestController @Api(tags = "管理端,分类绑定参数组管理接口") @RequestMapping("/manager/goods/parameters") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ParameterManagerController { - private final ParametersService parametersService; + @Autowired + private ParametersService parametersService; + @ApiOperation(value = "添加参数") @PostMapping @@ -35,7 +36,7 @@ public class ParameterManagerController { if (parametersService.save(parameters)) { return ResultUtil.data(parameters); } - return ResultUtil.error(ResultCode.PARAMETER_SAVE_ERROR); + throw new ServiceException(ResultCode.PARAMETER_SAVE_ERROR); } @@ -43,10 +44,10 @@ public class ParameterManagerController { @PutMapping public ResultMessage update(@Valid Parameters parameters) { - if (parametersService.updateById(parameters)) { + if (parametersService.updateParameter(parameters)) { return ResultUtil.data(parameters); } - return ResultUtil.error(ResultCode.PARAMETER_UPDATE_ERROR); + throw new ServiceException(ResultCode.PARAMETER_UPDATE_ERROR); } @ApiOperation(value = "通过id删除参数") @@ -54,7 +55,7 @@ public class ParameterManagerController { @DeleteMapping(value = "/{id}") public ResultMessage delById(@PathVariable String id) { parametersService.removeById(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/SpecValuesManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/SpecValuesManagerController.java deleted file mode 100644 index b050a248..00000000 --- a/manager-api/src/main/java/cn/lili/controller/goods/SpecValuesManagerController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.lili.controller.goods; - - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.goods.entity.dos.SpecValues; -import cn.lili.modules.goods.service.SpecValuesService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 管理端,规格项管理接口 - * - * @author pikachu - * @date 2020-02-18 15:18:56 - */ -@RestController -@Api(tags = "管理端,规格项管理接口") -@RequestMapping("/manager/goods/specValues") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SpecValuesManagerController { - - private final SpecValuesService specValuesService; - - @GetMapping(value = "/values/{id}") - @ApiImplicitParam(name = "id", value = "规格项ID", required = true, dataType = "String", paramType = "path") - @ApiOperation(value = "查询规格值列表") - public ResultMessage> list(@PathVariable("id") String id) { - return ResultUtil.data(specValuesService.query().eq("spec_id", id).list()); - } - - @ApiOperation(value = "保存规格值") - @ApiImplicitParams({ - @ApiImplicitParam(name = "specId", value = "商品规格ID", required = true, paramType = "path"), - @ApiImplicitParam(name = "specValue", value = "商品项", required = true, allowMultiple = true, paramType = "query") - }) - @PostMapping(value = "/save/{specId}") - public ResultMessage> saveSpecValue(@PathVariable String specId, - @NotNull(message = "至少添加一个规格值") @RequestParam String[] specValue) { - //重新添加 - List list = specValuesService.saveSpecValue(specId, specValue); - return ResultUtil.data(list); - - } - - -} diff --git a/manager-api/src/main/java/cn/lili/controller/goods/SpecificationManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/SpecificationManagerController.java index 5eae4cd7..ac97fd6b 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/SpecificationManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/SpecificationManagerController.java @@ -1,20 +1,18 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.Specification; -import cn.lili.modules.goods.entity.dto.SpecificationSearchParams; -import cn.lili.modules.goods.entity.vos.SpecificationVO; import cn.lili.modules.goods.service.SpecificationService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -26,68 +24,49 @@ import java.util.List; * 管理端,商品规格接口 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @RestController @Api(tags = "管理端,商品规格接口") @RequestMapping("/manager/goods/spec") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SpecificationManagerController { - private final SpecificationService specificationService; + @Autowired + private SpecificationService specificationService; - @GetMapping(value = "/{id}") - @ApiImplicitParam(name = "id", value = "商品规格ID", required = true, dataType = "String", paramType = "path") - @ApiOperation(value = "通过id获取商品规格") - public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(specificationService.getSpecification(id)); - } - @RequestMapping(value = "/all", method = RequestMethod.GET) + @GetMapping("/all") @ApiOperation(value = "获取所有可用规格") - public List getAll() { - List list = specificationService.list(new QueryWrapper().eq("delete_flag", 0)); - return list; + public ResultMessage> getAll() { + return ResultUtil.data(specificationService.list()); } - - @GetMapping(value = "/page") - @ApiOperation(value = "分页获取") - public ResultMessage> getByPage(@RequestParam(required = false) String specName, PageVO pageVo) { - SpecificationSearchParams searchParams = new SpecificationSearchParams(); - searchParams.setSpecName(specName); - return ResultUtil.data(specificationService.getSpecificationPage(searchParams, pageVo)); - } - - @PutMapping - @ApiOperation(value = "编辑规格") - public ResultMessage update(@Valid SpecificationVO parameters) { - if (parameters.getStoreId() == null) { - parameters.setStoreId("0"); - } - if (specificationService.updateSpecification(parameters)) { - return ResultUtil.data(parameters); - } - return ResultUtil.error(ResultCode.SPEC_UPDATE_ERROR); + @GetMapping + @ApiOperation(value = "搜索规格") + public ResultMessage> page(String specName, PageVO page) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.like(CharSequenceUtil.isNotEmpty(specName), Specification::getSpecName, specName); + return ResultUtil.data(specificationService.page(PageUtil.initPage(page), lambdaQueryWrapper)); } @PostMapping - @ApiOperation(value = "添加规格") - public ResultMessage save(@Valid SpecificationVO parameters) { - if (parameters.getStoreId() == null) { - parameters.setStoreId("0"); - } - if (specificationService.addSpecification(parameters) != null) { - return ResultUtil.data(parameters); - } - return ResultUtil.error(ResultCode.SPEC_SAVE_ERROR); + @ApiOperation(value = "保存规格") + public ResultMessage save(@Valid Specification specification) { + specificationService.save(specification); + return ResultUtil.success(); } - @DeleteMapping(value = "/{ids}") + @PutMapping("/{id}") + @ApiOperation(value = "更改规格") + public ResultMessage update(@Valid Specification specification, @PathVariable String id) { + specification.setId(id); + return ResultUtil.data(specificationService.saveOrUpdate(specification)); + } + + @DeleteMapping("/{ids}") @ApiImplicitParam(name = "ids", value = "规格ID", required = true, dataType = "String", allowMultiple = true, paramType = "path") @ApiOperation(value = "批量删除") public ResultMessage delAllByIds(@PathVariable List ids) { - specificationService.deleteSpecification(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.data(specificationService.deleteSpecification(ids)); } } diff --git a/manager-api/src/main/java/cn/lili/controller/member/ConnectConfigManagerController.java b/manager-api/src/main/java/cn/lili/controller/member/ConnectConfigManagerController.java deleted file mode 100644 index 0cf6fcc6..00000000 --- a/manager-api/src/main/java/cn/lili/controller/member/ConnectConfigManagerController.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.lili.controller.member; - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.connect.entity.ConnectConfig; -import cn.lili.modules.connect.entity.vo.ConnectConfigForm; -import cn.lili.modules.connect.service.ConnectConfigService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - - -/** - * 管理端,联合登陆配置接口 - * - * @author Chopper - * @date 2020-02-25 14:10:16 - */ -@RestController -@Api(tags = "管理端,联合登陆配置接口") -@RequestMapping("/manager/connectConfig") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ConnectConfigManagerController { - - private final ConnectConfigService connectConfigService; - - @GetMapping(value = "/list") - @ApiOperation(value = "获取所有联合配置") - public ResultMessage> all() { - return ResultUtil.data(connectConfigService.listForms()); - } - - @GetMapping(value = "/{key}") - @ApiOperation(value = "查看联合登陆配置详情") - public ResultMessage get(@PathVariable String key) { - ConnectConfig connectConfig = connectConfigService.getConfig(key); - return ResultUtil.data(connectConfig); - } - - - @PutMapping("/{configKey}") - @ApiOperation(value = "更新联合登陆配置") - public ResultMessage update(@PathVariable String configKey, ConnectConfig connectConfig) { - connectConfig.setConfigKey(configKey); - connectConfigService.saveConfig(connectConfig); - return ResultUtil.data(connectConfig); - } - -} diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberAddressManagerController.java b/manager-api/src/main/java/cn/lili/controller/member/MemberAddressManagerController.java index d87d2041..4896d99b 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberAddressManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/member/MemberAddressManagerController.java @@ -1,16 +1,15 @@ package cn.lili.controller.member; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.MemberAddress; -import cn.lili.modules.promotion.service.MemberAddressService; +import cn.lili.modules.member.service.MemberAddressService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,15 +19,14 @@ import javax.validation.Valid; * 管理端,会员地址API * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "管理端,会员地址API") @RequestMapping("/manager/member/address") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberAddressManagerController { - - private final MemberAddressService memberAddressService; + @Autowired + private MemberAddressService memberAddressService; @ApiOperation(value = "会员地址分页列表") @GetMapping("/{memberId}") @@ -36,14 +34,13 @@ public class MemberAddressManagerController { return ResultUtil.data(memberAddressService.getAddressByMember(page, memberId)); } + @PreventDuplicateSubmissions @ApiOperation(value = "删除会员收件地址") @ApiImplicitParam(name = "id", value = "会员地址ID", dataType = "String", paramType = "path") @DeleteMapping(value = "/delById/{id}") public ResultMessage delShippingAddressById(@PathVariable String id) { - if (memberAddressService.removeMemberAddress(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + memberAddressService.removeMemberAddress(id); + return ResultUtil.success(); } @ApiOperation(value = "修改会员收件地址") @@ -53,6 +50,7 @@ public class MemberAddressManagerController { return ResultUtil.data(memberAddressService.updateMemberAddress(shippingAddress)); } + @PreventDuplicateSubmissions @ApiOperation(value = "新增会员收件地址") @PostMapping public ResultMessage addShippingAddress(@Valid MemberAddress shippingAddress) { diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberEvaluationManagerController.java b/manager-api/src/main/java/cn/lili/controller/member/MemberEvaluationManagerController.java index c593b19a..213706a7 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberEvaluationManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/member/MemberEvaluationManagerController.java @@ -1,7 +1,7 @@ package cn.lili.controller.member; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dto.EvaluationQueryParams; @@ -13,7 +13,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,16 +22,16 @@ import javax.validation.constraints.NotNull; * 管理端,会员商品评价接口 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "管理端,会员商品评价接口") -@RequestMapping("/manager/memberEvaluation") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/member/evaluation") public class MemberEvaluationManagerController { + @Autowired + private MemberEvaluationService memberEvaluationService; - private final MemberEvaluationService memberEvaluationService; - + @PreventDuplicateSubmissions @ApiOperation(value = "通过id获取评论") @ApiImplicitParam(name = "id", value = "评价ID", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/get/{id}") @@ -45,9 +44,10 @@ public class MemberEvaluationManagerController { @GetMapping(value = "/getByPage") public ResultMessage> getByPage(EvaluationQueryParams evaluationQueryParams, PageVO page) { - return ResultUtil.data(memberEvaluationService.queryPage(evaluationQueryParams, page)); + return ResultUtil.data(memberEvaluationService.queryPage(evaluationQueryParams)); } + @PreventDuplicateSubmissions @ApiOperation(value = "修改评价状态") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "评价ID", required = true, paramType = "path"), @@ -55,20 +55,16 @@ public class MemberEvaluationManagerController { }) @GetMapping(value = "/updateStatus/{id}") public ResultMessage updateStatus(@PathVariable String id, @NotNull String status) { - if (memberEvaluationService.updateStatus(id, status)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + memberEvaluationService.updateStatus(id, status); + return ResultUtil.success(); } @ApiOperation(value = "删除评论") @ApiImplicitParam(name = "id", value = "评价ID", required = true, dataType = "String", paramType = "path") @PutMapping(value = "/delete/{id}") public ResultMessage> delete(@PathVariable String id) { - if (memberEvaluationService.delete(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + memberEvaluationService.delete(id); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberGradeManagerController.java b/manager-api/src/main/java/cn/lili/controller/member/MemberGradeManagerController.java new file mode 100644 index 00000000..e2ca98ca --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/member/MemberGradeManagerController.java @@ -0,0 +1,86 @@ +package cn.lili.controller.member; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.MemberGrade; +import cn.lili.modules.member.service.MemberGradeService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 管理端,会员等级接口 + * + * @author Bulbasaur + * @since 2021/5/16 11:29 下午 + */ +@RestController +@Api(tags = "管理端,会员等级接口") +@RequestMapping("/manager/member/memberGrade") +public class MemberGradeManagerController { + + @Autowired + private MemberGradeService memberGradeService; + + @ApiOperation(value = "通过id获取会员等级") + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, dataType = "String", paramType = "path") + @GetMapping(value = "/get/{id}") + public ResultMessage get(@PathVariable String id) { + + return ResultUtil.data(memberGradeService.getById(id)); + } + + @ApiOperation(value = "获取会员等级分页") + @GetMapping(value = "/getByPage") + public ResultMessage> getByPage(PageVO page) { + + return ResultUtil.data(memberGradeService.page(PageUtil.initPage(page))); + } + + @ApiOperation(value = "添加会员等级") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, paramType = "path") + }) + @PostMapping(value = "/add") + public ResultMessage daa(@Validated MemberGrade memberGrade) { + if (memberGradeService.save(memberGrade)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "修改会员等级") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, paramType = "path") + }) + @PutMapping(value = "/update/{id}") + public ResultMessage update(@PathVariable String id,MemberGrade memberGrade) { + if (memberGradeService.updateById(memberGrade)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + + + @ApiOperation(value = "删除会员等级") + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, dataType = "String", paramType = "path") + @DeleteMapping(value = "/delete/{id}") + public ResultMessage> delete(@PathVariable String id) { + if(memberGradeService.getById(id).getIsDefault()){ + throw new ServiceException(ResultCode.USER_GRADE_IS_DEFAULT); + }else if(memberGradeService.removeById(id)){ + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberPointsHistoryManagerController.java b/manager-api/src/main/java/cn/lili/controller/member/MemberPointsHistoryManagerController.java index 99f5d15c..1e6bac6b 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberPointsHistoryManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/member/MemberPointsHistoryManagerController.java @@ -1,19 +1,16 @@ package cn.lili.controller.member; - -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; + +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.MemberPointsHistory; import cn.lili.modules.member.entity.vo.MemberPointsHistoryVO; import cn.lili.modules.member.service.MemberPointsHistoryService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -23,15 +20,14 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,会员积分历史接口 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "管理端,会员积分历史接口") @RequestMapping("/manager/member/memberPointsHistory") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberPointsHistoryManagerController { - - private final MemberPointsHistoryService memberPointsHistoryService; + @Autowired + private MemberPointsHistoryService memberPointsHistoryService; @ApiOperation(value = "分页获取") @ApiImplicitParams({ @@ -40,12 +36,7 @@ public class MemberPointsHistoryManagerController { }) @GetMapping(value = "/getByPage") public ResultMessage> getByPage(PageVO page, String memberId, String memberName) { - - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq(memberId != null, "member_id", memberId); - queryWrapper.like(memberName != null, "member_name", memberName); - - return ResultUtil.data(memberPointsHistoryService.page(PageUtil.initPage(page), queryWrapper)); + return ResultUtil.data(memberPointsHistoryService.MemberPointsHistoryList(page, memberId, memberName)); } @ApiOperation(value = "获取会员积分VO") diff --git a/manager-api/src/main/java/cn/lili/controller/message/MemberMessageManagerController.java b/manager-api/src/main/java/cn/lili/controller/message/MemberMessageManagerController.java new file mode 100644 index 00000000..38a90456 --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/message/MemberMessageManagerController.java @@ -0,0 +1,40 @@ +package cn.lili.controller.message; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.message.entity.dos.MemberMessage; +import cn.lili.modules.message.entity.vos.MemberMessageQueryVO; +import cn.lili.modules.message.service.MemberMessageService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 管理端,会员消息消息管理接口 + * + * @author pikachu + * @since 2020/12/6 16:09 + */ +@RestController +@Api(tags = "管理端,会员消息消息管理接口") +@RequestMapping("/manager/other/memberMessage") +public class MemberMessageManagerController { + @Autowired + private MemberMessageService memberMessageService; + + + @GetMapping + @ApiOperation(value = "多条件分页获取") + public ResultMessage> getByCondition(MemberMessageQueryVO memberMessageQueryVO, + PageVO pageVo) { + IPage page = memberMessageService.getPage(memberMessageQueryVO, pageVo); + return ResultUtil.data(page); + } + +} diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberNoticeLogManagerController.java b/manager-api/src/main/java/cn/lili/controller/message/MemberNoticeLogManagerController.java similarity index 74% rename from manager-api/src/main/java/cn/lili/controller/member/MemberNoticeLogManagerController.java rename to manager-api/src/main/java/cn/lili/controller/message/MemberNoticeLogManagerController.java index 6636ece7..506bbc5a 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberNoticeLogManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/message/MemberNoticeLogManagerController.java @@ -1,16 +1,14 @@ -package cn.lili.controller.member; +package cn.lili.controller.message; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.MemberNoticeLog; import cn.lili.modules.member.service.MemberNoticeLogService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,15 +18,14 @@ import java.util.List; * 管理端,会员消息接口 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "管理端,会员消息接口") -@RequestMapping("/manager/memberNoticeLog") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/message/memberNoticeLog") public class MemberNoticeLogManagerController { - - private final MemberNoticeLogService memberNoticeLogService; + @Autowired + private MemberNoticeLogService memberNoticeLogService; @ApiOperation(value = "通过id获取") @GetMapping(value = "/get/{id}") @@ -54,16 +51,14 @@ public class MemberNoticeLogManagerController { @ApiOperation(value = "编辑或更新数据") @PostMapping(value = "/insertOrUpdate") public ResultMessage saveOrUpdate(MemberNoticeLog memberNoticeLog) { - if (memberNoticeLogService.saveOrUpdate(memberNoticeLog)) { - return ResultUtil.data(memberNoticeLog); - } - return ResultUtil.error(ResultCode.ERROR); + memberNoticeLogService.saveOrUpdate(memberNoticeLog); + return ResultUtil.data(memberNoticeLog); } @ApiOperation(value = "批量删除") @DeleteMapping(value = "/delByIds/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { memberNoticeLogService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/MemberNoticeManagerController.java b/manager-api/src/main/java/cn/lili/controller/message/MemberNoticeManagerController.java similarity index 81% rename from manager-api/src/main/java/cn/lili/controller/setting/MemberNoticeManagerController.java rename to manager-api/src/main/java/cn/lili/controller/message/MemberNoticeManagerController.java index 2b7b30e7..be252cbb 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/MemberNoticeManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/message/MemberNoticeManagerController.java @@ -1,19 +1,17 @@ -package cn.lili.controller.setting; +package cn.lili.controller.message; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.MemberNotice; import cn.lili.modules.member.service.MemberNoticeService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,15 +21,14 @@ import java.util.List; * 管理端,会员站内信管理接口 * * @author Chopper - * @date: 2020/11/17 4:31 下午 + * @since 2020/11/17 4:31 下午 */ @RestController @Api(tags = "管理端,会员站内信管理API") -@RequestMapping("/manager/member/notice") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/message/memberNotice") public class MemberNoticeManagerController { - - private final MemberNoticeService memberNoticeService; + @Autowired + private MemberNoticeService memberNoticeService; @ApiOperation(value = "获取详情") @GetMapping(value = "/{id}") @@ -55,7 +52,7 @@ public class MemberNoticeManagerController { updateWrapper.in("id", ids); updateWrapper.set("is_read", true); memberNoticeService.update(updateWrapper); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "阅读全部") @@ -65,14 +62,14 @@ public class MemberNoticeManagerController { updateWrapper.in("member_id", UserContext.getCurrentUser().getId()); updateWrapper.set("is_read", true); memberNoticeService.update(updateWrapper); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "批量删除") @DeleteMapping(value = "/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { memberNoticeService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "删除所有") @@ -81,7 +78,7 @@ public class MemberNoticeManagerController { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("member_id", UserContext.getCurrentUser().getId()); memberNoticeService.remove(queryWrapper); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberNoticeSenterManagerController.java b/manager-api/src/main/java/cn/lili/controller/message/MemberNoticeSenterManagerController.java similarity index 77% rename from manager-api/src/main/java/cn/lili/controller/member/MemberNoticeSenterManagerController.java rename to manager-api/src/main/java/cn/lili/controller/message/MemberNoticeSenterManagerController.java index d4119835..edd03c9a 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberNoticeSenterManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/message/MemberNoticeSenterManagerController.java @@ -1,17 +1,15 @@ -package cn.lili.controller.member; +package cn.lili.controller.message; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.member.entity.dos.MemberNoticeSenter; import cn.lili.modules.member.service.MemberNoticeSenterService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,15 +19,14 @@ import java.util.List; * 管理端,会员消息接口 * * @author Chopper - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "管理端,会员消息接口") -@RequestMapping("/manager/memberNoticeSenter") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/message/memberNoticeSenter") public class MemberNoticeSenterManagerController { - - private final MemberNoticeSenterService memberNoticeSenterService; + @Autowired + private MemberNoticeSenterService memberNoticeSenterService; @ApiOperation(value = "通过id获取") @GetMapping(value = "/get/{id}") @@ -59,16 +56,14 @@ public class MemberNoticeSenterManagerController { @PostMapping(value = "/insertOrUpdate") public ResultMessage saveOrUpdate(MemberNoticeSenter memberNoticeSenter) { - if (memberNoticeSenterService.customSave(memberNoticeSenter)) { - return ResultUtil.data(memberNoticeSenter); - } - return ResultUtil.error(ResultCode.ERROR); + memberNoticeSenterService.customSave(memberNoticeSenter); + return ResultUtil.data(memberNoticeSenter); } @ApiOperation(value = "批量删除") @DeleteMapping(value = "/delByIds/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { memberNoticeSenterService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/ServiceNoticeManagerController.java b/manager-api/src/main/java/cn/lili/controller/message/ServiceNoticeManagerController.java similarity index 72% rename from manager-api/src/main/java/cn/lili/controller/setting/ServiceNoticeManagerController.java rename to manager-api/src/main/java/cn/lili/controller/message/ServiceNoticeManagerController.java index 932ea8c7..8510d1e2 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/ServiceNoticeManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/message/ServiceNoticeManagerController.java @@ -1,17 +1,15 @@ -package cn.lili.controller.setting; +package cn.lili.controller.message; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.system.entity.dos.ServiceNotice; import cn.lili.modules.system.service.ServiceNoticeService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,15 +20,14 @@ import java.util.List; * 管理端,服务订阅消息接口 * * @author Chopper - * @date: 2020/11/17 4:33 下午 + * @since 2020/11/17 4:33 下午 */ @RestController @Api(tags = "管理端,服务订阅消息接口") -@RequestMapping("/manager/admin/notice") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/message/serviceNotice") public class ServiceNoticeManagerController { - - private final ServiceNoticeService serviceNoticeService; + @Autowired + private ServiceNoticeService serviceNoticeService; @ApiOperation(value = "查看服务订阅消息详情") @GetMapping(value = "/{id}") @@ -53,25 +50,21 @@ public class ServiceNoticeManagerController { public ResultMessage save(ServiceNotice serviceNotice) { //标记平台消息 serviceNotice.setStoreId("-1"); - if (serviceNoticeService.saveOrUpdate(serviceNotice)) { - return ResultUtil.data(serviceNotice); - } - return ResultUtil.error(ResultCode.ERROR); + serviceNoticeService.saveOrUpdate(serviceNotice); + return ResultUtil.data(serviceNotice); } @ApiOperation(value = "更新服务订阅消息") @PostMapping("/{id}") public ResultMessage update(@PathVariable String id, ServiceNotice serviceNotice) { - if (serviceNoticeService.saveOrUpdate(serviceNotice)) { - return ResultUtil.data(serviceNotice); - } - return ResultUtil.error(ResultCode.ERROR); + serviceNoticeService.saveOrUpdate(serviceNotice); + return ResultUtil.data(serviceNotice); } @ApiOperation(value = "删除服务订阅消息") @DeleteMapping(value = "/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { serviceNoticeService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/order/AfterSaleManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/AfterSaleManagerController.java new file mode 100644 index 00000000..2764615b --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/order/AfterSaleManagerController.java @@ -0,0 +1,102 @@ +package cn.lili.controller.order; + +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO; +import cn.lili.modules.order.aftersale.service.AfterSaleService; +import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; +import cn.lili.modules.system.entity.vo.Traces; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 管理端,售后接口 + * + * @author Bulbasaur + * @since 2021/1/6 14:11 + */ +@RestController +@RequestMapping("/manager/order/afterSale") +@Api(tags = "管理端,售后接口") +public class AfterSaleManagerController { + + /** + * 售后 + */ + @Autowired + private AfterSaleService afterSaleService; + + @ApiOperation(value = "分页获取售后服务") + @GetMapping(value = "/page") + public ResultMessage> getByPage(AfterSaleSearchParams searchParams) { + return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams)); + } + + @ApiOperation(value = "获取导出售后服务列表列表") + @GetMapping(value = "/exportAfterSaleOrder") + public ResultMessage> exportAfterSaleOrder(AfterSaleSearchParams searchParams) { + return ResultUtil.data(afterSaleService.exportAfterSaleOrder(searchParams)); + } + + @ApiOperation(value = "查看售后服务详情") + @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") + @GetMapping(value = "/get/{sn}") + public ResultMessage get(@NotNull(message = "售后单号") @PathVariable("sn") String sn) { + return ResultUtil.data(afterSaleService.getAfterSale(sn)); + } + + @ApiOperation(value = "查看买家退货物流踪迹") + @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") + @GetMapping(value = "/getDeliveryTraces/{sn}") + public ResultMessage getDeliveryTraces(@PathVariable String sn) { + return ResultUtil.data(afterSaleService.deliveryTraces(sn)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "售后线下退款") + @ApiImplicitParams({ + @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, paramType = "path"), + @ApiImplicitParam(name = "remark", value = "备注", paramType = "query") + }) + @PutMapping(value = "/refund/{afterSaleSn}") + public ResultMessage refund(@NotNull(message = "请选择售后单") @PathVariable String afterSaleSn, + @RequestParam String remark) { + + return ResultUtil.data(afterSaleService.refund(afterSaleSn, remark)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "审核售后申请") + @ApiImplicitParams({ + @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, paramType = "path"), + @ApiImplicitParam(name = "serviceStatus", value = "PASS:审核通过,REFUSE:审核未通过", required = true, paramType = "query"), + @ApiImplicitParam(name = "remark", value = "备注", paramType = "query"), + @ApiImplicitParam(name = "actualRefundPrice", value = "实际退款金额", paramType = "query") + }) + @PutMapping(value = "/review/{afterSaleSn}") + public ResultMessage review(@NotNull(message = "请选择售后单") @PathVariable String afterSaleSn, + @NotNull(message = "请审核") String serviceStatus, + String remark, + Double actualRefundPrice) { + + return ResultUtil.data(afterSaleService.review(afterSaleSn, serviceStatus, remark,actualRefundPrice)); + } + + @ApiOperation(value = "获取商家售后收件地址") + @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") + @GetMapping(value = "/getStoreAfterSaleAddress/{sn}") + public ResultMessage getStoreAfterSaleAddress(@NotNull(message = "售后单号") @PathVariable("sn") String sn) { + return ResultUtil.data(afterSaleService.getStoreAfterSaleAddressDTO(sn)); + } +} diff --git a/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleReasonManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/AfterSaleReasonManagerController.java similarity index 81% rename from manager-api/src/main/java/cn/lili/controller/trade/AfterSaleReasonManagerController.java rename to manager-api/src/main/java/cn/lili/controller/order/AfterSaleReasonManagerController.java index 01b7f696..916c5bff 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleReasonManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/order/AfterSaleReasonManagerController.java @@ -1,18 +1,16 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.order.entity.dos.AfterSaleReason; -import cn.lili.modules.order.order.service.AfterSaleReasonService; +import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason; +import cn.lili.modules.order.aftersale.service.AfterSaleReasonService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,18 +20,18 @@ import javax.validation.Valid; * 管理端,售后原因接口 * * @author Bulbasaur - * @date: 2021/1/6 14:11 + * @since 2021/1/6 14:11 */ @RestController -@RequestMapping("/manager/afterSaleReason") +@RequestMapping("/manager/order/afterSaleReason") @Api(tags = "管理端,售后原因接口") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class AfterSaleReasonManagerController { /** * 售后原因 */ - private final AfterSaleReasonService afterSaleReasonService; + @Autowired + private AfterSaleReasonService afterSaleReasonService; @ApiOperation(value = "查看售后原因") @ApiImplicitParam(name = "id", value = "售后原因ID", required = true, dataType = "String", paramType = "path") @@ -70,6 +68,6 @@ public class AfterSaleReasonManagerController { @DeleteMapping(value = "/delByIds/{id}") public ResultMessage delAllByIds(@PathVariable String id) { afterSaleReasonService.removeById(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/trade/OrderComplaintManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/OrderComplaintManagerController.java similarity index 70% rename from manager-api/src/main/java/cn/lili/controller/trade/OrderComplaintManagerController.java rename to manager-api/src/main/java/cn/lili/controller/order/OrderComplaintManagerController.java index 6e4373c3..c3286749 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/OrderComplaintManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/order/OrderComplaintManagerController.java @@ -1,9 +1,9 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.OrderComplaint; @@ -20,31 +20,33 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Objects; + /** * 管理端,交易投诉接口 * * @author paulG - * @date: 2020/12/5 + * @since 2020/12/5 */ @RestController @Api(tags = "管理端,交易投诉接口") -@RequestMapping("/manager/complain") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/order/complain") public class OrderComplaintManagerController { /** * 交易投诉 */ - private final OrderComplaintService orderComplaintService; + @Autowired + private OrderComplaintService orderComplaintService; /** * 交易投诉沟通 */ - private final OrderComplaintCommunicationService orderComplaintCommunicationService; + @Autowired + private OrderComplaintCommunicationService orderComplaintCommunicationService; @ApiOperation(value = "通过id获取") @ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path") @@ -62,10 +64,9 @@ public class OrderComplaintManagerController { @ApiOperation(value = "更新数据") @PutMapping public ResultMessage update(OrderComplaintVO orderComplainVO) { - if (orderComplaintService.updateOrderComplain(orderComplainVO)) { - return ResultUtil.data(orderComplainVO); - } - return ResultUtil.error(ResultCode.ERROR); + orderComplaintService.updateOrderComplain(orderComplainVO); + return ResultUtil.data(orderComplainVO); + } @ApiOperation(value = "添加交易投诉对话") @@ -74,42 +75,38 @@ public class OrderComplaintManagerController { @ApiImplicitParam(name = "content", value = "内容", required = true, paramType = "query") }) @PostMapping("/communication") - public ResultMessage addCommunication(@RequestParam String complainId,@RequestParam String content) { - AuthUser currentUser = UserContext.getCurrentUser(); - OrderComplaintCommunicationVO communicationVO = new OrderComplaintCommunicationVO(complainId, content, CommunicationOwnerEnum.PLATFORM.name(), currentUser.getId(), currentUser.getUsername()); - if (orderComplaintCommunicationService.addCommunication(communicationVO)) { - return ResultUtil.data(communicationVO); - } - return ResultUtil.error(ResultCode.ERROR); + public ResultMessage addCommunication(@RequestParam String complainId, @RequestParam String content) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + OrderComplaintCommunicationVO communicationVO = new OrderComplaintCommunicationVO(complainId, content, CommunicationOwnerEnum.PLATFORM.name(), currentUser.getUsername(), currentUser.getId()); + orderComplaintCommunicationService.addCommunication(communicationVO); + return ResultUtil.data(communicationVO); } + @PreventDuplicateSubmissions @ApiOperation(value = "修改状态") @PutMapping(value = "/status") public ResultMessage updateStatus(OrderComplaintOperationParams orderComplainVO) { - if (orderComplaintService.updateOrderComplainByStatus(orderComplainVO) != null) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + orderComplaintService.updateOrderComplainByStatus(orderComplainVO); + return ResultUtil.success(); } + @PreventDuplicateSubmissions @ApiOperation(value = "仲裁") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path"), @ApiImplicitParam(name = "arbitrationResult", value = "仲裁结果", required = true, paramType = "query") }) @PutMapping(value = "/complete/{id}") - public ResultMessage complete(@PathVariable String id,String arbitrationResult) { + public ResultMessage complete(@PathVariable String id, String arbitrationResult) { //新建对象 - OrderComplaintOperationParams orderComplaintOperationParams =new OrderComplaintOperationParams(); + OrderComplaintOperationParams orderComplaintOperationParams = new OrderComplaintOperationParams(); orderComplaintOperationParams.setComplainId(id); orderComplaintOperationParams.setArbitrationResult(arbitrationResult); orderComplaintOperationParams.setComplainStatus(OrderComplaintStatusEnum.COMPLETE.name()); //修改状态 - if (orderComplaintService.updateOrderComplainByStatus(orderComplaintOperationParams) != null) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + orderComplaintService.updateOrderComplainByStatus(orderComplaintOperationParams); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/trade/OrderLogManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/OrderLogManagerController.java similarity index 78% rename from manager-api/src/main/java/cn/lili/controller/trade/OrderLogManagerController.java rename to manager-api/src/main/java/cn/lili/controller/order/OrderLogManagerController.java index 7ea1c6f5..076e5e8b 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/OrderLogManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/order/OrderLogManagerController.java @@ -1,18 +1,16 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.order.trade.entity.dos.OrderLog; import cn.lili.modules.order.trade.service.OrderLogService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,16 +20,14 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,订单日志管理接口 * * @author Chopper - * @date 2020/11/17 4:34 下午 + * @since 2020/11/17 4:34 下午 */ -@Transactional @RestController @Api(tags = "管理端,订单日志管理接口") -@RequestMapping("/manager/orderLog") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/order/orderLog") public class OrderLogManagerController { - - private final OrderLogService orderLogService; + @Autowired + private OrderLogService orderLogService; @GetMapping(value = "/get/{id}") @ApiOperation(value = "通过id获取") diff --git a/manager-api/src/main/java/cn/lili/controller/trade/OrderManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/OrderManagerController.java similarity index 67% rename from manager-api/src/main/java/cn/lili/controller/trade/OrderManagerController.java rename to manager-api/src/main/java/cn/lili/controller/order/OrderManagerController.java index 98fd1488..07ef50e2 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/OrderManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/order/OrderManagerController.java @@ -1,10 +1,14 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.NumberUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dto.MemberAddressDTO; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.dto.OrderSearchParams; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; @@ -15,30 +19,36 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.util.List; /** * 管理端,订单API * * @author Chopper - * @date 2020/11/17 4:34 下午 + * @since 2020/11/17 4:34 下午 */ @RestController -@RequestMapping("/manager/orders") +@RequestMapping("/manager/order/order") @Api(tags = "管理端,订单API") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderManagerController { - //订单 - private final OrderService orderService; - //订单价格 - private final OrderPriceService orderPriceService; + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 订单价格 + */ + @Autowired + private OrderPriceService orderPriceService; @ApiOperation(value = "查询订单列表分页") @@ -47,6 +57,13 @@ public class OrderManagerController { return ResultUtil.data(orderService.queryByParams(orderSearchParams)); } + @ApiOperation(value = "查询订单导出列表") + @GetMapping("/queryExportOrder") + public ResultMessage> queryExportOrder(OrderSearchParams orderSearchParams) { + return ResultUtil.data(orderService.queryExportOrder(orderSearchParams)); + } + + @ApiOperation(value = "订单明细") @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/{orderSn}") @@ -55,14 +72,16 @@ public class OrderManagerController { } + @PreventDuplicateSubmissions @ApiOperation(value = "确认收款") @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") @PostMapping(value = "/{orderSn}/pay") public ResultMessage payOrder(@PathVariable String orderSn) { orderPriceService.adminPayOrder(orderSn); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + @PreventDuplicateSubmissions @ApiOperation(value = "修改收货人信息") @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path") @PostMapping(value = "/update/{orderSn}/consignee") @@ -71,6 +90,7 @@ public class OrderManagerController { return ResultUtil.data(orderService.updateConsignee(orderSn, memberAddressDTO)); } + @PreventDuplicateSubmissions @ApiOperation(value = "修改订单价格") @ApiImplicitParams({ @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path"), @@ -79,10 +99,15 @@ public class OrderManagerController { @PutMapping(value = "/update/{orderSn}/price") public ResultMessage updateOrderPrice(@PathVariable String orderSn, @NotNull(message = "订单价格不能为空") @RequestParam Double price) { - return ResultUtil.data(orderPriceService.updatePrice(orderSn, price)); + if (NumberUtil.isGreater(Convert.toBigDecimal(price), Convert.toBigDecimal(0))) { + return ResultUtil.data(orderPriceService.updatePrice(orderSn, price)); + } else { + return ResultUtil.error(ResultCode.ORDER_PRICE_ERROR); + } } + @PreventDuplicateSubmissions @ApiOperation(value = "取消订单") @ApiImplicitParams({ @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path"), @@ -94,4 +119,12 @@ public class OrderManagerController { } + @ApiOperation(value = "查询物流踪迹") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") + }) + @PostMapping(value = "/getTraces/{orderSn}") + public ResultMessage getTraces(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) { + return ResultUtil.data(orderService.getTraces(orderSn)); + } } \ No newline at end of file diff --git a/manager-api/src/main/java/cn/lili/controller/trade/PaymentLogManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/PaymentLogManagerController.java similarity index 63% rename from manager-api/src/main/java/cn/lili/controller/trade/PaymentLogManagerController.java rename to manager-api/src/main/java/cn/lili/controller/order/PaymentLogManagerController.java index a4009bd5..daf587fb 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/PaymentLogManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/order/PaymentLogManagerController.java @@ -1,19 +1,17 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.vo.PaymentLog; -import cn.lili.modules.payment.service.PaymentService; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,16 +21,15 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,收款日志接口 * * @author Chopper - * @date 2020/11/17 4:34 下午 + * @since 2020/11/17 4:34 下午 */ @RestController @Api(tags = "管理端,收款日志接口") -@RequestMapping("/manager/paymentLog") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/order/paymentLog") public class PaymentLogManagerController { - private final PaymentService paymentService; + @Autowired + private OrderService orderService; @GetMapping @@ -40,6 +37,6 @@ public class PaymentLogManagerController { public ResultMessage> getByPage(Order order, SearchVO searchVo, PageVO page) { - return ResultUtil.data(paymentService.page(PageUtil.initPage(page), PageUtil.initWrapper(order, searchVo))); + return ResultUtil.data(orderService.queryPaymentLogs(PageUtil.initPage(page), PageUtil.initWrapper(order, searchVo))); } } diff --git a/manager-api/src/main/java/cn/lili/controller/trade/ReceiptManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/ReceiptManagerController.java similarity index 79% rename from manager-api/src/main/java/cn/lili/controller/trade/ReceiptManagerController.java rename to manager-api/src/main/java/cn/lili/controller/order/ReceiptManagerController.java index 09168b8e..b3c92744 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/ReceiptManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/order/ReceiptManagerController.java @@ -1,6 +1,6 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dto.OrderReceiptDTO; @@ -9,7 +9,6 @@ import cn.lili.modules.order.order.service.ReceiptService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -19,15 +18,15 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,发票记录接口 * * @author paulG - * @date 2020/11/17 4:34 下午 + * @since 2020/11/17 4:34 下午 **/ @RestController @Api(tags = "管理端,发票记录接口") -@RequestMapping("/manager/receipt") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/trade/receipt") public class ReceiptManagerController { - private final ReceiptService receiptService; + @Autowired + private ReceiptService receiptService; @ApiOperation(value = "获取发票分页信息") diff --git a/manager-api/src/main/java/cn/lili/controller/trade/RefundLogManagerController.java b/manager-api/src/main/java/cn/lili/controller/order/RefundLogManagerController.java similarity index 75% rename from manager-api/src/main/java/cn/lili/controller/trade/RefundLogManagerController.java rename to manager-api/src/main/java/cn/lili/controller/order/RefundLogManagerController.java index 57d8f464..f860c391 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/RefundLogManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/order/RefundLogManagerController.java @@ -1,18 +1,16 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.payment.entity.RefundLog; import cn.lili.modules.payment.service.RefundLogService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,16 +20,14 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,退款日志接口 * * @author Chopper - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "管理端,退款日志接口") -@RequestMapping("/manager/refundLog") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/order/refundLog") public class RefundLogManagerController { - - private final RefundLogService refundLogService; + @Autowired + private RefundLogService refundLogService; @GetMapping(value = "/{id}") @ApiOperation(value = "查看退款日志详情") diff --git a/manager-api/src/main/java/cn/lili/controller/setting/AppVersionManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/AppVersionManagerController.java similarity index 55% rename from manager-api/src/main/java/cn/lili/controller/setting/AppVersionManagerController.java rename to manager-api/src/main/java/cn/lili/controller/other/AppVersionManagerController.java index 9c54a7c5..49dea11c 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/AppVersionManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/AppVersionManagerController.java @@ -1,11 +1,13 @@ -package cn.lili.controller.setting; +package cn.lili.controller.other; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.system.entity.dos.AppVersionDO; +import cn.lili.modules.system.entity.dos.AppVersion; import cn.lili.modules.system.service.AppVersionService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -13,7 +15,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,44 +24,52 @@ import javax.validation.Valid; * 管理端,app版本控制器 * * @author Chopper - * @date 2018-07-04 21:50:52 + * @since 2018-07-04 21:50:52 */ @RestController @Api("管理端,app版本控制器") -@RequestMapping("/manager/systems/app/version") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/appVersion") public class AppVersionManagerController { - - private final AppVersionService appVersionService; + @Autowired + private AppVersionService appVersionService; - @ApiOperation(value = "查询app升级消息", response = AppVersionDO.class) + @ApiOperation(value = "查询app升级消息", response = AppVersion.class) @GetMapping @ApiImplicitParams({ @ApiImplicitParam(name = "type", value = "APP类型", required = true, dataType = "type", paramType = "query") }) - public ResultMessage> getByPage(PageVO page, String type) { + public ResultMessage> getByPage(PageVO page, String type) { return ResultUtil.data(this.appVersionService.page(PageUtil.initPage(page), - new QueryWrapper().eq(StringUtils.isNotEmpty(type), "type", type).orderByDesc("create_time"))); + new QueryWrapper().eq(StringUtils.isNotEmpty(type), "type", type).orderByDesc("create_time"))); } - @ApiOperation(value = "添加app版本信息", response = AppVersionDO.class) + @ApiOperation(value = "添加app版本信息", response = AppVersion.class) @PostMapping - public ResultMessage add(@Valid AppVersionDO appVersionDO) { - return ResultUtil.data(this.appVersionService.save(appVersionDO)); + public ResultMessage add(@Valid AppVersion appVersion) { + + if(this.appVersionService.checkAppVersion(appVersion)){ + if(this.appVersionService.save(appVersion)){ + return ResultUtil.success(); + } + } + throw new ServiceException(ResultCode.ERROR); } @PutMapping(value = "/{id}") - @ApiOperation(value = "修改app版本信息", response = AppVersionDO.class) + @ApiOperation(value = "修改app版本信息", response = AppVersion.class) @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "String", paramType = "path") }) - public ResultMessage edit(@Valid AppVersionDO appVersionDO, @PathVariable String id) { - if (appVersionService.getById(id) != null) { - return ResultUtil.data(this.appVersionService.updateById(appVersionDO)); + public ResultMessage edit(@Valid AppVersion appVersion, @PathVariable String id) { + + if(this.appVersionService.checkAppVersion(appVersion)){ + if(this.appVersionService.updateById(appVersion)){ + return ResultUtil.success(); + } } - return ResultUtil.data(false); + throw new ServiceException(ResultCode.ERROR); } @DeleteMapping(value = "/{id}") @@ -69,10 +78,10 @@ public class AppVersionManagerController { @ApiImplicitParam(name = "id", value = "要删除的app版本主键", required = true, dataType = "String", paramType = "path") }) public ResultMessage delete(@PathVariable String id) { - if (appVersionService.getById(id) != null) { - return ResultUtil.data(this.appVersionService.removeById(id)); + if(this.appVersionService.removeById(id)){ + return ResultUtil.success(); } - return ResultUtil.data(true); + throw new ServiceException(ResultCode.ERROR); } } diff --git a/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java index 2361279f..2fcb8264 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java @@ -1,7 +1,6 @@ package cn.lili.controller.other; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.ArticleCategory; import cn.lili.modules.page.entity.vos.ArticleCategoryVO; @@ -9,7 +8,7 @@ import cn.lili.modules.page.service.ArticleCategoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,18 +19,19 @@ import java.util.List; * 管理端,文章分类管理接口 * * @author pikachu - * @date 2020-05-5 15:10:16 + * @since 2020-05-5 15:10:16 */ +@Slf4j @RestController @Api(tags = "管理端,文章分类管理接口") -@RequestMapping("/manager/article-category") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/articleCategory") public class ArticleCategoryManagerController { /** * 文章分类 */ - private final ArticleCategoryService articleCategoryService; + @Autowired + private ArticleCategoryService articleCategoryService; @ApiOperation(value = "查询分类列表") @GetMapping(value = "/all-children") @@ -39,7 +39,7 @@ public class ArticleCategoryManagerController { try { return ResultUtil.data(this.articleCategoryService.allChildren()); } catch (Exception e) { - e.printStackTrace(); + log.error("查询分类列表错误", e); } return null; } @@ -57,6 +57,9 @@ public class ArticleCategoryManagerController { if (articleCategory.getLevel() == null) { articleCategory.setLevel(0); } + if (articleCategory.getSort() == null) { + articleCategory.setSort(0); + } return ResultUtil.data(articleCategoryService.saveArticleCategory(articleCategory)); } @@ -65,6 +68,14 @@ public class ArticleCategoryManagerController { @ApiImplicitParam(name = "id", value = "文章分类ID", required = true, dataType = "String", paramType = "path") @PutMapping("/update/{id}") public ResultMessage update(@Valid ArticleCategory articleCategory, @PathVariable("id") String id) { + + if (articleCategory.getLevel() == null) { + articleCategory.setLevel(0); + } + if (articleCategory.getSort() == null) { + articleCategory.setSort(0); + } + articleCategory.setId(id); return ResultUtil.data(articleCategoryService.updateArticleCategory(articleCategory)); } @@ -73,9 +84,7 @@ public class ArticleCategoryManagerController { @ApiImplicitParam(name = "id", value = "文章分类ID", required = true, dataType = "String", paramType = "path") @DeleteMapping("/{id}") public ResultMessage deleteById(@PathVariable String id) { - if (articleCategoryService.deleteById(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + articleCategoryService.deleteById(id); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/other/ArticleManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/ArticleManagerController.java index 0c998053..d9372124 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/ArticleManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/ArticleManagerController.java @@ -1,7 +1,6 @@ package cn.lili.controller.other; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.Article; import cn.lili.modules.page.entity.dto.ArticleSearchParams; @@ -13,7 +12,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,18 +21,18 @@ import javax.validation.Valid; * 管理端,文章接口 * * @author pikachu - * @date 2020-05-06 15:18:56 + * @since 2020-05-06 15:18:56 */ @RestController @Api(tags = "管理端,文章接口") -@RequestMapping("/manager/article") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/article") public class ArticleManagerController { /** * 文章 */ - private final ArticleService articleService; + @Autowired + private ArticleService articleService; @ApiOperation(value = "查看文章") @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "String", paramType = "path") @@ -44,38 +42,67 @@ public class ArticleManagerController { return ResultUtil.data(articleService.getById(id)); } + @ApiOperation(value = "根据类型查看文章") + @ApiImplicitParam(name = "type", value = "文章类型", required = true, dataType = "String", paramType = "path") + @GetMapping(value = "/type/{type}") + public ResultMessage
getByType(@PathVariable String type) { + + return ResultUtil.data(articleService.customGetByType(type)); + } + @ApiOperation(value = "分页获取") @ApiImplicitParams({ - @ApiImplicitParam(name = "categoryId", value = "文章分类ID", dataType = "String", paramType = "query"), - @ApiImplicitParam(name = "title", value = "标题", dataType = "String", paramType = "query") + @ApiImplicitParam(name = "categoryId", value = "文章分类ID", paramType = "query"), + @ApiImplicitParam(name = "title", value = "标题", paramType = "query") }) @GetMapping(value = "/getByPage") public ResultMessage> getByPage(ArticleSearchParams articleSearchParams) { - return ResultUtil.data(articleService.articlePage(articleSearchParams)); + return ResultUtil.data(articleService.managerArticlePage(articleSearchParams)); } @ApiOperation(value = "添加文章") - @PostMapping - public ResultMessage
save(@Valid Article article) { + @PostMapping(consumes = "application/json", produces = "application/json") + public ResultMessage
save(@RequestBody Article article) { article.setType(ArticleEnum.OTHER.name()); articleService.save(article); return ResultUtil.data(article); } - @ApiOperation(value = "修改文章") - @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "String", paramType = "path") - @PutMapping("update/{id}") - public ResultMessage
update(@Valid Article article, @PathVariable("id") String id) { + @ApiOperation(value = "修改文章--文章id") + @ApiImplicitParam(name = "id", value = "文章ID", required = true, paramType = "path") + @PutMapping(value = "update/{id}", consumes = "application/json", produces = "application/json") + public ResultMessage
update(@RequestBody Article article, @PathVariable("id") String id) { article.setId(id); return ResultUtil.data(articleService.updateArticle(article)); } + @ApiOperation(value = "修改文章--文章类型") + @ApiImplicitParam(name = "type", value = "文章类型", required = true, paramType = "path") + @PutMapping(value = "updateArticle/{type}", consumes = "application/json", produces = "application/json") + public ResultMessage
updateArticle(@RequestBody Article article, @PathVariable("type") String type,String id) { + article.setId(id); + article.setType(type); + return ResultUtil.data(articleService.updateArticleType(article)); + } + + @ApiOperation(value = "修改文章状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "文章ID", required = true, paramType = "path"), + @ApiImplicitParam(name = "status", value = "操作状态", required = true, paramType = "query") + }) + @PutMapping("update/status/{id}") + public ResultMessage
updateStatus(@PathVariable("id") String id, boolean status) { + articleService.updateArticleStatus(id, status); + return ResultUtil.success(); + } + + @ApiOperation(value = "批量删除") @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "String", paramType = "path") @DeleteMapping(value = "/delByIds/{id}") public ResultMessage delAllByIds(@PathVariable String id) { articleService.customRemove(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } diff --git a/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java b/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java index e1094fa8..ff2d56fb 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java @@ -1,18 +1,27 @@ package cn.lili.controller.other; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.StringUtils; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; import cn.lili.modules.permission.SettingKeys; +import cn.lili.modules.search.entity.dos.CustomWords; +import cn.lili.modules.search.entity.vo.CustomWordsVO; import cn.lili.modules.search.service.CustomWordsService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.service.SettingService; +import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; -import lombok.RequiredArgsConstructor; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; import java.nio.charset.StandardCharsets; /** @@ -21,42 +30,75 @@ import java.nio.charset.StandardCharsets; * @author paulG * @since 2020/10/16 **/ +@Slf4j @RestController @Api(tags = "管理端,自定义分词接口") -@RequestMapping("/manager/custom-words") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/customWords") public class CustomWordsController { /** * 分词 */ - private final CustomWordsService customWordsService; + @Autowired + private CustomWordsService customWordsService; /** * 设置 */ - private final SettingService settingService; + @Autowired + private SettingService settingService; @GetMapping public String getCustomWords(String secretKey) { - if (StringUtils.isEmpty(secretKey)) { + if (CharSequenceUtil.isEmpty(secretKey)) { return ""; } Setting setting = settingService.get(SettingKeys.ES_SIGN.name()); - if (setting == null || StringUtils.isEmpty(setting.getSettingValue())) { + if (setting == null || CharSequenceUtil.isEmpty(setting.getSettingValue())) { return ""; } - if (!setting.getSettingValue().equals(secretKey)) { - throw new ServiceException("秘钥验证失败!"); + JSONObject jsonObject = JSONUtil.parseObj(setting.getSettingValue()); + //如果密钥不正确,返回空 + if (!secretKey.equals(jsonObject.get("secretKey"))) { + return ""; } String res = customWordsService.deploy(); try { return new String(res.getBytes(), StandardCharsets.UTF_8); } catch (Exception e) { - e.printStackTrace(); + log.error("获取分词错误", e); } return ""; } + @ApiOperation(value = "添加自定义分词") + @PostMapping + public ResultMessage addCustomWords(@Valid CustomWordsVO customWords) { + customWordsService.addCustomWords(customWords); + return ResultUtil.data(customWords); + } + + @ApiOperation(value = "修改自定义分词") + @PutMapping + public ResultMessage updateCustomWords(@Valid CustomWordsVO customWords) { + customWordsService.updateCustomWords(customWords); + return ResultUtil.data(customWords); + } + + @ApiOperation(value = "删除自定义分词") + @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "String", paramType = "path") + @DeleteMapping("/{id}") + public ResultMessage deleteCustomWords(@NotNull @PathVariable String id) { + customWordsService.deleteCustomWords(id); + return ResultUtil.success(); + } + + @ApiOperation(value = "分页获取自定义分词") + @ApiImplicitParam(name = "words", value = "分词", required = true, dataType = "String", paramType = "query") + @GetMapping("/page") + public ResultMessage> getCustomWords(@RequestParam String words, PageVO pageVo) { + return ResultUtil.data(customWordsService.getCustomWordsByPage(words, pageVo)); + } + } diff --git a/manager-api/src/main/java/cn/lili/controller/other/CustomWordsManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/CustomWordsManagerController.java deleted file mode 100644 index b81e5614..00000000 --- a/manager-api/src/main/java/cn/lili/controller/other/CustomWordsManagerController.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.lili.controller.other; - -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.search.entity.dos.CustomWords; -import cn.lili.modules.search.entity.vo.CustomWordsVO; -import cn.lili.modules.search.service.CustomWordsService; -import com.baomidou.mybatisplus.core.metadata.IPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -/** - * 管理端,自定义分词接口 - * - * @author paulG - * @date 2020/10/16 - **/ -@RestController -@Api(tags = "管理端,自定义分词接口") -@RequestMapping("/manager/manager/custom-words") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class CustomWordsManagerController { - - /** - * 分词 - */ - private final CustomWordsService customWordsService; - - @ApiOperation(value = "添加自定义分词") - @PostMapping - public ResultMessage addCustomWords(@Valid CustomWordsVO customWords) { - if (customWordsService.addCustomWords(customWords)) { - return ResultUtil.data(customWords); - } - return ResultUtil.error(ResultCode.ERROR); - } - - @ApiOperation(value = "修改自定义分词") - @PutMapping - public ResultMessage updateCustomWords(@Valid CustomWordsVO customWords) { - if (customWordsService.updateCustomWords(customWords)) { - return ResultUtil.data(customWords); - } - return ResultUtil.error(ResultCode.ERROR); - } - - @ApiOperation(value = "删除自定义分词") - @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "String", paramType = "path") - @DeleteMapping("/{id}") - public ResultMessage deleteCustomWords(@NotNull @PathVariable String id) { - if (customWordsService.deleteCustomWords(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); - } - - @ApiOperation(value = "分页获取自定义分词") - @ApiImplicitParam(name = "words", value = "分词", required = true, dataType = "String", paramType = "query") - @GetMapping - public ResultMessage> getCustomWords(@RequestParam String words, PageVO pageVo) { - return ResultUtil.data(customWordsService.getCustomWordsByPage(words, pageVo)); - } - - -} diff --git a/manager-api/src/main/java/cn/lili/controller/other/ElasticsearchController.java b/manager-api/src/main/java/cn/lili/controller/other/ElasticsearchController.java index a5237cb1..89d878b3 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/ElasticsearchController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/ElasticsearchController.java @@ -1,23 +1,14 @@ package cn.lili.controller.other; -import cn.lili.modules.goods.entity.dos.GoodsSku; -import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; -import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; -import cn.lili.modules.goods.service.GoodsSkuService; -import cn.lili.modules.promotion.service.PromotionService; -import cn.lili.modules.search.entity.dos.EsGoodsIndex; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; import cn.lili.modules.search.service.EsGoodsIndexService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.annotations.Api; -import org.junit.jupiter.api.Assertions; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.List; import java.util.Map; /** @@ -29,36 +20,20 @@ import java.util.Map; */ @RestController @Api(tags = "ES初始化接口") -@RequestMapping("/manager/elasticsearch") +@RequestMapping("/manager/other/elasticsearch") public class ElasticsearchController { @Autowired private EsGoodsIndexService esGoodsIndexService; - @Autowired - private GoodsSkuService goodsSkuService; - - @Autowired - private StringRedisTemplate stringRedisTemplate; - - @Autowired - private PromotionService promotionService; - @GetMapping - public void init() { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(GoodsSku::getIsAuth, GoodsAuthEnum.PASS.name()); - queryWrapper.eq(GoodsSku::getMarketEnable, GoodsStatusEnum.UPPER.name()); - List list = goodsSkuService.list(queryWrapper); - List esGoodsIndices = new ArrayList<>(); - for (GoodsSku goodsSku : list) { - EsGoodsIndex index = new EsGoodsIndex(goodsSku); - Map goodsCurrentPromotionMap = promotionService.getGoodsCurrentPromotionMap(index); - index.setPromotionMap(goodsCurrentPromotionMap); - esGoodsIndices.add(index); - stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity().toString()); - } - esGoodsIndexService.initIndex(esGoodsIndices); - Assertions.assertTrue(true); + public ResultMessage init() { + esGoodsIndexService.init(); + return ResultUtil.success(); + } + + @GetMapping("/progress") + public ResultMessage> getProgress() { + return ResultUtil.data(esGoodsIndexService.getProgress()); } } diff --git a/manager-api/src/main/java/cn/lili/controller/other/FeedbackManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/FeedbackManagerController.java index 7c5c6eed..77c5c011 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/FeedbackManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/FeedbackManagerController.java @@ -1,7 +1,7 @@ package cn.lili.controller.other; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.Feedback; @@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -21,18 +20,18 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,意见反馈接口 * * @author Bulbasaur - * @date 2020-05-5 15:10:16 + * @since 2020-05-5 15:10:16 */ @RestController @Api(tags = "管理端,意见反馈接口") -@RequestMapping("/manager/feedback") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/feedback") public class FeedbackManagerController { /** * 意见反馈 */ - private final FeedbackService feedbackService; + @Autowired + private FeedbackService feedbackService; @ApiOperation(value = "查询意见反馈列表") @ApiImplicitParam(name = "parentId", value = "父id,顶级为0", required = true, dataType = "String", paramType = "path") diff --git a/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java new file mode 100644 index 00000000..a8b5f01a --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java @@ -0,0 +1,83 @@ +package cn.lili.controller.other; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.search.entity.dos.HotWordsHistory; +import cn.lili.modules.search.entity.dto.HotWordsDTO; +import cn.lili.modules.search.entity.dto.HotWordsSearchParams; +import cn.lili.modules.search.service.HotWordsHistoryService; +import cn.lili.modules.search.service.HotWordsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +/** + * 管理端,热词管理 + * + * @author Chopper + * @since 2018-07-04 21:50:52 + */ +@RestController +@Api(tags = "管理端,热词管理") +@RequestMapping("/manager/hotwords/hotwords") +public class HotWordsManagerController { + + @Autowired + private HotWordsService hotWordsService; + + + @Autowired + private HotWordsHistoryService hotWordsHistoryService; + + @ApiOperation(value = "获取热词") + @GetMapping + public ResultMessage getHotWords() { + return ResultUtil.data(hotWordsService.getHotWords(100)); + } + + @ApiOperation(value = "设置热词") + @PostMapping + public ResultMessage setHotWords(@Validated HotWordsDTO hotWords) { + hotWordsService.setHotWords(hotWords); + return ResultUtil.success(); + } + + @ApiOperation(value = "删除热词") + @DeleteMapping + public ResultMessage deleteWords(String words) { + hotWordsService.deleteHotWords(words); + return ResultUtil.success(); + } + + @ApiOperation(value = "历史热词") + @GetMapping("/history") + public ResultMessage deleteWords(HistorySearchParams historySearchParams) { + List hotWordsHistoryList = hotWordsHistoryService.queryByDay(historySearchParams.getDate()); + Collections.sort(hotWordsHistoryList); + return ResultUtil.data(hotWordsHistoryList); + } + + @ApiOperation(value = "热词统计") + @GetMapping("/statistics") + public ResultMessage deleteWords(HotWordsSearchParams hotWordsSearchParams) { + return ResultUtil.data(hotWordsHistoryService.statistics(hotWordsSearchParams)); + } +} + +@Data +class HistorySearchParams { + @DateTimeFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "查询日期不能为空") + private Date date; + +} diff --git a/manager-api/src/main/java/cn/lili/controller/setting/LogisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/LogisticsManagerController.java similarity index 83% rename from manager-api/src/main/java/cn/lili/controller/setting/LogisticsManagerController.java rename to manager-api/src/main/java/cn/lili/controller/other/LogisticsManagerController.java index c1831b12..6ca05e0c 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/LogisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/LogisticsManagerController.java @@ -1,17 +1,15 @@ -package cn.lili.controller.setting; +package cn.lili.controller.other; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.system.entity.dos.Logistics; import cn.lili.modules.system.service.LogisticsService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,15 +20,14 @@ import javax.validation.constraints.NotNull; * 管理端,物流公司接口 * * @author Chopper - * @date: 2020/11/17 7:56 下午 + * @since 2020/11/17 7:56 下午 */ @RestController @Api(tags = "管理端,物流公司接口") -@RequestMapping("/manager/logistics") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/logistics") public class LogisticsManagerController { - - private final LogisticsService logisticsService; + @Autowired + private LogisticsService logisticsService; @ApiOperation(value = "通过id获取物流公司") @GetMapping(value = "/get/{id}") @@ -65,6 +62,6 @@ public class LogisticsManagerController { @DeleteMapping(value = "/delete/{id}") public ResultMessage delAllByIds(@PathVariable String id) { logisticsService.removeById(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/other/MessageManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/MessageManagerController.java index d98b7819..58905e79 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/MessageManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/MessageManagerController.java @@ -1,6 +1,6 @@ package cn.lili.controller.other; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.message.entity.dos.Message; @@ -11,7 +11,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,15 +18,14 @@ import org.springframework.web.bind.annotation.*; * 管理端,消息发送管理接口 * * @author pikachu - * @date 2020-05-06 15:18:56 + * @since 2020-05-06 15:18:56 */ @RestController @Api(tags = "管理端,消息发送管理接口") -@RequestMapping("/manager/message") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/message") public class MessageManagerController { - - private final MessageService messageService; + @Autowired + private MessageService messageService; @GetMapping diff --git a/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java index 0e407ddf..8c78a25d 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java @@ -1,6 +1,7 @@ package cn.lili.controller.other; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.PageData; @@ -12,7 +13,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,15 +23,15 @@ import javax.validation.constraints.NotNull; * 管理端,页面设置管理接口 * * @author paulGao - * @date 2020-05-06 15:18:56 + * @since 2020-05-06 15:18:56 */ @RestController @Api(tags = "管理端,页面设置管理接口") -@RequestMapping("/manager/pageData") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/pageData") public class PageDataManagerController { - private final PageDataService pageDataService; + @Autowired + private PageDataService pageDataService; @ApiOperation(value = "获取页面信息") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @@ -50,6 +50,7 @@ public class PageDataManagerController { @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") }) + @DemoSite @PutMapping("/update/{id}") public ResultMessage updatePageData(@Valid PageData pageData, @NotNull @PathVariable String id) { pageData.setId(id); @@ -57,7 +58,7 @@ public class PageDataManagerController { } @ApiOperation(value = "页面列表") - @GetMapping("pageDataList") + @GetMapping("/pageDataList") public ResultMessage> pageDataList(PageVO pageVO, PageDataDTO pageDataDTO) { return ResultUtil.data(pageDataService.getPageDataList(pageVO, pageDataDTO)); } @@ -65,11 +66,13 @@ public class PageDataManagerController { @ApiOperation(value = "发布页面") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @PutMapping("/release/{id}") + @DemoSite public ResultMessage release(@PathVariable String id) { return ResultUtil.data(pageDataService.releasePageData(id)); } @ApiOperation(value = "删除页面") + @DemoSite @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @DeleteMapping("/remove/{id}") public ResultMessage remove(@PathVariable String id) { diff --git a/manager-api/src/main/java/cn/lili/controller/other/SensitiveWordsManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/SensitiveWordsManagerController.java index 555a89fa..2e1fbc15 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/SensitiveWordsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/SensitiveWordsManagerController.java @@ -1,18 +1,15 @@ package cn.lili.controller.other; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.system.entity.dos.SensitiveWords; import cn.lili.modules.system.service.SensitiveWordsService; -import cn.lili.modules.system.utils.SensitiveWordsFilter; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,15 +20,15 @@ import java.util.List; * 管理端,敏感词管理接口 * * @author Bulbasaur - * @date 2020-05-06 15:18:56 + * @since 2020-05-06 15:18:56 */ @RestController @Api(tags = "管理端,敏感词管理接口") -@RequestMapping("/manager/sensitiveWords") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/sensitiveWords") public class SensitiveWordsManagerController { - private final SensitiveWordsService sensitiveWordsService; + @Autowired + private SensitiveWordsService sensitiveWordsService; @ApiOperation(value = "通过id获取") @ApiImplicitParam(name = "id", value = "敏感词ID", required = true, dataType = "String", paramType = "path") @@ -49,11 +46,9 @@ public class SensitiveWordsManagerController { @ApiOperation(value = "添加敏感词") @PostMapping public ResultMessage add(@Valid SensitiveWords sensitiveWords) { - if (sensitiveWordsService.save(sensitiveWords)) { - SensitiveWordsFilter.put(sensitiveWords.getSensitiveWord()); - return ResultUtil.data(sensitiveWords); - } - return ResultUtil.error(ResultCode.ERROR); + sensitiveWordsService.save(sensitiveWords); + sensitiveWordsService.resetCache(); + return ResultUtil.data(sensitiveWords); } @ApiOperation(value = "修改敏感词") @@ -61,23 +56,17 @@ public class SensitiveWordsManagerController { @PutMapping("/{id}") public ResultMessage edit(@PathVariable String id, SensitiveWords sensitiveWords) { sensitiveWords.setId(id); - if (sensitiveWordsService.updateById(sensitiveWords)) { - SensitiveWordsFilter.put(sensitiveWords.getSensitiveWord()); - return ResultUtil.data(sensitiveWords); - } - return ResultUtil.error(ResultCode.ERROR); + sensitiveWordsService.updateById(sensitiveWords); + sensitiveWordsService.resetCache(); + return ResultUtil.data(sensitiveWords); } @ApiOperation(value = "批量删除") @ApiImplicitParam(name = "ids", value = "敏感词ID", required = true, dataType = "String", allowMultiple = true, paramType = "path") @DeleteMapping(value = "/delByIds/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { - for (String id : ids) { - String name = sensitiveWordsService.getById(id).getSensitiveWord(); - SensitiveWordsFilter.remove(name); - sensitiveWordsService.removeById(id); - } - return ResultUtil.success(ResultCode.SUCCESS); - + sensitiveWordsService.removeByIds(ids); + sensitiveWordsService.resetCache(); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/other/SpecialManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/SpecialManagerController.java index a199801f..af043eaa 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/SpecialManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/SpecialManagerController.java @@ -1,18 +1,15 @@ package cn.lili.controller.other; -import cn.lili.common.enums.MessageCode; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.Special; import cn.lili.modules.page.service.SpecialService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,15 +20,15 @@ import java.util.List; * 管理端,专题活动接口 * * @author Bulbasaur - * @date: 2020/12/7 11:33 + * @since 2020/12/7 11:33 */ @RestController @Api(tags = "管理端,专题活动接口") -@RequestMapping("/manager/special") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/order/special") public class SpecialManagerController { - private final SpecialService specialService; + @Autowired + private SpecialService specialService; @ApiOperation(value = "添加专题活动") @PostMapping("/addSpecial") @@ -44,21 +41,16 @@ public class SpecialManagerController { @PutMapping("/updateSpecial") public ResultMessage updateSpecial(@PathVariable String id, @Valid Special special) { special.setId(id); - if (specialService.updateById(special)) { - return ResultUtil.data(special); - } - return ResultUtil.error(ResultCode.ERROR); + specialService.updateById(special); + return ResultUtil.data(special); } @ApiOperation(value = "删除专题活动") @ApiImplicitParam(name = "id", value = "专题ID", required = true, dataType = "String", paramType = "path") @DeleteMapping("/{id}") public ResultMessage deleteSpecial(@PathVariable String id) { - if(specialService.removeSpecial(id)){ - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); - + specialService.removeSpecial(id); + return ResultUtil.success(); } @ApiOperation(value = "分页获取专题活动") diff --git a/manager-api/src/main/java/cn/lili/controller/other/VerificationSourceController.java b/manager-api/src/main/java/cn/lili/controller/other/VerificationSourceController.java index 6542cade..c67a0962 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/VerificationSourceController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/VerificationSourceController.java @@ -1,19 +1,17 @@ package cn.lili.controller.other; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; -import cn.lili.modules.base.entity.dos.VerificationSource; -import cn.lili.modules.base.service.VerificationSourceService; +import cn.lili.modules.verification.entity.dos.VerificationSource; +import cn.lili.modules.verification.service.VerificationSourceService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -23,16 +21,15 @@ import java.util.List; * 管理端,验证码资源维护接口 * * @author Chopper - * @date: 2020/12/7 11:33 + * @since 2020/12/7 11:33 */ @RestController @Api(tags = "管理端,验证码资源维护接口") -@RequestMapping("/manager/verificationSource") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/verificationSource") public class VerificationSourceController { - private final VerificationSourceService verificationSourceService; + @Autowired + private VerificationSourceService verificationSourceService; @GetMapping(value = "/{id}") @ApiOperation(value = "查看验证码资源维护详情") @@ -53,32 +50,31 @@ public class VerificationSourceController { @PostMapping @ApiOperation(value = "新增验证码资源维护") + @DemoSite public ResultMessage save(VerificationSource verificationSource) { - if (verificationSourceService.save(verificationSource)) { - verificationSourceService.initCache(); - return ResultUtil.data(verificationSource); - } - return ResultUtil.error(ResultCode.ERROR); + verificationSourceService.save(verificationSource); + verificationSourceService.initCache(); + return ResultUtil.data(verificationSource); } @PutMapping("/{id}") @ApiOperation(value = "更新验证码资源维护") + @DemoSite public ResultMessage update(@PathVariable String id, VerificationSource verificationSource) { verificationSource.setId(id); - if (verificationSourceService.updateById(verificationSource)) { - verificationSourceService.initCache(); - return ResultUtil.data(verificationSource); - } - return ResultUtil.error(ResultCode.ERROR); + verificationSourceService.updateById(verificationSource); + verificationSourceService.initCache(); + return ResultUtil.data(verificationSource); } @DeleteMapping(value = "/{ids}") @ApiOperation(value = "删除验证码资源维护") + @DemoSite public ResultMessage delAllByIds(@PathVariable List ids) { verificationSourceService.removeByIds(ids); verificationSourceService.initCache(); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/other/broadcast/CommodityManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/broadcast/CommodityManagerController.java new file mode 100644 index 00000000..bd5b5c94 --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/other/broadcast/CommodityManagerController.java @@ -0,0 +1,41 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.goods.entity.vos.CommodityVO; +import cn.lili.modules.goods.service.CommodityService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 管理端,直播间管理接口 + * + * @author Bulbasaur + * @since 2021/5/28 11:56 上午 + */ +@RestController +@Api(tags = "店铺端,直播商品接口") +@RequestMapping("/manager/broadcast/commodity") +public class CommodityManagerController { + + @Autowired + private CommodityService commodityService; + + @ApiOperation(value = "获取店铺直播商品列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "商品名称", dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "auditStatus", value = "直播商品状态", dataType = "String", paramType = "query") + }) + @GetMapping + public ResultMessage> page(String auditStatus, String name, PageVO pageVO) { + return ResultUtil.data(commodityService.commodityList(pageVO, name, auditStatus)); + } +} diff --git a/manager-api/src/main/java/cn/lili/controller/other/broadcast/StudioManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/broadcast/StudioManagerController.java new file mode 100644 index 00000000..584db8bf --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/other/broadcast/StudioManagerController.java @@ -0,0 +1,64 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.goods.entity.dos.Studio; +import cn.lili.modules.goods.entity.vos.StudioVO; +import cn.lili.modules.goods.service.StudioService; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; + +/** + * 管理端,直播间接口 + * + * @author Bulbasaur + * @since 2021/5/28 11:56 上午 + */ +@RestController +@Api(tags = "管理端,直播间接口") +@RequestMapping("/manager/broadcast/studio") +public class StudioManagerController { + + @Autowired + private StudioService studioService; + + @ApiOperation(value = "获取店铺直播间列表") + @ApiImplicitParam(name = "status", value = "直播间状态", paramType = "query") + @GetMapping + public ResultMessage> page(PageVO pageVO, String status) { + return ResultUtil.data(studioService.studioList(pageVO, null, status)); + } + + @ApiOperation(value = "获取店铺直播间详情") + @ApiImplicitParam(name = "studioId", value = "直播间ID", required = true, paramType = "path") + @GetMapping("/{studioId}") + public ResultMessage studioInfo(@PathVariable String studioId) { + return ResultUtil.data(studioService.getStudioVO(studioId)); + } + + @ApiOperation(value = "是否推荐直播间") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "Id", required = true, paramType = "path"), + @ApiImplicitParam(name = "recommend", value = "是否推荐", required = true, paramType = "query") + }) + @PutMapping("/recommend/{id}") + public ResultMessage recommend(@PathVariable String id, @NotNull boolean recommend) { + if (studioService.update(new UpdateWrapper() + .eq("id", id) + .set("recommend", recommend))) { + return ResultUtil.success(); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/manager-api/src/main/java/cn/lili/controller/purchase/PurchaseManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/purchase/PurchaseManagerController.java similarity index 82% rename from manager-api/src/main/java/cn/lili/controller/purchase/PurchaseManagerController.java rename to manager-api/src/main/java/cn/lili/controller/other/purchase/PurchaseManagerController.java index f24904cc..3b849d0d 100644 --- a/manager-api/src/main/java/cn/lili/controller/purchase/PurchaseManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/purchase/PurchaseManagerController.java @@ -1,7 +1,6 @@ -package cn.lili.controller.purchase; +package cn.lili.controller.other.purchase; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.purchase.entity.dos.PurchaseOrder; import cn.lili.modules.purchase.entity.dos.PurchaseQuoted; @@ -14,7 +13,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -25,22 +23,23 @@ import java.util.List; * 管理端,采购接口 * * @author Chopper - * @date: 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ @Api(tags = "管理端,采购接口") @RestController -@RequestMapping("/manager/purchase") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/purchase/purchase") public class PurchaseManagerController { /** * 采购单 */ - private final PurchaseOrderService purchaseOrderService; + @Autowired + private PurchaseOrderService purchaseOrderService; /** * 采购单报价 */ - private final PurchaseQuotedService purchaseQuotedService; + @Autowired + private PurchaseQuotedService purchaseQuotedService; @ApiOperation(value = "采购单分页") @@ -61,10 +60,8 @@ public class PurchaseManagerController { @PutMapping("/{id}") public ResultMessage close(@NotNull @PathVariable String id) { - if (purchaseOrderService.close(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + purchaseOrderService.close(id); + return ResultUtil.success(); } @ApiOperation(value = "报价列表") diff --git a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java index 869cd4be..04be319d 100644 --- a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java @@ -1,32 +1,36 @@ package cn.lili.controller.passport; +import cn.lili.common.aop.annotation.DemoSite; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.token.Token; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.utils.StringUtils; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.security.token.Token; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; +import cn.lili.modules.member.service.MemberService; import cn.lili.modules.permission.entity.dos.AdminUser; import cn.lili.modules.permission.entity.dto.AdminUserDTO; import cn.lili.modules.permission.entity.vo.AdminUserVO; import cn.lili.modules.permission.service.AdminUserService; -import cn.lili.modules.permission.service.DepartmentService; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import javax.validation.constraints.NotNull; +import java.util.ArrayList; import java.util.List; @@ -39,23 +43,38 @@ import java.util.List; @Slf4j @RestController @Api(tags = "管理员") -@RequestMapping("/manager/user") -@Transactional +@RequestMapping("/manager/passport/user") @Validated -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class AdminUserManagerController { + @Autowired + private AdminUserService adminUserService; + /** + * 会员 + */ + @Autowired + private MemberService memberService; - private final AdminUserService adminUserService; + @Autowired + private VerificationService verificationService; - private final DepartmentService departmentService; - - - @GetMapping(value = "/login") + @PostMapping(value = "/login") @ApiOperation(value = "登录管理员") - public ResultMessage login(String username, String password) { - return ResultUtil.data(adminUserService.login(username, password)); + public ResultMessage login(@NotNull(message = "用户名不能为空") @RequestParam String username, + @NotNull(message = "密码不能为空") @RequestParam String password, + @RequestHeader String uuid) { + if (verificationService.check(uuid, VerificationEnums.LOGIN)) { + return ResultUtil.data(adminUserService.login(username, password)); + } else { + throw new ServiceException(ResultCode.VERIFICATION_ERROR); + } } + @ApiOperation(value = "注销接口") + @PostMapping("/logout") + public ResultMessage logout() { + this.memberService.logout(UserEnums.MANAGER); + return ResultUtil.success(); + } @ApiOperation(value = "刷新token") @GetMapping("/refresh/{refreshToken}") @@ -66,17 +85,14 @@ public class AdminUserManagerController { @GetMapping(value = "/info") @ApiOperation(value = "获取当前登录用户接口") - public ResultMessage getUserInfo() { + public ResultMessage getUserInfo() { AuthUser tokenUser = UserContext.getCurrentUser(); if (tokenUser != null) { - AdminUserVO adminUser = new AdminUserVO(adminUserService.findByUsername(tokenUser.getUsername())); - if (StringUtils.isNotEmpty(adminUser.getDepartmentId())) { - adminUser.setDepartmentTitle(departmentService.getById(adminUser.getDepartmentId()).getTitle()); - } + AdminUser adminUser = adminUserService.findByUsername(tokenUser.getUsername()); adminUser.setPassword(null); return ResultUtil.data(adminUser); } - return ResultUtil.error(ResultCode.USER_NOT_LOGIN); + throw new ServiceException(ResultCode.USER_NOT_LOGIN); } @PutMapping(value = "/edit") @@ -86,23 +102,24 @@ public class AdminUserManagerController { AuthUser tokenUser = UserContext.getCurrentUser(); if (tokenUser != null) { //查询当前管理员 - AdminUser adminUserDB = adminUserService.findByUsername(tokenUser.getUsername()); - adminUserDB.setAvatar(adminUser.getAvatar()); - adminUserDB.setNickName(adminUser.getNickName()); - if (!adminUserService.updateById(adminUserDB)) { - return ResultUtil.error(ResultCode.USER_EDIT_ERROR); + AdminUser oldAdminUser = adminUserService.findByUsername(tokenUser.getUsername()); + oldAdminUser.setAvatar(adminUser.getAvatar()); + oldAdminUser.setNickName(adminUser.getNickName()); + if (!adminUserService.updateById(oldAdminUser)) { + throw new ServiceException(ResultCode.USER_EDIT_ERROR); } return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); } - return ResultUtil.error(ResultCode.USER_NOT_LOGIN); + throw new ServiceException(ResultCode.USER_NOT_LOGIN); } @PutMapping(value = "/admin/edit") @ApiOperation(value = "超级管理员修改其他管理员资料") - public ResultMessage edit(AdminUser adminUser, + @DemoSite + public ResultMessage edit(@Valid AdminUser adminUser, @RequestParam(required = false) List roles) { if (!adminUserService.updateAdminUser(adminUser, roles)) { - return ResultUtil.error(ResultCode.USER_EDIT_ERROR); + throw new ServiceException(ResultCode.USER_EDIT_ERROR); } return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); } @@ -116,6 +133,7 @@ public class AdminUserManagerController { */ @PutMapping(value = "/editPassword") @ApiOperation(value = "修改密码") + @DemoSite public ResultMessage editPassword(String password, String newPassword) { adminUserService.editPassword(password, newPassword); return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); @@ -123,6 +141,7 @@ public class AdminUserManagerController { @PostMapping(value = "/resetPassword/{ids}") @ApiOperation(value = "重置密码") + @DemoSite public ResultMessage resetPassword(@PathVariable List ids) { adminUserService.resetPassword(ids); return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); @@ -141,36 +160,47 @@ public class AdminUserManagerController { @PostMapping @ApiOperation(value = "添加用户") - public ResultMessage register(AdminUserDTO adminUser, + public ResultMessage register(@Valid AdminUserDTO adminUser, @RequestParam(required = false) List roles) { + int rolesMaxSize = 10; try { - if (roles != null & roles.size() >= 10) { - return ResultUtil.error(ResultCode.PERMISSION_BEYOND_TEN); + if (roles != null && roles.size() >= rolesMaxSize) { + throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); } adminUserService.saveAdminUser(adminUser, roles); } catch (Exception e) { - e.printStackTrace(); + log.error("添加用户错误", e); } - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @PutMapping(value = "/enable/{userId}") @ApiOperation(value = "禁/启 用 用户") + @DemoSite public ResultMessage disable(@ApiParam("用户唯一id标识") @PathVariable String userId, Boolean status) { AdminUser user = adminUserService.getById(userId); if (user == null) { - return ResultUtil.error(ResultCode.USER_NOT_EXIST); + throw new ServiceException(ResultCode.USER_NOT_EXIST); } user.setStatus(status); adminUserService.updateById(user); - return ResultUtil.success(ResultCode.SUCCESS); + + //登出用户 + if (Boolean.FALSE.equals(status)) { + List userIds = new ArrayList<>(); + userIds.add(userId); + adminUserService.logout(userIds); + } + + return ResultUtil.success(); } @DeleteMapping(value = "/{ids}") @ApiOperation(value = "批量通过ids删除") + @DemoSite public ResultMessage delAllByIds(@PathVariable List ids) { adminUserService.deleteCompletely(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java b/manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java similarity index 70% rename from manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java rename to manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java index 43b1b33a..b64308d7 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java @@ -1,20 +1,21 @@ -package cn.lili.controller.member; +package cn.lili.controller.passport; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO; import cn.lili.modules.member.entity.dto.MemberAddDTO; import cn.lili.modules.member.entity.vo.MemberSearchVO; +import cn.lili.modules.member.entity.vo.MemberVO; import cn.lili.modules.member.service.MemberService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -25,19 +26,18 @@ import java.util.List; * 管理端,会员接口 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "管理端,会员接口") -@RequestMapping("/manager/member") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/passport/member") public class MemberManagerController { - - private final MemberService memberService; + @Autowired + private MemberService memberService; @ApiOperation(value = "会员分页列表") @GetMapping - public ResultMessage> getByPage(MemberSearchVO memberSearchVO, PageVO page) { + public ResultMessage> getByPage(MemberSearchVO memberSearchVO, PageVO page) { return ResultUtil.data(memberService.getMemberPage(memberSearchVO, page)); } @@ -45,9 +45,9 @@ public class MemberManagerController { @ApiOperation(value = "通过ID获取会员信息") @ApiImplicitParam(name = "id", value = "会员ID", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/{id}") - public ResultMessage get(@PathVariable String id) { + public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(memberService.getById(id)); + return ResultUtil.data(memberService.getMember(id)); } @ApiOperation(value = "添加会员") @@ -57,29 +57,31 @@ public class MemberManagerController { return ResultUtil.data(memberService.addMember(member)); } + @DemoSite + @PreventDuplicateSubmissions @ApiOperation(value = "修改会员基本信息") @PutMapping public ResultMessage update(@Valid ManagerMemberEditDTO managerMemberEditDTO) { return ResultUtil.data(memberService.updateMember(managerMemberEditDTO)); } + @DemoSite + @PreventDuplicateSubmissions @ApiOperation(value = "修改会员状态,开启关闭会员") @ApiImplicitParams({ @ApiImplicitParam(name = "memberIds", value = "会员ID", required = true, dataType = "String", allowMultiple = true, paramType = "query"), - @ApiImplicitParam(name = "disabled", required = true, dataType = "boolean", paramType = "query") + @ApiImplicitParam(name = "disabled", required = true, dataType = "boolean", paramType = "query") }) @PutMapping("/updateMemberStatus") public ResultMessage updateMemberStatus(@RequestParam List memberIds, @RequestParam Boolean disabled) { - if (memberService.updateMemberStatus(memberIds, disabled)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + memberService.updateMemberStatus(memberIds, disabled); + return ResultUtil.success(); } @ApiOperation(value = "根据条件查询会员总数") @GetMapping("/num") - public ResultMessage getByPage(MemberSearchVO memberSearchVO) { + public ResultMessage getByPage(MemberSearchVO memberSearchVO) { return ResultUtil.data(memberService.getMemberNum(memberSearchVO)); } diff --git a/manager-api/src/main/java/cn/lili/controller/permission/DepartmentManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/DepartmentManagerController.java index 66c0bf8d..86087a74 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/DepartmentManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/DepartmentManagerController.java @@ -1,17 +1,16 @@ package cn.lili.controller.permission; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.permission.entity.dos.Department; import cn.lili.modules.permission.entity.vo.DepartmentVO; import cn.lili.modules.permission.service.DepartmentService; +import cn.lili.mybatis.util.PageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -25,11 +24,10 @@ import java.util.List; */ @RestController @Api(tags = "管理端,部门管理接口") -@RequestMapping("/manager/department") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/permission/department") public class DepartmentManagerController { - - private final DepartmentService departmentService; + @Autowired + private DepartmentService departmentService; @GetMapping(value = "/{id}") @ApiOperation(value = "查看部门详情") @@ -48,26 +46,22 @@ public class DepartmentManagerController { @PostMapping @ApiOperation(value = "新增部门") - public ResultMessage save(Department department) { - if (departmentService.save(department)) { - return ResultUtil.data(department); - } - return ResultUtil.error(ResultCode.ERROR); + public ResultMessage save(@Validated Department department) { + departmentService.save(department); + return ResultUtil.data(department); } @PutMapping("/{id}") @ApiOperation(value = "更新部门") - public ResultMessage update(@PathVariable String id, Department department) { - if (departmentService.updateById(department)) { - return ResultUtil.data(department); - } - return ResultUtil.error(ResultCode.ERROR); + public ResultMessage update(@PathVariable String id, @Validated Department department) { + departmentService.updateById(department); + return ResultUtil.data(department); } @DeleteMapping(value = "/{ids}") @ApiOperation(value = "删除部门") public ResultMessage delAllByIds(@PathVariable List ids) { departmentService.deleteByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/permission/DepartmentRoleManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/DepartmentRoleManagerController.java index d998c745..8bf61daf 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/DepartmentRoleManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/DepartmentRoleManagerController.java @@ -1,13 +1,11 @@ package cn.lili.controller.permission; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.permission.entity.dos.DepartmentRole; import cn.lili.modules.permission.service.DepartmentRoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,11 +20,10 @@ import java.util.List; */ @RestController @Api(tags = "管理端,部门角色接口") -@RequestMapping("/manager/departmentRole") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/permission/departmentRole") public class DepartmentRoleManagerController { - - private final DepartmentRoleService departmentRoleService; + @Autowired + private DepartmentRoleService departmentRoleService; @GetMapping(value = "/{departmentId}") @ApiOperation(value = "查看部门拥有的角色") @@ -37,13 +34,9 @@ public class DepartmentRoleManagerController { @PutMapping("/{departmentId}") @ApiOperation(value = "更新部门角色") public ResultMessage update(@PathVariable String departmentId, @RequestBody List departmentRole) { - try { - departmentRoleService.updateByDepartmentId(departmentId, departmentRole); - } catch (Exception e) { - e.printStackTrace(); - return ResultUtil.error(ResultCode.ERROR); - } - return ResultUtil.success(ResultCode.SUCCESS); + + departmentRoleService.updateByDepartmentId(departmentId, departmentRole); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java index 5dbc1d4f..4d952f1c 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java @@ -1,7 +1,7 @@ package cn.lili.controller.permission; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.permission.entity.dos.Menu; import cn.lili.modules.permission.entity.dto.MenuSearchParams; @@ -10,7 +10,7 @@ import cn.lili.modules.permission.service.MenuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,16 +21,16 @@ import java.util.List; * 管理端,菜单管理接口 * * @author Chopper - * @date 2020/11/20 12:07 + * @since 2020/11/20 12:07 */ +@Slf4j @RestController @Api(tags = "管理端,菜单管理接口") -@RequestMapping("/manager/menu") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/permission/menu") public class MenuManagerController { - private final MenuService menuService; - + @Autowired + private MenuService menuService; @ApiOperation(value = "搜索菜单") @GetMapping @@ -40,11 +40,12 @@ public class MenuManagerController { @ApiOperation(value = "添加") @PostMapping + @DemoSite public ResultMessage add(Menu menu) { try { - menuService.save(menu); + menuService.saveOrUpdateMenu(menu); } catch (Exception e) { - e.printStackTrace(); + log.error("添加菜单错误", e); } return ResultUtil.data(menu); } @@ -52,17 +53,19 @@ public class MenuManagerController { @ApiImplicitParam(name = "id", value = "菜单ID", required = true, paramType = "path", dataType = "String") @ApiOperation(value = "编辑") @PutMapping(value = "/{id}") + @DemoSite public ResultMessage edit(@PathVariable String id, Menu menu) { menu.setId(id); - menuService.updateById(menu); + menuService.saveOrUpdateMenu(menu); return ResultUtil.data(menu); } @ApiOperation(value = "批量删除") @DeleteMapping(value = "/{ids}") + @DemoSite public ResultMessage delByIds(@PathVariable List ids) { menuService.deleteIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "获取所有菜单") @@ -71,7 +74,7 @@ public class MenuManagerController { return ResultUtil.data(menuService.tree()); } - @ApiOperation(value = "获取所有菜单") + @ApiOperation(value = "获取所有菜单--根据当前用户角色") @GetMapping("/memberMenu") public ResultMessage> memberMenu() { return ResultUtil.data(menuService.findUserTree()); diff --git a/manager-api/src/main/java/cn/lili/controller/permission/RoleManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/RoleManagerController.java index 82551cf5..b6f3e9bf 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/RoleManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/RoleManagerController.java @@ -1,8 +1,7 @@ package cn.lili.controller.permission; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.mybatis.util.PageUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.permission.entity.dos.Role; @@ -10,7 +9,6 @@ import cn.lili.modules.permission.service.RoleService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,15 +19,14 @@ import java.util.List; * 管理端,角色管理接口 * * @author Chopper - * @date 2020/11/20 18:50 + * @since 2020/11/20 18:50 */ @RestController @Api(tags = "管理端,角色管理接口") -@RequestMapping("/manager/role") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/permission/role") public class RoleManagerController { - - private final RoleService roleService; + @Autowired + private RoleService roleService; @PostMapping @ApiOperation(value = "添加") @@ -57,7 +54,7 @@ public class RoleManagerController { @ApiOperation(value = "批量删除") public ResultMessage delByIds(@PathVariable List ids) { roleService.deleteRoles(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } diff --git a/manager-api/src/main/java/cn/lili/controller/permission/RoleMenuManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/RoleMenuManagerController.java index 5c69271c..b74f07ba 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/RoleMenuManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/RoleMenuManagerController.java @@ -1,13 +1,12 @@ package cn.lili.controller.permission; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.permission.entity.dos.RoleMenu; import cn.lili.modules.permission.service.RoleMenuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -18,15 +17,14 @@ import java.util.List; * 管理端,角色菜单接口 * * @author Chopper - * @date 2020/11/22 11:40 + * @since 2020/11/22 11:40 */ @RestController @Api(tags = "管理端,角色菜单接口") -@RequestMapping("/manager/roleMenu") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/permission/roleMenu") public class RoleMenuManagerController { - - private final RoleMenuService roleMenuService; + @Autowired + private RoleMenuService roleMenuService; @GetMapping(value = "/{roleId}") @ApiOperation(value = "查看某角色拥有到菜单") @@ -38,7 +36,7 @@ public class RoleMenuManagerController { @ApiOperation(value = "保存角色菜单") public ResultMessage save(@PathVariable String roleId, @RequestBody List roleMenus) { roleMenuService.updateRoleMenu(roleId, roleMenus); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/permission/UserRoleManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/UserRoleManagerController.java index bedbe5c3..28197734 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/UserRoleManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/UserRoleManagerController.java @@ -1,13 +1,12 @@ package cn.lili.controller.permission; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.permission.entity.dos.UserRole; import cn.lili.modules.permission.service.UserRoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -18,15 +17,14 @@ import java.util.List; * 管理端,管理员角色接口 * * @author Chopper - * @date 2020/11/22 11:53 + * @since 2020/11/22 11:53 */ @RestController @Api(tags = "管理端,管理员角色接口") -@RequestMapping("/manager/userRole") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/permission/userRole") public class UserRoleManagerController { - - private final UserRoleService userRoleService; + @Autowired + private UserRoleService userRoleService; @GetMapping(value = "/{userId}") @ApiOperation(value = "查看管理员角色") @@ -39,7 +37,7 @@ public class UserRoleManagerController { @ApiOperation(value = "更新角色菜单") public ResultMessage update(@PathVariable String userId, List userRole) { userRoleService.updateUserRole(userId, userRole); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java new file mode 100644 index 00000000..bf2f1a1b --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java @@ -0,0 +1,76 @@ +package cn.lili.controller.promotion; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.dto.CouponActivityDTO; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; +import cn.lili.modules.promotion.service.CouponActivityService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; + +/** + * 优惠券活动 + * + * @author Bulbasaur + * @since 2021/5/21 7:11 下午 + */ +@RestController +@Api(tags = "管理端,优惠券活动接口") +@RequestMapping("/manager/promotion/couponActivity") +public class CouponActivityManagerController { + + @Autowired + private CouponActivityService couponActivityService; + + @ApiOperation(value = "获取优惠券活动分页") + @GetMapping + public ResultMessage> getCouponActivityPage(PageVO page, CouponActivity couponActivity) { + return ResultUtil.data(couponActivityService.page(PageUtil.initPage(page), PageUtil.initWrapper(couponActivity))); + } + + @ApiOperation(value = "获取优惠券活动") + @ApiImplicitParam(name = "couponActivityId", value = "优惠券活动ID", required = true, paramType = "path") + @GetMapping("/{couponActivityId}") + public ResultMessage getCouponActivity(@PathVariable String couponActivityId) { + return ResultUtil.data(couponActivityService.getCouponActivityVO(couponActivityId)); + } + + @ApiOperation(value = "添加优惠券活动") + @PostMapping + public ResultMessage addCouponActivity(@RequestBody(required = false) CouponActivityDTO couponActivityDTO) { + for (CouponActivityItem couponActivityItem : couponActivityDTO.getCouponActivityItems()) { + if (couponActivityItem.getNum() > 5) { + throw new ServiceException(ResultCode.COUPON_ACTIVITY_MAX_NUM); + } + } + if (couponActivityService.savePromotions(couponActivityDTO)) { + return ResultUtil.data(couponActivityDTO); + } + return ResultUtil.error(ResultCode.COUPON_ACTIVITY_SAVE_ERROR); + } + + @ApiOperation(value = "关闭优惠券活动") + @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "优惠券活动ID", required = true, dataType = "String", paramType = "path")}) + @DeleteMapping("/{id}") + public ResultMessage updateStatus(@PathVariable String id) { + if (couponActivityService.updateStatus(Collections.singletonList(id), null, null)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + +} diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java index 1b3fb2ff..5c2b7485 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java @@ -1,59 +1,61 @@ package cn.lili.controller.promotion; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams; import cn.lili.modules.promotion.entity.vos.CouponVO; +import cn.lili.modules.promotion.entity.vos.MemberCouponVO; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.modules.promotion.tools.PromotionTools; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Arrays; import java.util.List; +import java.util.Objects; /** * 管理端,优惠券接口 * * @author paulG - * @date 2020/10/9 + * @since 2020/10/9 **/ @RestController @Api(tags = "管理端,优惠券接口") @RequestMapping("/manager/promotion/coupon") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CouponManagerController { - - private final CouponService couponService; - private final MemberCouponService memberCouponService; + @Autowired + private CouponService couponService; + @Autowired + private MemberCouponService memberCouponService; @ApiOperation(value = "获取优惠券列表") @GetMapping public ResultMessage> getCouponList(CouponSearchParams queryParam, PageVO page) { - page.setNotConvert(true); - queryParam.setStoreId("platform"); - IPage coupons = couponService.getCouponsByPageFromMongo(queryParam, page); - return ResultUtil.data(coupons); + if (queryParam.getStoreId() == null) { + queryParam.setStoreId(PromotionTools.PLATFORM_ID); + } + return ResultUtil.data(couponService.pageVOFindAll(queryParam, page)); } @ApiOperation(value = "获取优惠券详情") @GetMapping("/{couponId}") public ResultMessage getCoupon(@PathVariable String couponId) { - CouponVO coupon = couponService.getCouponDetailFromMongo(couponId); + CouponVO coupon = couponService.getDetail(couponId); return ResultUtil.data(coupon); } @@ -61,46 +63,41 @@ public class CouponManagerController { @PostMapping(consumes = "application/json", produces = "application/json") public ResultMessage addCoupon(@RequestBody CouponVO couponVO) { this.setStoreInfo(couponVO); - if (couponService.add(couponVO) != null) { - return ResultUtil.data(couponVO); - } - return ResultUtil.error(ResultCode.ERROR); + couponService.savePromotions(couponVO); + return ResultUtil.data(couponVO); } @ApiOperation(value = "修改优惠券") @PutMapping(consumes = "application/json", produces = "application/json") public ResultMessage updateCoupon(@RequestBody CouponVO couponVO) { + this.setStoreInfo(couponVO); Coupon coupon = couponService.getById(couponVO.getId()); - couponVO.setPromotionStatus(PromotionStatusEnum.NEW.name()); - if (couponService.updateCoupon(couponVO) != null) { - return ResultUtil.data(coupon); - } - return ResultUtil.error(ResultCode.ERROR); + couponService.updatePromotions(couponVO); + return ResultUtil.data(coupon); } @ApiOperation(value = "修改优惠券状态") @PutMapping("/status") - public ResultMessage updateCouponStatus(String couponIds, String promotionStatus) { + public ResultMessage updateCouponStatus(String couponIds, Long startTime, Long endTime) { String[] split = couponIds.split(","); - if (couponService.updateCouponStatus(Arrays.asList(split), PromotionStatusEnum.valueOf(promotionStatus))) { + if (couponService.updateStatus(Arrays.asList(split), startTime, endTime)) { return ResultUtil.success(ResultCode.COUPON_EDIT_STATUS_SUCCESS); } - return ResultUtil.error(ResultCode.COUPON_EDIT_STATUS_ERROR); + throw new ServiceException(ResultCode.COUPON_EDIT_STATUS_ERROR); } @ApiOperation(value = "批量删除") @DeleteMapping(value = "/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { - for (String id : ids) { - couponService.deleteCoupon(id); - } - return ResultUtil.success(ResultCode.SUCCESS); + couponService.removePromotions(ids); + return ResultUtil.success(); } @ApiOperation(value = "会员优惠券作废") @PutMapping(value = "/member/cancellation/{id}") public ResultMessage cancellation(@PathVariable String id) { - memberCouponService.cancellation(id); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + memberCouponService.cancellation(currentUser.getId(), id); return ResultUtil.success(ResultCode.COUPON_CANCELLATION_SUCCESS); } @@ -116,13 +113,21 @@ public class CouponManagerController { } + @ApiOperation(value = "获取优惠券领取详情") + @GetMapping(value = "/received") + public ResultMessage> getReceiveByPage(MemberCouponSearchParams searchParams, + PageVO page) { + IPage result = memberCouponService.getMemberCouponsPage(PageUtil.initPage(page), searchParams); + return ResultUtil.data(result); + } + private void setStoreInfo(CouponVO couponVO) { AuthUser currentUser = UserContext.getCurrentUser(); if (currentUser == null) { - throw new ServiceException("获取当前用户信息不存在"); + throw new ServiceException(ResultCode.USER_NOT_EXIST); } - couponVO.setStoreId("platform"); - couponVO.setStoreName("platform"); + couponVO.setStoreId(PromotionTools.PLATFORM_ID); + couponVO.setStoreName(PromotionTools.PLATFORM_NAME); } } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/FullDiscountManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/FullDiscountManagerController.java index 82ff03ad..fc640c46 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/FullDiscountManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/FullDiscountManagerController.java @@ -1,40 +1,41 @@ package cn.lili.controller.promotion; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams; -import cn.lili.modules.promotion.service.FullDiscountService; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; +import cn.lili.modules.promotion.entity.dos.FullDiscount; +import cn.lili.modules.promotion.entity.dto.search.FullDiscountSearchParams; +import cn.lili.modules.promotion.service.FullDiscountService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -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 org.springframework.web.bind.annotation.*; + +import java.util.Collections; /** * 管理端,满额活动接口 * * @author paulG - * @date 2021/1/12 + * @since 2021/1/12 **/ @RestController @Api(tags = "管理端,满额活动接口") @RequestMapping("/manager/promotion/fullDiscount") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FullDiscountManagerController { - private final FullDiscountService fullDiscountService; + @Autowired + private FullDiscountService fullDiscountService; @ApiOperation(value = "获取满优惠列表") @GetMapping - public ResultMessage> getCouponList(FullDiscountSearchParams searchParams, PageVO page) { - page.setNotConvert(true); - return ResultUtil.data(fullDiscountService.getFullDiscountByPageFromMongo(searchParams, page)); + public ResultMessage> getCouponList(FullDiscountSearchParams searchParams, PageVO page) { + return ResultUtil.data(fullDiscountService.pageFindAll(searchParams, page)); } @ApiOperation(value = "获取满优惠详情") @@ -43,10 +44,16 @@ public class FullDiscountManagerController { return ResultUtil.data(fullDiscountService.getFullDiscount(id)); } - @ApiOperation(value = "获取满优惠商品列表") - @GetMapping("/goods/{id}") - public ResultMessage getCouponGoods(@PathVariable String id) { - return ResultUtil.data(fullDiscountService.getFullDiscount(id)); + @ApiOperation(value = "修改满额活动状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "满额活动ID", required = true, paramType = "path"), + @ApiImplicitParam(name = "promotionStatus", value = "满额活动状态", required = true, paramType = "path") + }) + @PutMapping("/status/{id}") + public ResultMessage updateCouponStatus(@PathVariable String id, Long startTime, Long endTime) { + if (fullDiscountService.updateStatus(Collections.singletonList(id), startTime, endTime)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + return ResultUtil.error(ResultCode.ERROR); } - } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/KanJiaActivityGoodsManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/KanJiaActivityGoodsManagerController.java new file mode 100644 index 00000000..d8897141 --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/promotion/KanJiaActivityGoodsManagerController.java @@ -0,0 +1,80 @@ +package cn.lili.controller.promotion; + + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.promotion.entity.dos.KanjiaActivityGoods; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsOperationDTO; +import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityGoodsParams; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + + +/** + * 管理端,促销接口 + * + * @author qiuqiu + * @since 2021/7/2 + **/ +@RestController +@Api(tags = "管理端,砍价促销接口") +@RequestMapping("/manager/promotion/kanJiaGoods") +public class KanJiaActivityGoodsManagerController { + + @Autowired + private KanjiaActivityGoodsService kanJiaActivityGoodsService; + + @PostMapping + @ApiOperation(value = "添加砍价活动") + public ResultMessage add(@RequestBody KanjiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) { + kanJiaActivityGoodsService.add(kanJiaActivityGoodsOperationDTO); + return ResultUtil.success(); + } + + + @ApiOperation(value = "获取砍价活动分页") + @GetMapping + public ResultMessage> getKanJiaActivityPage(KanjiaActivityGoodsParams kanJiaParams, PageVO page) { + return ResultUtil.data(kanJiaActivityGoodsService.pageFindAll(kanJiaParams, page)); + } + + + @GetMapping("/{id}") + @ApiOperation(value = "获取积分商品详情") + public ResultMessage getPointsGoodsDetail(@PathVariable("id") String goodsId) { + KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO = kanJiaActivityGoodsService.getKanjiaGoodsDetail(goodsId); + return ResultUtil.data(kanJiaActivityGoodsDTO); + } + + + @PutMapping + @ApiOperation(value = "修改砍价商品") + public ResultMessage updatePointsGoods(@RequestBody KanjiaActivityGoodsDTO kanJiaActivityGoodsDTO) { + if (!kanJiaActivityGoodsService.updateKanjiaActivityGoods(kanJiaActivityGoodsDTO)) { + return ResultUtil.error(ResultCode.KANJIA_GOODS_UPDATE_ERROR); + } + return ResultUtil.success(); + } + + + @DeleteMapping("/{ids}") + @ApiOperation(value = "删除砍价商品") + public ResultMessage delete(@PathVariable String ids) { + if (kanJiaActivityGoodsService.removePromotions(Arrays.asList(ids.split(",")))) { + return ResultUtil.success(); + } + throw new ServiceException(ResultCode.KANJIA_GOODS_DELETE_ERROR); + } + + +} diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/PintuanManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/PintuanManagerController.java index 5838a43d..7210d33c 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/PintuanManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/PintuanManagerController.java @@ -1,83 +1,72 @@ package cn.lili.controller.promotion; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.Pintuan; -import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.PintuanSearchParams; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.search.PintuanSearchParams; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.PintuanVO; -import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; import cn.lili.modules.promotion.service.PintuanService; import cn.lili.modules.promotion.service.PromotionGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.Date; +import java.util.Arrays; /** * 管理端,平台拼团接口 * * @author paulG - * @date 2020/10/9 + * @since 2020/10/9 **/ @RestController @Api(tags = "管理端,平台拼团接口") @RequestMapping("/manager/promotion/pintuan") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PintuanManagerController { - - private final PintuanService pintuanService; - private final PromotionGoodsService promotionGoodsService; + @Autowired + private PintuanService pintuanService; + @Autowired + private PromotionGoodsService promotionGoodsService; @GetMapping(value = "/{id}") @ApiOperation(value = "通过id获取") - public ResultMessage get(@PathVariable String id) { - Pintuan pintuan = pintuanService.getById(id); + public ResultMessage get(@PathVariable String id) { + PintuanVO pintuan = pintuanService.getPintuanVO(id); return ResultUtil.data(pintuan); } @GetMapping @ApiOperation(value = "根据条件分页查询拼团活动列表") - public ResultMessage> getPintuanByPage(PintuanSearchParams queryParam, PageVO pageVo) { - IPage pintuanByPageFromMongo = pintuanService.getPintuanByPageFromMongo(queryParam, pageVo); - return ResultUtil.data(pintuanByPageFromMongo); + public ResultMessage> getPintuanByPage(PintuanSearchParams queryParam, PageVO pageVo) { + IPage pintuanIPage = pintuanService.pageFindAll(queryParam, pageVo); + return ResultUtil.data(pintuanIPage); } @GetMapping("/goods/{pintuanId}") @ApiOperation(value = "根据条件分页查询拼团活动商品列表") - public ResultMessage> getPintuanGoodsByPage(@PathVariable String pintuanId, PageVO pageVo) { + public ResultMessage> getPintuanGoodsByPage(@PathVariable String pintuanId, PageVO pageVo) { PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); searchParams.setPromotionId(pintuanId); searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name()); - IPage promotionGoods = promotionGoodsService.getPromotionGoods(searchParams, pageVo); - return ResultUtil.data(promotionGoods); + return ResultUtil.data(promotionGoodsService.pageFindAll(searchParams, pageVo)); } - @PutMapping("/open/{pintuanId}") - @ApiOperation(value = "手动开启拼团活动") - public ResultMessage openPintuan(@PathVariable String pintuanId, Long startTime, Long endTime) { - if (pintuanService.openPintuan(pintuanId, new Date(startTime), new Date(endTime))) { + @PutMapping("/status/{pintuanIds}") + @ApiOperation(value = "操作拼团活动状态") + public ResultMessage openPintuan(@PathVariable String pintuanIds, Long startTime, Long endTime) { + if (pintuanService.updateStatus(Arrays.asList(pintuanIds.split(",")), startTime, endTime)) { return ResultUtil.success(ResultCode.PINTUAN_MANUAL_OPEN_SUCCESS); } - return ResultUtil.error(ResultCode.PINTUAN_MANUAL_OPEN_ERROR); + throw new ServiceException(ResultCode.PINTUAN_MANUAL_OPEN_ERROR); } - @PutMapping("/close/{pintuanId}") - @ApiOperation(value = "手动关闭拼团活动") - public ResultMessage closePintuan(@PathVariable String pintuanId) { - if (pintuanService.closePintuan(pintuanId)) { - return ResultUtil.success(ResultCode.PINTUAN_MANUAL_CLOSE_SUCCESS); - } - return ResultUtil.error(ResultCode.PINTUAN_MANUAL_CLOSE_ERROR); - } - - } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsCategoryManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsCategoryManagerController.java index abddabe6..5cdebfc1 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsCategoryManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsCategoryManagerController.java @@ -1,7 +1,6 @@ package cn.lili.controller.promotion; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory; @@ -10,7 +9,6 @@ import cn.lili.modules.promotion.service.PointsGoodsCategoryService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -18,41 +16,34 @@ import org.springframework.web.bind.annotation.*; * 管理端,积分商品分类接口 * * @author paulG - * @date 2021/1/14 + * @since 2021/1/14 **/ @RestController @Api(tags = "管理端,积分商品分类接口") @RequestMapping("/manager/promotion/pointsGoodsCategory") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PointsGoodsCategoryManagerController { - - private final PointsGoodsCategoryService pointsGoodsCategoryService; + @Autowired + private PointsGoodsCategoryService pointsGoodsCategoryService; @PostMapping @ApiOperation(value = "添加积分商品分类") public ResultMessage add(PointsGoodsCategoryVO pointsGoodsCategory) { - if (pointsGoodsCategoryService.addCategory(pointsGoodsCategory)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + pointsGoodsCategoryService.addCategory(pointsGoodsCategory); + return ResultUtil.success(); } @PutMapping @ApiOperation(value = "修改积分商品分类") public ResultMessage update(PointsGoodsCategoryVO pointsGoodsCategory) { - if (pointsGoodsCategoryService.updateCategory(pointsGoodsCategory)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + pointsGoodsCategoryService.updateCategory(pointsGoodsCategory); + return ResultUtil.success(); } @DeleteMapping("/{id}") @ApiOperation(value = "删除积分商品分类") public ResultMessage delete(@PathVariable String id) { - if (pointsGoodsCategoryService.deleteCategory(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + pointsGoodsCategoryService.deleteCategory(id); + return ResultUtil.success(); } @GetMapping diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java index 06c26f33..d4442ab0 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java @@ -1,89 +1,77 @@ package cn.lili.controller.promotion; import cn.lili.common.enums.ResultCode; -import cn.lili.common.security.AuthUser; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams; +import cn.lili.modules.promotion.entity.dos.PointsGoods; +import cn.lili.modules.promotion.entity.dto.search.PointsGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.service.PointsGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; /** * 管理端,积分商品接口 * * @author paulG - * @date 2021/1/14 + * @since 2021/1/14 **/ @RestController @Api(tags = "管理端,积分商品接口") @RequestMapping("/manager/promotion/pointsGoods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PointsGoodsManagerController { - - private final PointsGoodsService pointsGoodsService; + @Autowired + private PointsGoodsService pointsGoodsService; @PostMapping(consumes = "application/json", produces = "application/json") @ApiOperation(value = "添加积分商品") - public ResultMessage addPointsGoods(@RequestBody List pointsGoodsList) { - AuthUser currentUser = UserContext.getCurrentUser(); - List collect = new ArrayList<>(); - for (PointsGoodsVO i : pointsGoodsList) { - i.setStoreName("platform"); - i.setStoreId(currentUser.getId()); - collect.add(i); + public ResultMessage addPointsGoods(@RequestBody List pointsGoodsList) { + if (pointsGoodsService.savePointsGoodsBatch(pointsGoodsList)) { + return ResultUtil.success(); } - if (pointsGoodsService.addPointsGoods(collect)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + return ResultUtil.error(ResultCode.POINT_GOODS_ERROR); } @PutMapping(consumes = "application/json", produces = "application/json") @ApiOperation(value = "修改积分商品") public ResultMessage updatePointsGoods(@RequestBody PointsGoodsVO pointsGoods) { - AuthUser currentUser = UserContext.getCurrentUser(); - pointsGoods.setStoreId(currentUser.getId()); - pointsGoods.setStoreName("platform"); - if (pointsGoodsService.updatePointsGoods(pointsGoods)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + Objects.requireNonNull(UserContext.getCurrentUser()); + pointsGoodsService.updatePromotions(pointsGoods); + return ResultUtil.success(); } - @PutMapping("/{ids}") + @PutMapping("/status/{ids}") @ApiOperation(value = "修改积分商品状态") - public ResultMessage updatePointsGoodsStatus(@PathVariable String ids, String promotionStatus) { - if (pointsGoodsService.updatePointsGoodsPromotionStatus(Arrays.asList(ids.split(",")), promotionStatus)) { - return ResultUtil.success(ResultCode.SUCCESS); + public ResultMessage updatePointsGoodsStatus(@PathVariable String ids, Long startTime, Long endTime) { + if (pointsGoodsService.updateStatus(Arrays.asList(ids.split(",")), startTime, endTime)) { + return ResultUtil.success(); } - return ResultUtil.error(ResultCode.ERROR); + return ResultUtil.error(ResultCode.POINT_GOODS_ERROR); } @DeleteMapping("/{ids}") @ApiOperation(value = "删除积分商品") public ResultMessage delete(@PathVariable String ids) { - if (pointsGoodsService.deletePointsGoods(Arrays.asList(ids.split(",")))) { - return ResultUtil.success(ResultCode.SUCCESS); + if (pointsGoodsService.removePromotions(Arrays.asList(ids.split(",")))) { + return ResultUtil.success(); } - return ResultUtil.error(ResultCode.ERROR); + throw new ServiceException(ResultCode.POINT_GOODS_ERROR); } @GetMapping @ApiOperation(value = "分页获取积分商品") - public ResultMessage> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) { - IPage pointsGoodsByPage = pointsGoodsService.getPointsGoodsByPage(searchParams, page); + public ResultMessage> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) { + IPage pointsGoodsByPage = pointsGoodsService.pageFindAll(searchParams, page); return ResultUtil.data(pointsGoodsByPage); } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/PromotionManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/PromotionManagerController.java index b7ec8b17..a4c9f59d 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/PromotionManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/PromotionManagerController.java @@ -1,50 +1,56 @@ package cn.lili.controller.promotion; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; -import cn.lili.modules.promotion.service.PromotionService; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; +import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum; import cn.lili.modules.promotion.service.PromotionGoodsService; +import cn.lili.modules.promotion.service.PromotionService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; 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.List; import java.util.Map; /** * 管理端,促销接口 * * @author paulG - * @date 2021/2/2 + * @since 2021/2/2 **/ @RestController @Api(tags = "管理端,促销接口") -@RequestMapping("/manager/promotion") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/promotion/promotion") public class PromotionManagerController { - private final PromotionService promotionService; - - private final PromotionGoodsService promotionGoodsService; + @Autowired + private PromotionService promotionService; + @Autowired + private PromotionGoodsService promotionGoodsService; @GetMapping("/current") @ApiOperation(value = "获取当前进行中的促销活动") - public ResultMessage> getCurrentPromotion() { - Map currentPromotion = promotionService.getCurrentPromotion(); + public ResultMessage>> getCurrentPromotion() { + Map> currentPromotion = promotionService.getCurrentPromotion(); return ResultUtil.data(currentPromotion); } @GetMapping("/{promotionId}/goods") @ApiOperation(value = "获取当前进行中的促销活动商品") - public ResultMessage> getPromotionGoods(@PathVariable String promotionId, String promotionType, PageVO pageVO) { - IPage promotionGoods = promotionGoodsService.getCurrentPromotionGoods(promotionType, pageVO); + public ResultMessage> getPromotionGoods(@PathVariable String promotionId, String promotionType, PageVO pageVO) { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionId(promotionId); + searchParams.setPromotionType(promotionType); + searchParams.setPromotionStatus(PromotionsStatusEnum.START.name()); + IPage promotionGoods = promotionGoodsService.pageFindAll(searchParams, pageVO); return ResultUtil.data(promotionGoods); } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java index 5e1add64..7eb9452d 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java @@ -1,113 +1,96 @@ package cn.lili.controller.promotion; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.security.AuthUser; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; -import cn.lili.modules.promotion.entity.enums.SeckillApplyStatusEnum; -import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; +import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Collections; + /** - * 管理端,限时抢购接口 + * 管理端,秒杀活动接口 * * @author paulG - * @date 2020/8/20 + * @since 2020/8/20 **/ @RestController -@Api(tags = "管理端,限时抢购接口") +@Api(tags = "管理端,秒杀活动接口") @RequestMapping("/manager/promotion/seckill") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SeckillManagerController { + @Autowired + private SeckillService seckillService; + @Autowired + private SeckillApplyService seckillApplyService; - private final SeckillService seckillService; - private final SeckillApplyService seckillApplyService; - @PostMapping - @ApiOperation(value = "添加限时抢购") - public ResultMessage addSeckill(SeckillVO seckillVO) { - AuthUser currentUser = UserContext.getCurrentUser(); - seckillVO.setStoreId(currentUser.getId()); - seckillVO.setStoreName(currentUser.getUsername()); - seckillVO.setSeckillApplyStatus(SeckillApplyStatusEnum.NOT_APPLY.name()); - if (seckillService.saveSeckill(seckillVO)) { - return ResultUtil.data(seckillVO); - } - return ResultUtil.error(ResultCode.ERROR); + @ApiOperation(value = "初始化秒杀活动(初始化方法,默认初始化30天内的活动)") + @GetMapping("/init") + public void addSeckill() { + seckillService.init(); } - @PutMapping - @ApiOperation(value = "修改限时抢购") - public ResultMessage updateSeckill(SeckillVO seckillVO) { - AuthUser currentUser = UserContext.getCurrentUser(); - seckillVO.setStoreId(currentUser.getId()); - seckillVO.setStoreName(currentUser.getUsername()); - if (seckillService.modifySeckill(seckillVO)) { - return ResultUtil.data(seckillVO); - } - return ResultUtil.error(ResultCode.ERROR); + + @ApiOperation(value = "修改秒杀活动") + @PutMapping(consumes = "application/json", produces = "application/json") + public ResultMessage updateSeckill(@RequestBody SeckillVO seckillVO) { + seckillService.updatePromotions(seckillVO); + return ResultUtil.data(seckillVO); } - @GetMapping(value = "/{id}") @ApiOperation(value = "通过id获取") + @ApiImplicitParam(name = "id", value = "秒杀活动ID", required = true, dataType = "String", paramType = "path") + @GetMapping(value = "/{id}") public ResultMessage get(@PathVariable String id) { Seckill seckill = seckillService.getById(id); return ResultUtil.data(seckill); } + @ApiOperation(value = "分页查询秒杀活动列表") @GetMapping - @ApiOperation(value = "分页查询限时抢购列表") - public ResultMessage> getAll(SeckillSearchParams param, PageVO pageVo) { - pageVo.setNotConvert(true); - IPage page = seckillService.getSeckillByPageFromMongo(param, pageVo); - return ResultUtil.data(page); + public ResultMessage> getAll(SeckillSearchParams param, PageVO pageVo) { + return ResultUtil.data(seckillService.pageFindAll(param, pageVo)); } + @ApiOperation(value = "删除一个秒杀活动") + @ApiImplicitParam(name = "id", value = "秒杀活动ID", required = true, dataType = "String", paramType = "path") @DeleteMapping("/{id}") - @ApiOperation(value = "删除一个限时抢购") public ResultMessage deleteSeckill(@PathVariable String id) { - seckillService.deleteSeckill(id); - return ResultUtil.success(ResultCode.SUCCESS); + seckillService.removePromotions(Collections.singletonList(id)); + return ResultUtil.success(); } - @PutMapping("/close/{id}") - @ApiOperation(value = "关闭一个限时抢购") - public ResultMessage closeSeckill(@PathVariable String id) { - seckillService.closeSeckill(id); - return ResultUtil.success(ResultCode.SUCCESS); - } - - @PutMapping("/open/{id}") - @ApiOperation(value = "一个限时抢购") - public ResultMessage openSeckill(@PathVariable String id) { - seckillService.openSeckill(id); - return ResultUtil.success(ResultCode.SUCCESS); + @ApiOperation(value = "操作秒杀活动状态") + @ApiImplicitParam(name = "id", value = "秒杀活动ID", required = true, dataType = "String", paramType = "path") + @PutMapping("/status/{id}") + public ResultMessage updateSeckillStatus(@PathVariable String id, Long startTime, Long endTime) { + seckillService.updateStatus(Collections.singletonList(id), startTime, endTime); + return ResultUtil.success(); } + @ApiOperation(value = "获取秒杀活动申请列表") @GetMapping("/apply") - @ApiOperation(value = "获取限时抢购申请列表") public ResultMessage> getSeckillApply(SeckillSearchParams param, PageVO pageVo) { - IPage seckillApply = seckillApplyService.getSeckillApplyFromMongo(param, pageVo); + IPage seckillApply = seckillApplyService.getSeckillApplyPage(param, pageVo); return ResultUtil.data(seckillApply); } - @PutMapping("/apply/audit/{ids}") - @ApiOperation(value = "审核多个限时抢购申请") - public ResultMessage auditSeckillApply(@PathVariable String[] ids, String seckillId, String applyStatus, String failReason) { - seckillApplyService.auditBatchApply(ids, seckillId, applyStatus, failReason); - return ResultUtil.success(ResultCode.SUCCESS); + @DeleteMapping("/apply/{seckillId}/{id}") + @ApiOperation(value = "删除秒杀活动申请") + public ResultMessage deleteSeckillApply(@PathVariable String seckillId, @PathVariable String id) { + seckillApplyService.removeSeckillApply(seckillId, id); + return ResultUtil.success(); } + } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/InstantDeliveryManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/InstantDeliveryManagerController.java deleted file mode 100644 index 3c1e1c93..00000000 --- a/manager-api/src/main/java/cn/lili/controller/setting/InstantDeliveryManagerController.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.lili.controller.setting; - -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.system.entity.dos.InstantDelivery; -import cn.lili.modules.system.entity.plugin.ConfigItem; -import cn.lili.modules.system.entity.vo.InstantDeliveryVO; -import cn.lili.modules.system.service.InstantDeliveryService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 管理端,即时配送接口 - * - * @author pikachu - * @date: 2020/11/17 7:56 下午 - */ -@RestController -@Api(tags = "管理端,即时配送接口") -@RequestMapping("/manager/instant-delivery") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class InstantDeliveryManagerController { - - private final InstantDeliveryService instantDeliveryService; - - @GetMapping(value = "/getByPage") - @ApiOperation(value = "分页获取") - public ResultMessage> getByPage(PageVO page) { - //查询数据 - IPage data = instantDeliveryService.page(PageUtil.initPage(page)); - //组织数据结构 - IPage newData = instantDeliveryService.getInstantDeliveryPage(data, page); - System.out.println(); - //返回数据 - return ResultUtil.data(newData); - } - - @ApiOperation(value = "修改即时配送方案参数", response = InstantDeliveryVO.class) - @PutMapping(value = "/{bean}/config") - @ApiImplicitParams({ - @ApiImplicitParam(name = "bean", value = "即时配送bean", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "config", value = "即时配送参数", required = true, dataType = "String", paramType = "body") - }) - public ResultMessage edit(@PathVariable String bean, @RequestBody List config) { - InstantDeliveryVO instantDeliveryVO = new InstantDeliveryVO(); - instantDeliveryVO.setDeliveryBean(bean); - instantDeliveryVO.setConfigItems(config); - return ResultUtil.data(this.instantDeliveryService.edit(instantDeliveryVO)); - } - - @ApiOperation(value = "获取即时配送的配置", response = InstantDeliveryVO.class) - @GetMapping("/{bean}") - @ApiImplicitParam(name = "bean", value = "即时配送bean id", required = true, dataType = "String", paramType = "path") - public ResultMessage getInstantDeliverySetting(@PathVariable String bean) { - return ResultUtil.data(this.instantDeliveryService.getInstantDeliveryConfig(bean)); - } - - - @ApiOperation(value = "开启即时配送方案", response = String.class) - @PutMapping("/{bean}/open") - @ApiImplicitParam(name = "bean", value = "bean", required = true, dataType = "String", paramType = "path") - public ResultMessage open(@PathVariable String bean) { - this.instantDeliveryService.openInstantDelivery(bean); - return ResultUtil.success(ResultCode.SUCCESS); - } - - - @ApiOperation(value = "修改封面图片", response = String.class) - @PutMapping("/{bean}/image") - @ApiImplicitParams({ - @ApiImplicitParam(name = "bean", value = "即时配送bean", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "images", value = "封面图片", required = true, dataType = "String", paramType = "query") - }) - public ResultMessage open(@PathVariable String bean, String images) { - InstantDelivery instantDelivery = this.instantDeliveryService.getOne(new QueryWrapper().eq("delivery_bean", bean)); - if (instantDelivery != null) { - instantDelivery.setImages(images); - return ResultUtil.data(instantDeliveryService.updateById(instantDelivery)); - } - return ResultUtil.data(false); - } -} diff --git a/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java index 5d6226bb..ca2e3689 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java @@ -1,17 +1,14 @@ package cn.lili.controller.setting; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.permission.service.SystemLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -21,29 +18,27 @@ import java.util.List; * 管理端,日志管理接口 * * @author Chopper - * @date: 2020/11/17 7:56 下午 + * @since 2020/11/17 7:56 下午 */ @Slf4j -@Transactional @RestController @Api(tags = "日志管理接口") -@RequestMapping("/manager/log") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/setting/log") public class LogManagerController { - - private final SystemLogService systemLogService; + @Autowired + private SystemLogService systemLogService; @GetMapping(value = "/getAllByPage") @ApiOperation(value = "分页获取全部") public ResultMessage getAllByPage(@RequestParam(required = false) Integer type, - @RequestParam String key, + @RequestParam String searchKey, String operatorName, SearchVO searchVo, PageVO pageVo) { try { - return ResultUtil.data(systemLogService.queryLog(null, operatorName, key, searchVo, pageVo)); + return ResultUtil.data(systemLogService.queryLog(null, operatorName, searchKey, searchVo, pageVo)); } catch (Exception e) { - e.printStackTrace(); + log.error("日志获取错误",e); } return null; } @@ -53,13 +48,13 @@ public class LogManagerController { @DeleteMapping(value = "/{ids}") public ResultMessage delByIds(@PathVariable List ids) { systemLogService.deleteLog(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @DeleteMapping @ApiOperation(value = "全部删除") public ResultMessage delAll() { systemLogService.flushAll(); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/NoticeMessageManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/NoticeMessageManagerController.java index 80e534af..4bbbf403 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/NoticeMessageManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/NoticeMessageManagerController.java @@ -1,9 +1,10 @@ package cn.lili.controller.setting; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.SwitchEnum; +import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.BeanUtil; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.message.entity.dos.NoticeMessage; @@ -15,7 +16,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.EnumUtils; import org.elasticsearch.ResourceNotFoundException; @@ -30,16 +30,15 @@ import java.util.List; * 管理端,会员站内信管理接口 * * @author Chopper - * @date: 2020/11/17 4:31 下午 + * @since 2020/11/17 4:31 下午 */ @Slf4j @RestController @Api(tags = "管理端,会员站内信管理接口") -@RequestMapping("/manager/noticeMessage") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/setting/noticeMessage") public class NoticeMessageManagerController { - - private final NoticeMessageService noticeMessageService; + @Autowired + private NoticeMessageService noticeMessageService; @ApiOperation(value = "消息模板分页") @GetMapping @@ -96,11 +95,8 @@ public class NoticeMessageManagerController { if (noticeMessage != null) { noticeMessage.setNoticeContent(noticeContent); noticeMessage.setNoticeTitle(noticeTitle); - boolean result = noticeMessageService.updateById(noticeMessage); - if (result) { - return ResultUtil.data(noticeMessage); - } - return ResultUtil.error(ResultCode.ERROR); + noticeMessageService.updateById(noticeMessage); + return ResultUtil.data(noticeMessage); } throw new ResourceNotFoundException(ResultCode.NOTICE_NOT_EXIST.message()); } @@ -121,12 +117,10 @@ public class NoticeMessageManagerController { if (b) { //赋值执行修改操作 messageTemplate.setNoticeStatus(status); - boolean result = noticeMessageService.updateById(messageTemplate); - if (result) { - return ResultUtil.data(messageTemplate); - } + noticeMessageService.updateById(messageTemplate); + return ResultUtil.data(messageTemplate); } - return ResultUtil.error(ResultCode.ERROR); + throw new ServiceException(ResultCode.NOTICE_ERROR); } throw new ResourceNotFoundException(ResultCode.NOTICE_NOT_EXIST.message()); } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/RegionManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/RegionManagerController.java index dc5a53ce..051eb152 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/RegionManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/RegionManagerController.java @@ -1,16 +1,14 @@ package cn.lili.controller.setting; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.base.service.RegionService; import cn.lili.modules.system.entity.dos.Region; +import cn.lili.modules.system.service.RegionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -21,17 +19,16 @@ import java.util.List; * 管理端,行政地区管理接口 * * @author Chopper - * @date 2020/12/2 10:40 + * @since 2020/12/2 10:40 */ @RestController @Api(tags = "管理端,行政地区管理接口") -@RequestMapping("/manager/region") -@Transactional -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/setting/region") public class RegionManagerController { + @Autowired + private RegionService regionService; - private final RegionService regionService; - + @DemoSite @PostMapping(value = "/sync") @ApiOperation(value = "同步高德行政地区数据") public void synchronizationData(String url) { @@ -57,20 +54,16 @@ public class RegionManagerController { @ApiOperation(value = "更新地区") public ResultMessage update(@PathVariable String id, @Valid Region region) { region.setId(id); - if (regionService.updateById(region)) { - return ResultUtil.data(region); - } - return ResultUtil.error(ResultCode.ERROR); + regionService.updateById(region); + return ResultUtil.data(region); } @PostMapping @ApiOperation(value = "增加地区") public ResultMessage save(@Valid Region region) { - if (regionService.save(region)) { - return ResultUtil.data(region); - } - return ResultUtil.error(ResultCode.ERROR); + regionService.save(region); + return ResultUtil.data(region); } @DeleteMapping(value = "{ids}") @@ -78,6 +71,6 @@ public class RegionManagerController { @ApiOperation(value = "批量通过id删除") public ResultMessage delAllByIds(@PathVariable List ids) { regionService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java index 7d5dc4bf..b7063459 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java @@ -1,16 +1,19 @@ package cn.lili.controller.setting; import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.common.aop.annotation.DemoSite; import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.base.aspect.DemoSite; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.*; import cn.lili.modules.system.entity.dto.connect.QQConnectSetting; import cn.lili.modules.system.entity.dto.connect.WechatConnectSetting; import cn.lili.modules.system.entity.dto.payment.AlipayPaymentSetting; import cn.lili.modules.system.entity.dto.payment.PaymentSupportSetting; +import cn.lili.modules.system.entity.dto.payment.UnionPaymentSetting; import cn.lili.modules.system.entity.dto.payment.WechatPaymentSetting; import cn.lili.modules.system.entity.dto.payment.dto.PaymentSupportForm; import cn.lili.modules.system.entity.enums.SettingEnum; @@ -18,7 +21,6 @@ import cn.lili.modules.system.service.SettingService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -28,15 +30,19 @@ import java.util.Collections; * 管理端,系统设置接口 * * @author Chopper - * @date 2020/11/26 15:53 + * @since 2020/11/26 15:53 */ @RestController @Api(tags = "管理端,系统设置接口") -@RequestMapping("/manager/system/setting") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/setting/setting") public class SettingManagerController { - - private final SettingService settingService; + @Autowired + private SettingService settingService; + /** + * 缓存 + */ + @Autowired + private Cache cache; @DemoSite @@ -47,7 +53,7 @@ public class SettingManagerController { "WECHAT_PC_CONNECT,WECHAT_WAP_CONNECT,WECHAT_APP_CONNECT,WECHAT_MP_CONNECT," + "QQ_WEB_CONNECT,QQ_APP_CONNECT," + "QQ_WEB_CONNECT,QQ_APP_CONNECT,WEIBO_CONNECT,ALIPAY_CONNECT," + - "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT") + "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING,IM") public ResultMessage saveConfig(@PathVariable String key, @RequestBody String configValue) { SettingEnum settingEnum = SettingEnum.valueOf(key); //获取系统配置 @@ -61,9 +67,25 @@ public class SettingManagerController { setting.setSettingValue(configValue); settingService.saveUpdate(setting); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + + @DemoSite + @ApiOperation(value = "查看配置") + @GetMapping(value = "/get/{key}") + @ApiImplicitParam(name = "key", value = "配置key", paramType = "path" + , allowableValues = "BASE_SETTING,EMAIL_SETTING,GOODS_SETTING,KUAIDI_SETTING,ORDER_SETTING,OSS_SETTING,POINT_SETTING," + + "WECHAT_PC_CONNECT,WECHAT_WAP_CONNECT,WECHAT_APP_CONNECT,WECHAT_MP_CONNECT," + + "QQ_WEB_CONNECT,QQ_APP_CONNECT," + + "QQ_WEB_CONNECT,QQ_APP_CONNECT,WEIBO_CONNECT,ALIPAY_CONNECT," + + "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING,IM" + ) + public ResultMessage settingGet(@PathVariable String key) { + return createSetting(key); + } + + /** * 对配置进行过滤 * @@ -84,26 +106,6 @@ public class SettingManagerController { return configValue; } - - @DemoSite - @ApiOperation(value = "查看配置") - @GetMapping(value = "/get/{key}") - @ApiImplicitParam(name = "key", value = "配置key", paramType = "path" - , allowableValues = "BASE_SETTING,EMAIL_SETTING,GOODS_SETTING,KUAIDI_SETTING,ORDER_SETTING,OSS_SETTING,POINT_SETTING," + - "WECHAT_PC_CONNECT,WECHAT_WAP_CONNECT,WECHAT_APP_CONNECT,WECHAT_MP_CONNECT," + - "QQ_WEB_CONNECT,QQ_APP_CONNECT," + - "QQ_WEB_CONNECT,QQ_APP_CONNECT,WEIBO_CONNECT,ALIPAY_CONNECT," + - "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT" - ) - public ResultMessage settingGet(@PathVariable String key) { - try { - return createSetting(key); - } catch (Exception e) { - e.printStackTrace(); - return ResultUtil.error(ResultCode.ERROR); - } - } - /** * 获取表单 * 这里主要包含一个配置对象为空,导致转换异常问题的处理,解决配置项增加减少,带来的系统异常,无法直接配置 @@ -115,14 +117,13 @@ public class SettingManagerController { */ private ResultMessage createSetting(String key) { SettingEnum settingEnum = SettingEnum.valueOf(key); - + cache.remove(key); Setting setting = settingService.get(key); switch (settingEnum) { case BASE_SETTING: return setting == null ? ResultUtil.data(new BaseSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), BaseSetting.class)); - case WITHDRAWAL_SETTING: return setting == null ? ResultUtil.data(new WithdrawalSetting()) : @@ -131,7 +132,6 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new DistributionSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class)); - case EMAIL_SETTING: return setting == null ? ResultUtil.data(new EmailSetting()) : @@ -140,56 +140,68 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new GoodsSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), GoodsSetting.class)); - case KUAIDI_SETTING: + case LOGISTICS_SETTING: return setting == null ? - ResultUtil.data(new KuaidiSetting()) : - ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), KuaidiSetting.class)); + ResultUtil.data(new LogisticsSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), LogisticsSetting.class)); case ORDER_SETTING: return setting == null ? ResultUtil.data(new OrderSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class)); - case OSS_SETTING: return setting == null ? ResultUtil.data(new OssSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), OssSetting.class)); - case SMS_SETTING: return setting == null ? ResultUtil.data(new SmsSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), SmsSetting.class)); - case POINT_SETTING: return setting == null ? ResultUtil.data(new PointSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), PointSetting.class)); - case QQ_CONNECT: return setting == null ? ResultUtil.data(new QQConnectSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), QQConnectSetting.class)); - case PAYMENT_SUPPORT: return setting == null ? ResultUtil.data(new PaymentSupportSetting(new PaymentSupportForm())) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), PaymentSupportSetting.class)); - case ALIPAY_PAYMENT: return setting == null ? ResultUtil.data(new AlipayPaymentSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), AlipayPaymentSetting.class)); - + case UNIONPAY_PAYMENT: + return setting == null ? + ResultUtil.data(new UnionPaymentSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), UnionPaymentSetting.class)); case WECHAT_CONNECT: return setting == null ? ResultUtil.data(new WechatConnectSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class)); - case WECHAT_PAYMENT: return setting == null ? ResultUtil.data(new WechatPaymentSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), WechatPaymentSetting.class)); + case SECKILL_SETTING: + return setting == null ? + ResultUtil.data(new SeckillSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), SeckillSetting.class)); + case EXPERIENCE_SETTING: + return setting == null ? + ResultUtil.data(new ExperienceSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ExperienceSetting.class)); + case IM_SETTING: + return setting == null ? + ResultUtil.data(new ImSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ImSetting.class)); + case HOT_WORDS: + return setting == null ? + ResultUtil.data(new HotWordsSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), HotWordsSetting.class)); default: - return ResultUtil.error(ResultCode.SETTING_NOT_TO_SET); + throw new ServiceException(ResultCode.SETTING_NOT_TO_SET); } } } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SettingXManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/SettingXManagerController.java index 988f24d9..ab5a1337 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SettingXManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/SettingXManagerController.java @@ -1,12 +1,10 @@ package cn.lili.controller.setting; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.system.entity.dto.payment.dto.PaymentSupportForm; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -16,12 +14,11 @@ import org.springframework.web.bind.annotation.RestController; * 对一些系统设置的支持,例如动态表单等 * * @author Chopper - * @date 2020/11/26 15:53 + * @since 2020/11/26 15:53 */ @RestController @Api(tags = "管理端,系统设置扩展接口") -@RequestMapping("/manager/system/settingx") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/setting/settingx") public class SettingXManagerController { @ApiOperation(value = "支持支付方式表单") diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SmsManagerController.java b/manager-api/src/main/java/cn/lili/controller/sms/SmsManagerController.java similarity index 72% rename from manager-api/src/main/java/cn/lili/controller/setting/SmsManagerController.java rename to manager-api/src/main/java/cn/lili/controller/sms/SmsManagerController.java index 7ef4e3ef..70026cf7 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SmsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/sms/SmsManagerController.java @@ -1,17 +1,15 @@ -package cn.lili.controller.setting; +package cn.lili.controller.sms; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.message.entity.dos.SmsReach; -import cn.lili.modules.message.service.SmsReachService; +import cn.lili.modules.sms.entity.dos.SmsReach; +import cn.lili.modules.sms.service.SmsReachService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,21 +19,20 @@ import java.util.List; * 管理端,短信接口 * * @author Bulbasaur - * @date: 2021/1/30 4:09 下午 + * @since 2021/1/30 4:09 下午 */ @RestController @Api(tags = "管理端,短信接口") -@RequestMapping("/manager/sms") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/sms/sms") public class SmsManagerController { - - private final SmsReachService smsReachService; + @Autowired + private SmsReachService smsReachService; @ApiOperation(value = "接口批量发送短信") @PostMapping public ResultMessage sendBatchSms(SmsReach smsReach, @RequestParam(value = "mobile") List mobile) { smsReachService.addSmsReach(smsReach,mobile); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "查询短信任务分页") diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SmsSignManagerController.java b/manager-api/src/main/java/cn/lili/controller/sms/SmsSignManagerController.java similarity index 77% rename from manager-api/src/main/java/cn/lili/controller/setting/SmsSignManagerController.java rename to manager-api/src/main/java/cn/lili/controller/sms/SmsSignManagerController.java index 2b866701..de3244f7 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SmsSignManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/sms/SmsSignManagerController.java @@ -1,16 +1,14 @@ -package cn.lili.controller.setting; +package cn.lili.controller.sms; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.message.entity.dos.SmsSign; -import cn.lili.modules.message.service.SmsSignService; +import cn.lili.modules.sms.entity.dos.SmsSign; +import cn.lili.modules.sms.service.SmsSignService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,21 +18,21 @@ import javax.validation.Valid; * 管理端,短信签名接口 * * @author Chopper - * @date: 2021/1/30 4:09 下午 + * @since 2021/1/30 4:09 下午 */ @RestController @Api(tags = "管理端,短信签名接口") @RequestMapping("/manager/sms/sign") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SmsSignManagerController { - private final SmsSignService smsSignService; + @Autowired + private SmsSignService smsSignService; @ApiOperation(value = "新增短信签名") @PostMapping public ResultMessage save(@Valid SmsSign smsSign) { smsSignService.addSmsSign(smsSign); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "删除短信签名") @@ -42,7 +40,7 @@ public class SmsSignManagerController { @ApiImplicitParam(name = "id", value = "短信签名id", required = true, dataType = "String", allowMultiple = true, paramType = "path") public ResultMessage delete(@PathVariable String id) { smsSignService.deleteSmsSign(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @@ -57,14 +55,14 @@ public class SmsSignManagerController { @PutMapping("/querySmsSign") public ResultMessage querySmsSign() { smsSignService.querySmsSign(); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "修改短信签名") @PutMapping("/modifySmsSign") public ResultMessage modifySmsSign(@Valid SmsSign smsSign) { smsSignService.modifySmsSign(smsSign); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "查询短信签名分页") diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SmsTemplateManagerController.java b/manager-api/src/main/java/cn/lili/controller/sms/SmsTemplateManagerController.java similarity index 64% rename from manager-api/src/main/java/cn/lili/controller/setting/SmsTemplateManagerController.java rename to manager-api/src/main/java/cn/lili/controller/sms/SmsTemplateManagerController.java index 5dec0463..9b9aa0e5 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SmsTemplateManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/sms/SmsTemplateManagerController.java @@ -1,16 +1,15 @@ -package cn.lili.controller.setting; +package cn.lili.controller.sms; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.message.entity.dos.SmsTemplate; -import cn.lili.modules.message.service.SmsTemplateService; +import cn.lili.modules.sms.entity.dos.SmsTemplate; +import cn.lili.modules.sms.service.SmsTemplateService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,42 +19,46 @@ import javax.validation.Valid; * 管理端,短信模板接口 * * @author Bulbasaur - * @date: 2021/1/30 4:09 下午 + * @since 2021/1/30 4:09 下午 */ @RestController @Api(tags = "管理端,短信模板接口") @RequestMapping("/manager/sms/template") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SmsTemplateManagerController { - private final SmsTemplateService smsTemplateService; + @Autowired + private SmsTemplateService smsTemplateService; @ApiOperation(value = "新增短信模板") @PostMapping + @DemoSite public ResultMessage save(@Valid SmsTemplate smsTemplate) { smsTemplateService.addSmsTemplate(smsTemplate); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "删除短信模板") - @ApiImplicitParam(name = "id", value = "短信模板ID", required = true, paramType = "path") - @DeleteMapping("/{id}") - public ResultMessage delete(@PathVariable("id") String id) { - smsTemplateService.deleteSmsTemplate(id); - return ResultUtil.success(ResultCode.SUCCESS); + @ApiImplicitParam(name = "templateCode", value = "短信模板CODE", required = true, paramType = "query") + @DeleteMapping + @DemoSite + public ResultMessage delete(String templateCode) { + smsTemplateService.deleteSmsTemplate(templateCode); + return ResultUtil.success(); } @ApiOperation(value = "查询短信模板状态") @PutMapping("/querySmsSign") + @DemoSite public ResultMessage querySmsSign() { smsTemplateService.querySmsTemplate(); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "修改短信模板") @PutMapping("/modifySmsTemplate") + @DemoSite public ResultMessage modifySmsTemplate(@Valid SmsTemplate smsTemplate) { smsTemplateService.modifySmsTemplate(smsTemplate); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "查询短信模板分页") diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java index f34809d0..7849998c 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java @@ -1,14 +1,13 @@ package cn.lili.controller.statistics; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.dto.GoodsStatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.CategoryStatisticsDataVO; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import cn.lili.modules.statistics.service.GoodsStatisticsDataService; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.CategoryStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.GoodsStatisticsDataVO; +import cn.lili.modules.statistics.service.StoreFlowStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,30 +19,24 @@ import java.util.List; * 管理端,商品统计接口 * * @author Bulbasaur - * @date: 2020/12/9 19:04 + * @since 2020/12/9 19:04 */ -@Api(tags = "管理端,商品统计接口") +@Api(tags = "管理端,商品流水统计接口") @RestController @RequestMapping("/manager/statistics/goods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsStatisticsManagerController { - - private final GoodsStatisticsDataService goodsStatisticsDataService; + @Autowired + private StoreFlowStatisticsService storeFlowStatisticsService; @ApiOperation(value = "获取统计列表,排行前一百的数据") @GetMapping public ResultMessage> getByPage(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { - try { - return ResultUtil.data(goodsStatisticsDataService.getGoodsStatisticsData(goodsStatisticsQueryParam, 100)); - } catch (Exception e) { - e.printStackTrace(); - } - return null; + return ResultUtil.data(storeFlowStatisticsService.getGoodsStatisticsData(goodsStatisticsQueryParam, 100)); } @ApiOperation(value = "获取行业统计列表") @GetMapping("/getCategoryByPage") public ResultMessage> getCategoryByPage(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { - return ResultUtil.data(goodsStatisticsDataService.getCategoryStatisticsData(goodsStatisticsQueryParam)); + return ResultUtil.data(storeFlowStatisticsService.getCategoryStatisticsData(goodsStatisticsQueryParam)); } } diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java index d60b83d9..9647b8d1 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java @@ -1,15 +1,19 @@ package cn.lili.controller.statistics; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import cn.lili.modules.statistics.model.vo.IndexNoticeVO; -import cn.lili.modules.statistics.model.vo.IndexStatisticsVO; -import cn.lili.modules.statistics.model.vo.StoreStatisticsDataVO; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.enums.StatisticsQuery; +import cn.lili.modules.statistics.entity.vo.GoodsStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.IndexNoticeVO; +import cn.lili.modules.statistics.entity.vo.IndexStatisticsVO; +import cn.lili.modules.statistics.entity.vo.StoreStatisticsDataVO; import cn.lili.modules.statistics.service.IndexStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,40 +25,45 @@ import java.util.List; * 管理端,首页统计数据接口 * * @author Bulbasaur - * @date: 2020/12/15 17:53 + * @since 2020/12/15 17:53 */ +@Slf4j @Api(tags = "管理端,首页统计数据接口") @RestController @RequestMapping("/manager/statistics/index") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class IndexStatisticsManagerController { /** * 首页统计 */ - private final IndexStatisticsService indexStatisticsService; + @Autowired + private IndexStatisticsService indexStatisticsService; @ApiOperation(value = "获取首页查询数据") @GetMapping + @PreventDuplicateSubmissions public ResultMessage index() { try { return ResultUtil.data(indexStatisticsService.indexStatistics()); } catch (Exception e) { - e.printStackTrace(); + log.error("获取首页查询数据错误",e); } return null; } @ApiOperation(value = "获取首页查询热卖商品TOP10") @GetMapping("/goodsStatistics") - public ResultMessage> goodsStatistics() { - return ResultUtil.data(indexStatisticsService.goodsStatisticsOfMonth()); + public ResultMessage> goodsStatistics(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { + + //按照金额查询 + goodsStatisticsQueryParam.setType(StatisticsQuery.PRICE.name()); + return ResultUtil.data(indexStatisticsService.goodsStatistics(goodsStatisticsQueryParam)); } @ApiOperation(value = "获取首页查询热卖店铺TOP10") @GetMapping("/storeStatistics") - public ResultMessage> storeStatistics() { - return ResultUtil.data(indexStatisticsService.storeStatisticsOfMonth()); + public ResultMessage> storeStatistics(StatisticsQueryParam statisticsQueryParam) { + return ResultUtil.data(indexStatisticsService.storeStatistics(statisticsQueryParam)); } @ApiOperation(value = "通知提示信息") diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/MemberStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/MemberStatisticsManagerController.java index 78de296b..30aed609 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/MemberStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/MemberStatisticsManagerController.java @@ -1,13 +1,12 @@ package cn.lili.controller.statistics; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.dos.MemberStatisticsData; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.service.MemberStatisticsDataService; +import cn.lili.modules.statistics.entity.dos.MemberStatisticsData; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.service.MemberStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -19,19 +18,18 @@ import java.util.List; * 管理端,会员统计接口 * * @author Bulbasaur - * @date: 2020/12/9 19:04 + * @since 2020/12/9 19:04 */ @Api(tags = "管理端,会员统计接口") @RestController @RequestMapping("/manager/statistics/member") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MemberStatisticsManagerController { - - private final MemberStatisticsDataService memberStatisticsDataService; + @Autowired + private MemberStatisticsService memberStatisticsService; @ApiOperation(value = "获取会员统计") @GetMapping public ResultMessage> getByList(StatisticsQueryParam statisticsQueryParam) { - return ResultUtil.data(memberStatisticsDataService.statistics(statisticsQueryParam)); + return ResultUtil.data(memberStatisticsService.statistics(statisticsQueryParam)); } } diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java index a189ba53..f307ca03 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java @@ -1,20 +1,19 @@ package cn.lili.controller.statistics; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; -import cn.lili.modules.order.order.service.AfterSaleService; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.OrderOverviewVO; -import cn.lili.modules.statistics.model.vo.OrderStatisticsDataVO; -import cn.lili.modules.statistics.service.OrderStatisticsDataService; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.OrderOverviewVO; +import cn.lili.modules.statistics.entity.vo.OrderStatisticsDataVO; +import cn.lili.modules.statistics.service.AfterSaleStatisticsService; +import cn.lili.modules.statistics.service.OrderStatisticsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,27 +25,25 @@ import java.util.List; * 管理端,订单统计接口 * * @author Bulbasaur - * @date: 2020/12/9 19:04 + * @since 2020/12/9 19:04 */ +@Slf4j @Api(tags = "管理端,订单统计接口") @RestController @RequestMapping("/manager/statistics/order") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderStatisticsManagerController { - - private final OrderStatisticsDataService orderStatisticsDataService; - - private final OrderService orderService; - - private final AfterSaleService afterSaleService; + @Autowired + private OrderStatisticsService orderStatisticsService; + @Autowired + private AfterSaleStatisticsService afterSaleStatisticsService; @ApiOperation(value = "订单概览统计") @GetMapping("/overview") public ResultMessage overview(StatisticsQueryParam statisticsQueryParam) { try { - return ResultUtil.data(orderStatisticsDataService.overview(statisticsQueryParam)); + return ResultUtil.data(orderStatisticsService.overview(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单概览统计错误",e); } return null; } @@ -55,9 +52,9 @@ public class OrderStatisticsManagerController { @GetMapping public ResultMessage> statisticsChart(StatisticsQueryParam statisticsQueryParam) { try { - return ResultUtil.data(orderStatisticsDataService.statisticsChart(statisticsQueryParam)); + return ResultUtil.data(orderStatisticsService.statisticsChart(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单图表统计",e); } return null; } @@ -67,9 +64,9 @@ public class OrderStatisticsManagerController { @GetMapping("/order") public ResultMessage> order(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { try { - return ResultUtil.data(orderService.getStatistics(statisticsQueryParam, pageVO)); + return ResultUtil.data(orderStatisticsService.getStatistics(statisticsQueryParam, pageVO)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单统计",e); } return null; } @@ -78,6 +75,6 @@ public class OrderStatisticsManagerController { @ApiOperation(value = "退单统计") @GetMapping("/refund") public ResultMessage> refund(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { - return ResultUtil.data(afterSaleService.getStatistics(statisticsQueryParam, pageVO)); + return ResultUtil.data(afterSaleStatisticsService.getStatistics(statisticsQueryParam, pageVO)); } } diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsManagerController.java index a3752cee..b5dadeb2 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsManagerController.java @@ -1,15 +1,14 @@ package cn.lili.controller.statistics; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.RefundOrderStatisticsDataVO; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.RefundOrderStatisticsDataVO; import cn.lili.modules.statistics.service.RefundOrderStatisticsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -19,15 +18,14 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,退款统计接口 * * @author Bulbasaur - * @date: 2020/12/9 19:04 + * @since 2020/12/9 19:04 */ @Api(tags = "管理端,退款统计接口") @RestController -@RequestMapping("/manager/statistics/refund/order") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/statistics/refundOrder") public class RefundOrderStatisticsManagerController { - - private final RefundOrderStatisticsService refundOrderStatisticsService; + @Autowired + private RefundOrderStatisticsService refundOrderStatisticsService; @ApiOperation(value = "获取退款统计列表") @GetMapping("/getByPage") diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsManagerController.java index 46e512af..01ffd699 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsManagerController.java @@ -1,15 +1,14 @@ package cn.lili.controller.statistics; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.vo.MemberDistributionVO; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.OnlineMemberVO; -import cn.lili.modules.statistics.model.vo.PlatformViewVO; -import cn.lili.modules.statistics.service.PlatformViewDataService; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.OnlineMemberVO; +import cn.lili.modules.statistics.entity.vo.PlatformViewVO; +import cn.lili.modules.statistics.service.PlatformViewService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,39 +20,38 @@ import java.util.List; * 管理端,流量统计接口 * * @author Chopper - * @date 2021/2/9 11:19 + * @since 2021/2/9 11:19 */ @Api(tags = "管理端,流量统计接口") @RestController @RequestMapping("/manager/statistics/view") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ViewStatisticsManagerController { - - private final PlatformViewDataService platformViewDataService; + @Autowired + private PlatformViewService platformViewService; @ApiOperation(value = "流量数据 表单获取") @GetMapping("/list") public ResultMessage> getByPage(StatisticsQueryParam queryParam) { - return ResultUtil.data(platformViewDataService.list(queryParam)); + return ResultUtil.data(platformViewService.list(queryParam)); } @ApiOperation(value = "当前在线人数") @GetMapping("/online/current") public ResultMessage currentNumberPeopleOnline() { - return ResultUtil.data(platformViewDataService.online()); + return ResultUtil.data(platformViewService.online()); } @ApiOperation(value = "会员分布") @GetMapping("/online/distribution") public ResultMessage> memberDistribution() { - return ResultUtil.data(platformViewDataService.memberDistribution()); + return ResultUtil.data(platformViewService.memberDistribution()); } @ApiOperation(value = "在线人数历史(默认48小时)") @GetMapping("/online/history") public ResultMessage> history() { - return ResultUtil.data(platformViewDataService.statisticsOnline()); + return ResultUtil.data(platformViewService.statisticsOnline()); } } diff --git a/manager-api/src/main/java/cn/lili/controller/store/BillManagerController.java b/manager-api/src/main/java/cn/lili/controller/store/BillManagerController.java index 8b429536..4fbe985a 100644 --- a/manager-api/src/main/java/cn/lili/controller/store/BillManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/store/BillManagerController.java @@ -1,10 +1,10 @@ package cn.lili.controller.store; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.order.order.service.StoreFlowService; import cn.lili.modules.store.entity.dos.Bill; import cn.lili.modules.store.entity.dto.BillSearchParams; import cn.lili.modules.store.entity.vos.BillListVO; @@ -14,7 +14,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -24,15 +23,17 @@ import javax.validation.constraints.NotNull; * 管理端,商家结算单接口 * * @author Chopper - * @date: 2020/11/17 7:23 下午 + * @since 2020/11/17 7:23 下午 */ @RestController @Api(tags = "管理端,商家结算单接口") -@RequestMapping("/manager/store/bill") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/order/bill") public class BillManagerController { + @Autowired + private BillService billService; - private final BillService billService; + @Autowired + private StoreFlowService storeFlowService; @ApiOperation(value = "通过id获取结算单") @ApiImplicitParam(name = "id", value = "结算单ID", required = true, paramType = "path") @@ -54,17 +55,15 @@ public class BillManagerController { }) @GetMapping(value = "/{id}/getStoreFlow") public ResultMessage> getStoreFlow(@PathVariable String id, String flowType, PageVO pageVO) { - return ResultUtil.data(billService.getStoreFlow(id, flowType, pageVO)); + return ResultUtil.data(storeFlowService.getStoreFlow(id, flowType, pageVO)); } @ApiOperation(value = "支付结算单") @ApiImplicitParam(name = "id", value = "结算单ID", required = true, paramType = "path") @PutMapping(value = "/pay/{id}") public ResultMessage pay(@PathVariable String id) { - if (billService.complete(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + billService.complete(id); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java b/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java index 886441a6..5417c94f 100644 --- a/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java @@ -1,14 +1,14 @@ package cn.lili.controller.store; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.goods.entity.vos.CategoryVO; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dto.AdminStoreApplyDTO; import cn.lili.modules.store.entity.dto.StoreEditDTO; import cn.lili.modules.store.entity.vos.StoreDetailVO; +import cn.lili.modules.store.entity.vos.StoreManagementCategoryVO; import cn.lili.modules.store.entity.vos.StoreSearchParams; import cn.lili.modules.store.entity.vos.StoreVO; import cn.lili.modules.store.service.StoreDetailService; @@ -19,7 +19,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -30,26 +29,27 @@ import java.util.List; * 管理端,店铺管理接口 * * @author Bulbasaur - * @date: 2020/12/6 16:09 + * @since 2020/12/6 16:09 */ @Api(tags = "管理端,店铺管理接口") @RestController -@RequestMapping("/manager/store") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/store/store") public class StoreManagerController { /** * 店铺 */ - private final StoreService storeService; + @Autowired + private StoreService storeService; /** * 店铺详情 */ - private final StoreDetailService storeDetailService; + @Autowired + private StoreDetailService storeDetailService; @ApiOperation(value = "获取店铺分页列表") @GetMapping("/all") - public ResultMessage> getALL() { + public ResultMessage> getAll() { return ResultUtil.data(storeService.list(new QueryWrapper().eq("store_disable", "OPEN"))); } @@ -63,6 +63,7 @@ public class StoreManagerController { @ApiImplicitParam(name = "storeId", value = "店铺ID", required = true, paramType = "path", dataType = "String") @GetMapping(value = "/get/detail/{storeId}") public ResultMessage detail(@PathVariable String storeId) { + // todo 对于刚提交审核的信息需要等待缓存失效后才能操作,否则缓存信息还在 return ResultUtil.data(storeDetailService.getStoreDetailVO(storeId)); } @@ -88,33 +89,31 @@ public class StoreManagerController { @PutMapping(value = "/audit/{id}/{passed}") public ResultMessage audit(@PathVariable String id, @PathVariable Integer passed) { storeService.audit(id, passed); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + + @DemoSite @ApiOperation(value = "关闭店铺") @ApiImplicitParam(name = "id", value = "店铺id", required = true, dataType = "String", paramType = "path") @PutMapping(value = "/disable/{id}") public ResultMessage disable(@PathVariable String id) { - if (storeService.disable(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + storeService.disable(id); + return ResultUtil.success(); } @ApiOperation(value = "开启店铺") @ApiImplicitParam(name = "id", value = "店铺id", required = true, dataType = "String", paramType = "path") @PutMapping(value = "/enable/{id}") public ResultMessage enable(@PathVariable String id) { - if (storeService.enable(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + storeService.enable(id); + return ResultUtil.success(); } @ApiOperation(value = "查询一级分类列表") @ApiImplicitParam(name = "storeId", value = "店铺id", required = true, dataType = "String", paramType = "path") - @GetMapping(value = "/ManagementCategory/{storeId}") - public ResultMessage> firstCategory(String storeId) { + @GetMapping(value = "/managementCategory/{storeId}") + public ResultMessage> firstCategory(@PathVariable String storeId) { return ResultUtil.data(this.storeDetailService.goodsManagementCategory(storeId)); } @@ -128,4 +127,11 @@ public class StoreManagerController { } return ResultUtil.data(null); } + + @ApiOperation(value = "将所有店铺导入店员表") + @PostMapping("store/to/clerk") + public ResultMessage storeToClerk(){ + this.storeService.storeToClerk(); + return ResultUtil.success(); + } } diff --git a/manager-api/src/main/java/cn/lili/controller/store/StoreMessageManagerController.java b/manager-api/src/main/java/cn/lili/controller/store/StoreMessageManagerController.java index 65a2da32..c1241e7e 100644 --- a/manager-api/src/main/java/cn/lili/controller/store/StoreMessageManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/store/StoreMessageManagerController.java @@ -1,6 +1,6 @@ package cn.lili.controller.store; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.message.entity.dos.StoreMessage; @@ -9,9 +9,7 @@ import cn.lili.modules.message.service.StoreMessageService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,17 +19,15 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,店铺消息消息管理接口 * * @author pikachu - * @date: 2020/12/6 16:09 + * @since 2020/12/6 16:09 */ -@Transactional @RestController @Api(tags = "管理端,店铺消息消息管理接口") -@RequestMapping("/manager/message/store") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/other/storeMessage") public class StoreMessageManagerController { - private final StoreMessageService storeMessageService; - + @Autowired + private StoreMessageService storeMessageService; @GetMapping @ApiOperation(value = "多条件分页获取") diff --git a/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleManagerController.java b/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleManagerController.java deleted file mode 100644 index 4ba3bf05..00000000 --- a/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleManagerController.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.lili.controller.trade; - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.order.entity.dos.AfterSale; -import cn.lili.modules.order.order.entity.vo.AfterSaleSearchParams; -import cn.lili.modules.order.order.entity.vo.AfterSaleVO; -import cn.lili.modules.order.order.service.AfterSaleService; -import cn.lili.modules.system.entity.vo.Traces; -import com.baomidou.mybatisplus.core.metadata.IPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.NotNull; - -/** - * 管理端,售后接口 - * - * @author Bulbasaur - * @date: 2021/1/6 14:11 - */ -@RestController -@RequestMapping("/manager/afterSale") -@Api(tags = "管理端,售后接口") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class AfterSaleManagerController { - - /** - * 售后 - */ - private final AfterSaleService afterSaleService; - - @ApiOperation(value = "分页获取售后服务") - @GetMapping(value = "/page") - public ResultMessage> getByPage(AfterSaleSearchParams searchParams) { - return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams)); - } - - @ApiOperation(value = "查看售后服务详情") - @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") - @GetMapping(value = "/get/{sn}") - public ResultMessage get(@NotNull(message = "售后单号") @PathVariable("sn") String sn) { - return ResultUtil.data(afterSaleService.getAfterSale(sn)); - } - - @ApiOperation(value = "查看买家退货物流踪迹") - @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") - @GetMapping(value = "/getDeliveryTraces/{sn}") - public ResultMessage getDeliveryTraces(@PathVariable String sn) { - return ResultUtil.data(afterSaleService.deliveryTraces(sn)); - } - - @ApiOperation(value = "售后线下退款") - @ApiImplicitParams({ - @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, paramType = "path"), - @ApiImplicitParam(name = "remark", value = "备注", paramType = "query") - }) - @PutMapping(value = "/refund/{afterSaleSn}") - public ResultMessage refund(@NotNull(message = "请选择售后单") @PathVariable String afterSaleSn, - @RequestParam String remark) { - - return ResultUtil.data(afterSaleService.refund(afterSaleSn, remark)); - } - -} diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberWalletManagerController.java b/manager-api/src/main/java/cn/lili/controller/wallet/MemberWalletManagerController.java similarity index 69% rename from manager-api/src/main/java/cn/lili/controller/member/MemberWalletManagerController.java rename to manager-api/src/main/java/cn/lili/controller/wallet/MemberWalletManagerController.java index c57b6c8f..9b232f4c 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberWalletManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/wallet/MemberWalletManagerController.java @@ -1,13 +1,12 @@ -package cn.lili.controller.member; +package cn.lili.controller.wallet; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.member.entity.vo.MemberWalletVO; -import cn.lili.modules.member.service.MemberWalletService; +import cn.lili.modules.wallet.entity.vo.MemberWalletVO; +import cn.lili.modules.wallet.service.MemberWalletService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -18,15 +17,14 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,预存款接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "管理端,预存款接口") -@RequestMapping("/manager/members/wallet") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/wallet/wallet") public class MemberWalletManagerController { - - private final MemberWalletService memberWalletService; + @Autowired + private MemberWalletService memberWalletService; @GetMapping @ApiOperation(value = "查询会员预存款余额") diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberWithdrawApplyManagerController.java b/manager-api/src/main/java/cn/lili/controller/wallet/MemberWithdrawApplyManagerController.java similarity index 54% rename from manager-api/src/main/java/cn/lili/controller/member/MemberWithdrawApplyManagerController.java rename to manager-api/src/main/java/cn/lili/controller/wallet/MemberWithdrawApplyManagerController.java index 8bcb2372..c97ca7de 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberWithdrawApplyManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/wallet/MemberWithdrawApplyManagerController.java @@ -1,52 +1,53 @@ -package cn.lili.controller.member; +package cn.lili.controller.wallet; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.member.entity.dos.MemberWithdrawApply; -import cn.lili.modules.member.entity.vo.MemberWithdrawApplyQueryVO; -import cn.lili.modules.member.service.MemberWithdrawApplyService; +import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply; +import cn.lili.modules.wallet.entity.vo.MemberWithdrawApplyQueryVO; +import cn.lili.modules.wallet.service.MemberWithdrawApplyService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 管理端,余额提现记录接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "管理端,余额提现记录接口") -@RequestMapping("/manager/members/withdraw-apply") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/wallet/withdrawApply") public class MemberWithdrawApplyManagerController { - - private final MemberWithdrawApplyService memberWithdrawApplyService; + @Autowired + private MemberWithdrawApplyService memberWithdrawApplyService; @ApiOperation(value = "分页获取提现记录") @GetMapping public ResultMessage> getByPage(PageVO page, MemberWithdrawApplyQueryVO memberWithdrawApplyQueryVO) { //构建查询 返回数据 - IPage memberWithdrawApplyIPage = memberWithdrawApplyService.getMemberWithdrawPage(page, memberWithdrawApplyQueryVO); - return ResultUtil.data(memberWithdrawApplyIPage); + IPage memberWithdrawApplyPage = memberWithdrawApplyService.getMemberWithdrawPage(page, memberWithdrawApplyQueryVO); + return ResultUtil.data(memberWithdrawApplyPage); } + @PreventDuplicateSubmissions @ApiOperation(value = "提现申请审核") @PostMapping @ApiImplicitParams({ - @ApiImplicitParam(name = "apply_id", value = "审核记录id", required = true, paramType = "query"), + @ApiImplicitParam(name = "applyId", value = "审核记录id", required = true, paramType = "query"), @ApiImplicitParam(name = "result", value = "审核结果", required = true, paramType = "query", dataType = "boolean"), @ApiImplicitParam(name = "remark", value = "审核备注", paramType = "query") }) diff --git a/manager-api/src/main/java/cn/lili/controller/trade/RechargeManagerController.java b/manager-api/src/main/java/cn/lili/controller/wallet/RechargeManagerController.java similarity index 60% rename from manager-api/src/main/java/cn/lili/controller/trade/RechargeManagerController.java rename to manager-api/src/main/java/cn/lili/controller/wallet/RechargeManagerController.java index 28300ed3..bd624193 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/RechargeManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/wallet/RechargeManagerController.java @@ -1,34 +1,32 @@ -package cn.lili.controller.trade; +package cn.lili.controller.wallet; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.trade.entity.dos.Recharge; import cn.lili.modules.order.trade.entity.vo.RechargeQueryVO; -import cn.lili.modules.order.trade.service.RechargeService; +import cn.lili.modules.wallet.entity.dos.Recharge; +import cn.lili.modules.wallet.service.RechargeService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 管理端,预存款充值记录接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "管理端,预存款充值记录接口") -@RequestMapping("/manager/recharge") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/wallet/recharge") public class RechargeManagerController { - - private final RechargeService rechargeService; + @Autowired + private RechargeService rechargeService; @ApiOperation(value = "分页获取预存款充值记录") @GetMapping diff --git a/manager-api/src/main/java/cn/lili/controller/trade/WalletLogManagerController.java b/manager-api/src/main/java/cn/lili/controller/wallet/WalletLogManagerController.java similarity index 69% rename from manager-api/src/main/java/cn/lili/controller/trade/WalletLogManagerController.java rename to manager-api/src/main/java/cn/lili/controller/wallet/WalletLogManagerController.java index fb257d72..ab3901fb 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/WalletLogManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/wallet/WalletLogManagerController.java @@ -1,17 +1,15 @@ -package cn.lili.controller.trade; +package cn.lili.controller.wallet; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.trade.entity.dos.WalletLog; import cn.lili.modules.order.trade.entity.vo.DepositQueryVO; -import cn.lili.modules.order.trade.service.WalletLogService; +import cn.lili.modules.wallet.entity.dos.WalletLog; +import cn.lili.modules.wallet.service.WalletLogService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,16 +18,14 @@ import org.springframework.web.bind.annotation.RestController; * 管理端,预存款充值记录接口 * * @author pikachu - * @date: 2020/11/16 10:07 下午 + * @since 2020/11/16 10:07 下午 */ @RestController @Api(tags = "管理端,预存款充值记录接口") @RequestMapping("/manager/wallet/log") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class WalletLogManagerController { - - private final WalletLogService walletLogService; + @Autowired + private WalletLogService walletLogService; @ApiOperation(value = "分页获取预存款充值记录") @GetMapping diff --git a/manager-api/src/main/java/cn/lili/controller/setting/WechatMPMessageManagerController.java b/manager-api/src/main/java/cn/lili/controller/wechat/WechatMPMessageManagerController.java similarity index 64% rename from manager-api/src/main/java/cn/lili/controller/setting/WechatMPMessageManagerController.java rename to manager-api/src/main/java/cn/lili/controller/wechat/WechatMPMessageManagerController.java index 3c77d3c7..2310bfdc 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/WechatMPMessageManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/wechat/WechatMPMessageManagerController.java @@ -1,19 +1,17 @@ -package cn.lili.controller.setting; +package cn.lili.controller.wechat; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; -import cn.lili.modules.message.entity.dos.WechatMPMessage; -import cn.lili.modules.message.service.WechatMPMessageService; +import cn.lili.modules.wechat.entity.dos.WechatMPMessage; +import cn.lili.modules.wechat.service.WechatMPMessageService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -24,19 +22,19 @@ import java.util.List; */ @RestController @Api(tags = "微信小程序消息订阅接口") -@RequestMapping("/manager/message/wechatMPMessage") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/wechat/wechatMPMessage") public class WechatMPMessageManagerController { + @Autowired + private WechatMPMessageService wechatMPMessageService; - private final WechatMPMessageService wechatMPMessageService; - + @DemoSite @GetMapping(value = "/init") @ApiOperation(value = "初始化微信小程序消息订阅") public ResultMessage init() { wechatMPMessageService.init(); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + @GetMapping(value = "/{id}") @ApiOperation(value = "查看微信小程序消息订阅详情") public ResultMessage get(@PathVariable String id) { @@ -54,30 +52,29 @@ public class WechatMPMessageManagerController { return new ResultUtil>().setData(data); } + @DemoSite @PostMapping @ApiOperation(value = "新增微信小程序消息订阅") public ResultMessage save(WechatMPMessage wechatMPMessage) { - if (wechatMPMessageService.save(wechatMPMessage)) { - return new ResultUtil().setData(wechatMPMessage); - } - return new ResultUtil().setErrorMsg(ResultCode.ERROR); + wechatMPMessageService.save(wechatMPMessage); + return new ResultUtil().setData(wechatMPMessage); } + @DemoSite @PutMapping("/{id}") @ApiOperation(value = "更新微信小程序消息订阅") public ResultMessage update(@PathVariable String id, WechatMPMessage wechatMPMessage) { - if (wechatMPMessageService.updateById(wechatMPMessage)) { - return new ResultUtil().setData(wechatMPMessage); - } - return new ResultUtil().setErrorMsg(ResultCode.ERROR); + wechatMPMessageService.updateById(wechatMPMessage); + return new ResultUtil().setData(wechatMPMessage); } + @DemoSite @DeleteMapping(value = "/{ids}") @ApiOperation(value = "删除微信小程序消息订阅") public ResultMessage delAllByIds(@PathVariable List ids) { wechatMPMessageService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/WechatMessageManageController.java b/manager-api/src/main/java/cn/lili/controller/wechat/WechatMessageManageController.java similarity index 65% rename from manager-api/src/main/java/cn/lili/controller/setting/WechatMessageManageController.java rename to manager-api/src/main/java/cn/lili/controller/wechat/WechatMessageManageController.java index ce803533..d46f6070 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/WechatMessageManageController.java +++ b/manager-api/src/main/java/cn/lili/controller/wechat/WechatMessageManageController.java @@ -1,16 +1,15 @@ -package cn.lili.controller.setting; +package cn.lili.controller.wechat; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.message.entity.dos.WechatMessage; -import cn.lili.modules.message.service.WechatMessageService; +import cn.lili.modules.wechat.entity.dos.WechatMessage; +import cn.lili.modules.wechat.service.WechatMessageService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,22 +20,22 @@ import java.util.List; * 管理端,微信消息接口 * * @author Chopper - * @date 2020/12/2 10:40 + * @since 2020/12/2 10:40 */ @RestController @Api(tags = "管理端,微信消息接口") -@RequestMapping("/manager/message/wechat") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/manager/wechat/wechatMessage") public class WechatMessageManageController { - - private final WechatMessageService wechatMessageService; + @Autowired + private WechatMessageService wechatMessageService; @GetMapping(value = "/init") @ApiOperation(value = "初始化微信消息") + @DemoSite public ResultMessage init() { wechatMessageService.init(); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @GetMapping(value = "/{id}") @@ -54,29 +53,28 @@ public class WechatMessageManageController { return ResultUtil.data(data); } + @DemoSite @PostMapping @ApiOperation(value = "新增微信消息") public ResultMessage save(WechatMessage wechatMessage) { - if (wechatMessageService.save(wechatMessage)) { - return ResultUtil.data(wechatMessage); - } - return ResultUtil.error(ResultCode.ERROR); + wechatMessageService.save(wechatMessage); + return ResultUtil.data(wechatMessage); } + @DemoSite @PutMapping("/{id}") @ApiOperation(value = "更新微信消息") public ResultMessage update(@PathVariable String id, WechatMessage wechatMessage) { - if (wechatMessageService.updateById(wechatMessage)) { - return ResultUtil.data(wechatMessage); - } - return ResultUtil.error(ResultCode.ERROR); + wechatMessageService.updateById(wechatMessage); + return ResultUtil.data(wechatMessage); } + @DemoSite @DeleteMapping(value = "/{ids}") @ApiOperation(value = "删除微信消息") public ResultMessage delAllByIds(@PathVariable List ids) { wechatMessageService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/manager-api/src/main/java/cn/lili/security/ManagerAuthenticationFilter.java b/manager-api/src/main/java/cn/lili/security/ManagerAuthenticationFilter.java index 40c56a0e..d3849317 100644 --- a/manager-api/src/main/java/cn/lili/security/ManagerAuthenticationFilter.java +++ b/manager-api/src/main/java/cn/lili/security/ManagerAuthenticationFilter.java @@ -1,12 +1,14 @@ package cn.lili.security; import cn.hutool.core.util.StrUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.PermissionEnum; import cn.lili.common.security.enums.SecurityEnum; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.token.SecretKeyUtil; +import cn.lili.common.security.token.SecretKeyUtil; import cn.lili.common.utils.ResponseUtil; import com.google.gson.Gson; import io.jsonwebtoken.Claims; @@ -20,6 +22,8 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; +import org.springframework.util.PatternMatchUtils; +import org.springframework.web.bind.annotation.RequestMethod; import javax.naming.NoPermissionException; import javax.servlet.FilterChain; @@ -30,6 +34,8 @@ import java.util.List; import java.util.Map; /** + * 管理端token过滤 + * * @author Chopper */ @Slf4j @@ -49,7 +55,7 @@ public class ManagerAuthenticationFilter extends BasicAuthenticationFilter { //从header中获取jwt String jwt = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); - // 如果没有token 则return + //如果没有token 则return if (StrUtil.isBlank(jwt)) { chain.doFilter(request, response); return; @@ -58,49 +64,73 @@ public class ManagerAuthenticationFilter extends BasicAuthenticationFilter { //获取用户信息,存入context UsernamePasswordAuthenticationToken authentication = getAuthentication(jwt, response); //自定义权限过滤 - customAuthentication(request, response, authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); + if (authentication != null) { + customAuthentication(request, response, authentication); + SecurityContextHolder.getContext().setAuthentication(authentication); + } chain.doFilter(request, response); } /** * 自定义权限过滤 * - * @param request - * @param authentication + * @param request 请求 + * @param response 响应 + * @param authentication 用户信息 */ private void customAuthentication(HttpServletRequest request, HttpServletResponse response, UsernamePasswordAuthenticationToken authentication) throws NoPermissionException { AuthUser authUser = (AuthUser) authentication.getDetails(); - Map> permission = (Map>) cache.get(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId()); - if (authUser.getIsSuper()) { - return; - } else { - //用户是否拥有权限判定œ - //获取数据权限 -// if (request.getMethod().equals(RequestMethod.GET.name())) { -// if (!PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.SUPER).toArray(new String[0]), request.getRequestURI()) || -// PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.QUERY).toArray(new String[0]), request.getRequestURI())) { -// -// ResponseUtil.output(response, ResponseUtil.resultMap(false, 401, "抱歉,您没有访问权限")); -// throw new NoPermissionException("权限不足"); -// } -// } else { -// if (!PatternMatchUtils.simpleMatch(permission.get(PermissionEnum.SUPER).toArray(new String[0]), request.getRequestURI())) { -// -// ResponseUtil.output(response, ResponseUtil.resultMap(false, 401, "抱歉,您没有访问权限")); -// throw new NoPermissionException("权限不足"); -// } -// } - return; + String requestUrl = request.getRequestURI(); + + + //如果不是超级管理员, 则鉴权 + if (Boolean.FALSE.equals(authUser.getIsSuper())) { + //获取缓存中的权限 + Map> permission = + (Map>) cache.get(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId()); + + //获取数据(GET 请求)权限 + if (request.getMethod().equals(RequestMethod.GET.name())) { + //如果用户的超级权限和查阅权限都不包含当前请求的api + if (match(permission.get(PermissionEnum.SUPER.name()), requestUrl) || + match(permission.get(PermissionEnum.QUERY.name()), requestUrl)) { + } else { + ResponseUtil.output(response, ResponseUtil.resultMap(false, 400, "权限不足")); + log.error("当前请求路径:{},所拥有权限:{}", requestUrl, JSONUtil.toJsonStr(permission)); + throw new NoPermissionException("权限不足"); + } + } + //非get请求(数据操作) 判定鉴权 + else { + if (!match(permission.get(PermissionEnum.SUPER.name()), requestUrl)) { + ResponseUtil.output(response, ResponseUtil.resultMap(false, 400, "权限不足")); + log.error("当前请求路径:{},所拥有权限:{}", requestUrl, JSONUtil.toJsonStr(permission)); + throw new NoPermissionException("权限不足"); + } + } } } + /** + * 校验权限 + * + * @param permissions 权限集合 + * @param url 请求地址 + * @return 是否拥有权限 + */ + boolean match(List permissions, String url) { + if (permissions == null || permissions.isEmpty()) { + return false; + } + return PatternMatchUtils.simpleMatch(permissions.toArray(new String[0]), url); + } + /** * 获取token信息 * - * @param jwt - * @param response - * @return + * @param jwt token信息 + * @param response 响应 + * @return 获取鉴权对象 */ private UsernamePasswordAuthenticationToken getAuthentication(String jwt, HttpServletResponse response) { @@ -113,8 +143,8 @@ public class ManagerAuthenticationFilter extends BasicAuthenticationFilter { String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString(); AuthUser authUser = new Gson().fromJson(json, AuthUser.class); - // 校验redis中是否有权限 - if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MANAGER) + jwt)) { + //校验redis中是否有权限 + if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MANAGER, authUser.getId()) + jwt)) { //用户角色 List auths = new ArrayList<>(); auths.add(new SimpleGrantedAuthority("ROLE_" + authUser.getRole().name())); @@ -128,7 +158,7 @@ public class ManagerAuthenticationFilter extends BasicAuthenticationFilter { } catch (ExpiredJwtException e) { log.debug("user analysis exception:", e); } catch (Exception e) { - log.error("user analysis exception:", e); + log.error("other exception:", e); } return null; } diff --git a/manager-api/src/main/java/cn/lili/security/ManagerSecurityConfig.java b/manager-api/src/main/java/cn/lili/security/ManagerSecurityConfig.java index 2f0d6b56..32fb6e4f 100644 --- a/manager-api/src/main/java/cn/lili/security/ManagerSecurityConfig.java +++ b/manager-api/src/main/java/cn/lili/security/ManagerSecurityConfig.java @@ -1,9 +1,8 @@ package cn.lili.security; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; import cn.lili.common.security.CustomAccessDeniedHandler; -import cn.lili.config.properties.IgnoredUrlsProperties; -import lombok.RequiredArgsConstructor; +import cn.lili.common.properties.IgnoredUrlsProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -18,62 +17,62 @@ import org.springframework.web.cors.CorsConfigurationSource; * spring Security 核心配置类 Manager安全配置中心 * * @author Chopper - * @date 2020/11/14 16:20 + * @since 2020/11/14 16:20 */ @Slf4j @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ManagerSecurityConfig extends WebSecurityConfigurerAdapter { /** * 忽略验权配置 */ - private final IgnoredUrlsProperties ignoredUrlsProperties; + @Autowired + private IgnoredUrlsProperties ignoredUrlsProperties; /** * spring security -》 权限不足处理 */ - private final CustomAccessDeniedHandler accessDeniedHandler; + @Autowired + private CustomAccessDeniedHandler accessDeniedHandler; - - private final Cache cache; - - private final CorsConfigurationSource corsConfigurationSource; + @Autowired + private Cache cache; + @Autowired + private CorsConfigurationSource corsConfigurationSource; @Override protected void configure(HttpSecurity http) throws Exception { ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = http .authorizeRequests(); - // 配置的url 不需要授权 + //配置的url 不需要授权 for (String url : ignoredUrlsProperties.getUrls()) { - log.error(url); registry.antMatchers(url).permitAll(); } registry .and() - // 禁止网页iframe + //禁止网页iframe .headers().frameOptions().disable() .and() .authorizeRequests() - // 任何请求 + //任何请求 .anyRequest() - // 需要身份认证 + //需要身份认证 .authenticated() .and() - // 允许跨域 + //允许跨域 .cors().configurationSource(corsConfigurationSource).and() - // 关闭跨站请求防护 + //关闭跨站请求防护 .csrf().disable() - // 前后端分离采用JWT 不需要session + //前后端分离采用JWT 不需要session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() - // 自定义权限拒绝处理类 + //自定义权限拒绝处理类 .exceptionHandling().accessDeniedHandler(accessDeniedHandler) .and() - // 添加JWT认证过滤器 + //添加JWT认证过滤器 .addFilter(new ManagerAuthenticationFilter(authenticationManager(), cache)); } diff --git a/manager-api/src/main/resources/application.yml b/manager-api/src/main/resources/application.yml index b04e7d93..fcb39e68 100644 --- a/manager-api/src/main/resources/application.yml +++ b/manager-api/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -25,28 +22,15 @@ management: exposure: include: '*' spring: + application: + name: manager-api # 要在其中注册的Spring Boot Admin Server的URL。 boot: admin: client: url: http://127.0.0.1:8000 - # mongodb - data: - mongodb: - host: 127.0.0.1 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset cache: type: redis - - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false # Redis redis: host: 127.0.0.1 @@ -118,13 +102,13 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: - show: true + show: false # 忽略鉴权url ignored: @@ -135,38 +119,19 @@ ignored: - /MP_verify_qSyvBPhDsPdxvOhC.txt - /weixin/** - /source/** - - /buyer/mini-program/** - - /buyer/cashier/** - - /buyer/pageData/** - - /buyer/article/** - - /buyer/goods/** - - /buyer/category/** - - /buyer/shop/** - - /buyer/connect/** - - /buyer/members/smsLogin - - /buyer/members/refresh/* - - /buyer/members/refresh** - - /buyer/promotion/pintuan - - /buyer/promotion/seckill - - /buyer/memberEvaluation/**/goodsEvaluation - - /buyer/memberEvaluation/**/evaluationNumber - - /store/login/** - - /manager/user/login - - /manager/user/refresh/** - - /manager/elasticsearch + - /manager/passport/user/login + - /manager/passport/user/refresh/** + - /manager/other/elasticsearch + - /manager/other/customWords - /druid/** - /swagger-ui.html - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - /v2/api-docs - /configuration/ui - /boot-admin - statics: - /**/*.js - /**/*.css - /**/*.png @@ -194,19 +159,21 @@ mybatis-plus: # 日志 logging: + config: classpath:logback-spring.xml # 输出级别 level: cn.lili: info # org.hibernate: debug # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 path: lili-logs - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-size: 5MB + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB #加密参数 jasypt: encryptor: @@ -215,6 +182,11 @@ jasypt: lili: system: isDemoSite: true + # 脱敏级别: + # 0:不做脱敏处理 + # 1:管理端用户手机号等信息脱敏 + # 2:商家端信息脱敏(为2时,表示管理端,商家端同时脱敏) + sensitiveLevel: 1 statistics: # 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数 onlineMember: 48 @@ -263,7 +235,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 127.0.0.1:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group @@ -275,6 +248,8 @@ lili: order-group: lili_order_group member-topic: lili_member_topic member-group: lili_member_group + store-topic: lili_store_topic + store-group: lili_store_group other-topic: lili_other_topic other-group: lili_other_group notice-topic: lili_notice_topic diff --git a/manager-api/src/main/resources/banner.txt b/manager-api/src/main/resources/banner.txt deleted file mode 100644 index be6731c5..00000000 --- a/manager-api/src/main/resources/banner.txt +++ /dev/null @@ -1,19 +0,0 @@ - ___ ___ ___ ___ ________ ________ _______ ________ _____ ______ ___ __ ________ ________ ___ __ -|\ \ |\ \|\ \ |\ \ |\ _____\\ __ \|\ ___ \ |\ __ \|\ _ \ _ \|\ \ |\ \|\ __ \|\ __ \|\ \|\ \ -\ \ \ \ \ \ \ \ \ \ \ ____________\ \ \__/\ \ \|\ \ \ __/|\ \ \|\ \ \ \\\__\ \ \ \ \ \ \ \ \ \|\ \ \ \|\ \ \ \/ /|_ - \ \ \ \ \ \ \ \ \ \ \|\____________\ \ __\\ \ _ _\ \ \_|/_\ \ __ \ \ \\|__| \ \ \ \ __\ \ \ \ \\\ \ \ _ _\ \ ___ \ - \ \ \____\ \ \ \ \____\ \ \|____________|\ \ \_| \ \ \\ \\ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \|\__\_\ \ \ \\\ \ \ \\ \\ \ \\ \ \ - \ \_______\ \__\ \_______\ \__\ \ \__\ \ \__\\ _\\ \_______\ \__\ \__\ \__\ \ \__\ \____________\ \_______\ \__\\ _\\ \__\\ \__\ - \|_______|\|__|\|_______|\|__| \|__| \|__|\|__|\|_______|\|__|\|__|\|__| \|__|\|____________|\|_______|\|__|\|__|\|__| \|__| - - - - ___ ___ ___ ___ ________ ___ ___ ________ ________ - |\ \ |\ \|\ \ |\ \ |\ ____\|\ \|\ \|\ __ \|\ __ \ - \ \ \ \ \ \ \ \ \ \ \ ____________\ \ \___|\ \ \\\ \ \ \|\ \ \ \|\ \ - \ \ \ \ \ \ \ \ \ \ \|\____________\ \_____ \ \ __ \ \ \\\ \ \ ____\ - \ \ \____\ \ \ \ \____\ \ \|____________|\|____|\ \ \ \ \ \ \ \\\ \ \ \___| - \ \_______\ \__\ \_______\ \__\ ____\_\ \ \__\ \__\ \_______\ \__\ - \|_______|\|__|\|_______|\|__| |\_________\|__|\|__|\|_______|\|__| - \|_________| - diff --git a/manager-api/src/main/resources/logback-spring.xml b/manager-api/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..b7c9425a --- /dev/null +++ b/manager-api/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE_PATH}/rocketmq.log + + ${LOG_FILE_PATH}/rocketmq/rocketmq-%d{yyyy-MM-dd}.log + 30 + 30MB + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n + + + + + + + + + + + ${LOGSTASH_SERVER} + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java b/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java index d0ed486a..38fec97a 100644 --- a/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java +++ b/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java @@ -1,15 +1,16 @@ package cn.lili.test.CacheTest; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.modules.statistics.util.StatisticsSuffix; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.DefaultTypedTuple; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.Date; import java.util.Random; @@ -18,11 +19,10 @@ import java.util.Set; /** * @author Chopper * @version v1.0 - * @Description: * @since v7.0 * 2021/1/15 16:25 */ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class CacheTest { @@ -123,4 +123,51 @@ class CacheTest { Assertions.assertTrue(true); } + + @Test + void scanTests() { + + for (int i = 0; i < 1000000; i++) { + cache.put("scan" + i, i); + } + Date date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keys("scan999999*"))); + + System.out.println("100w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + + for (int i = 1000000; i < 5000000; i++) { + cache.put("scan" + i, i); + } + + date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keys("scan999999*"))); + System.out.println("600w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + } + + // scan 慢些,但是在缓存更多的情况下,表现更好,虽然用时更久,但是不会阻塞其他读写 + // + //["scan999999"] + //redisTemplate scan 500w数据耗时 + //2985 + //["scan999999"] + //redisTemplate keys 500w数据耗时 + //1073 + @Test + void testKsysVsScan() { + Date date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keys("scan999999*"))); + System.out.println("redisTemplate scan 500w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keysBlock("scan999999*"))); + System.out.println("redisTemplate keys 500w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + } + } diff --git a/manager-api/src/test/java/cn/lili/test/elasticsearch/EsTest.java b/manager-api/src/test/java/cn/lili/test/elasticsearch/EsTest.java index 3da38b66..762bcbdb 100644 --- a/manager-api/src/test/java/cn/lili/test/elasticsearch/EsTest.java +++ b/manager-api/src/test/java/cn/lili/test/elasticsearch/EsTest.java @@ -1,10 +1,13 @@ package cn.lili.test.elasticsearch; import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; import cn.lili.common.vo.PageVO; +import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; +import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.promotion.service.PromotionService; import cn.lili.modules.search.entity.dos.EsGoodsAttribute; @@ -17,22 +20,20 @@ import cn.lili.modules.search.service.EsGoodsSearchService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.Page; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.data.elasticsearch.core.SearchPage; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * @author paulG * @since 2020/10/14 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class EsTest { @@ -49,49 +50,78 @@ class EsTest { private GoodsSkuService goodsSkuService; @Autowired - private StringRedisTemplate stringRedisTemplate; + private GoodsService goodsService; + + @Autowired + private Cache cache; @Autowired private PromotionService promotionService; + public static void main(String[] args) { +// PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS); +// String safeHTML = policy.sanitize("+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-"); +// System.out.println(safeHTML); +// System.out.println(Sanitizers.FORMATTING.and(Sanitizers.FORMATTING).sanitize("+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-")); +// System.out.println(HtmlUtil.unescape(safeHTML)); +// System.out.println(HtmlUtil.filter("+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-")); +// Date dt1 = new Date(2021, 12, 10); +// Date dt2 = new Date(2021, 12, 14); + for (int i = 0; i < 1000; i++) { + + Goods goods = new Goods(); + goods.setGoodsName("测试商品" + i); +// goods.setAuthFlag(); + } + +// + + } + + @Test + void cleanInvalidPromotion() { + this.esGoodsIndexService.cleanInvalidPromotion(); + Assertions.assertTrue(true); + } + @Test void searchGoods() { EsGoodsSearchDTO goodsSearchDTO = new EsGoodsSearchDTO(); -// goodsSearchDTO.setKeyword("黄"); - goodsSearchDTO.setProp("IETF_HTTP/3"); -// goodsSearchDTO.setPrice("100_20000"); -// goodsSearchDTO.setStoreCatId(1L); -// goodsSearchDTO.setBrandId(123L); -// goodsSearchDTO.setCategoryId(2L); -// goodsSearchDTO.setNameIds(Arrays.asList("1344113311566553088", "1344113367694729216")); +// goodsSearchDTO.setKeyword("黄"); +// goodsSearchDTO.setProp("IETF_HTTP/3"); +// goodsSearchDTO.setPrice("100_20000"); +// goodsSearchDTO.setStoreCatId(1L); +// goodsSearchDTO.setBrandId(123L); +// goodsSearchDTO.setCategoryId(2L); +// goodsSearchDTO.setNameIds(Arrays.asList("1344113311566553088", "1344113367694729216")); PageVO pageVo = new PageVO(); pageVo.setPageNumber(0); pageVo.setPageSize(100); pageVo.setOrder("desc"); pageVo.setNotConvert(true); - Page esGoodsIndices = goodsSearchService.searchGoods(goodsSearchDTO, pageVo); + SearchPage esGoodsIndices = goodsSearchService.searchGoods(goodsSearchDTO, pageVo); Assertions.assertNotNull(esGoodsIndices); esGoodsIndices.getContent().forEach(System.out::println); -// esGoodsIndices.getContent().forEach(i -> { -// if (i.getPromotionMap() != null){ -// String s = i.getPromotionMap().keySet().parallelStream().filter(j -> j.contains(PromotionTypeEnum.FULL_DISCOUNT.name())).findFirst().orElse(null); -// if (s != null) { -// FullDiscount basePromotion = (FullDiscount) i.getPromotionMap().get(s); -// System.out.println(basePromotion); -// } -// } -// }); +// esGoodsIndices.getContent().forEach(i -> { +// if (i.getPromotionMap() != null){ +// String s = i.getPromotionMap().keySet().parallelStream().filter(j -> j.contains(PromotionTypeEnum.FULL_DISCOUNT.name())).findFirst().orElse(null); +// if (s != null) { +// FullDiscount basePromotion = (FullDiscount) i.getPromotionMap().get(s); +// System.out.println(basePromotion); +// } +// } +// }); } @Test void aggregationSearch() { EsGoodsSearchDTO goodsSearchDTO = new EsGoodsSearchDTO(); - // goodsSearchDTO.setKeyword("电脑"); - // goodsSearchDTO.setProp("颜色_故宫文创@版本_小新Pro13s"); -// goodsSearchDTO.setCategoryId("2"); -// goodsSearchDTO.setPrice("100_20000"); + //goodsSearchDTO.setKeyword("电脑"); + //goodsSearchDTO.setProp("颜色_故宫文创@版本_小新Pro13s"); +// goodsSearchDTO.setCategoryId("2"); +// goodsSearchDTO.setPrice("100_20000"); PageVO pageVo = new PageVO(); pageVo.setPageNumber(0); pageVo.setPageSize(10); @@ -105,18 +135,16 @@ class EsTest { @Test void init() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(GoodsSku::getIsAuth, GoodsAuthEnum.PASS.name()); + queryWrapper.eq(GoodsSku::getAuthFlag, GoodsAuthEnum.PASS.name()); queryWrapper.eq(GoodsSku::getMarketEnable, GoodsStatusEnum.UPPER.name()); List list = goodsSkuService.list(queryWrapper); List esGoodsIndices = new ArrayList<>(); for (GoodsSku goodsSku : list) { EsGoodsIndex index = new EsGoodsIndex(goodsSku); - Map goodsCurrentPromotionMap = promotionService.getGoodsCurrentPromotionMap(index); - index.setPromotionMap(goodsCurrentPromotionMap); esGoodsIndices.add(index); - stringRedisTemplate.opsForValue().set(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity().toString()); + cache.put(GoodsSkuService.getStockCacheKey(goodsSku.getId()), goodsSku.getQuantity()); } - esGoodsIndexService.initIndex(esGoodsIndices); + esGoodsIndexService.initIndex(esGoodsIndices, true); Assertions.assertTrue(true); } @@ -154,62 +182,7 @@ class EsTest { @Test void updateIndex() { -// EsGoodsIndex goodsIndex = new EsGoodsIndex(); -// goodsIndex.setId("121"); -// goodsIndex.setBrandId("113"); -// goodsIndex.setGoodsId("113"); -// goodsIndex.setCategoryPath("0|1"); -// goodsIndex.setBuyCount(100); -// goodsIndex.setCommentNum(100); -// goodsIndex.setGoodsName("惠普(HP)战66 三代AMD版14英寸轻薄笔记本电脑(锐龙7nm 六核R5-4500U 16G 512G 400尼特高色域一年上门 )"); -// goodsIndex.setGrade(100D); -// goodsIndex.setHighPraiseNum(100); -// goodsIndex.setIntro("I'd like a cup of tea, please"); -// goodsIndex.setIsAuth("1"); -// goodsIndex.setMarketEnable("1"); -// goodsIndex.setMobileIntro("I want something cold to drink"); -// goodsIndex.setPoint(100); -// goodsIndex.setPrice(100D); -// goodsIndex.setSelfOperated(true); -// goodsIndex.setStoreId("113"); -// goodsIndex.setStoreName("惠普自营官方旗舰店"); -// goodsIndex.setStoreCategoryPath("1"); -// goodsIndex.setThumbnail("picture"); -// goodsIndex.setSn("A113"); -// Map promotionMap = new HashMap<>(); -// Coupon coupon = new Coupon(); -// coupon.setStoreId("113"); -// coupon.setStoreName("惠普自营官方旗舰店"); -// coupon.setPromotionStatus(PromotionStatusEnum.START.name()); -// coupon.setReceivedNum(0); -// coupon.setConsumeLimit(11D); -// coupon.setCouponLimitNum(10); -// coupon.setCouponName("满11减10"); -// coupon.setCouponType(CouponTypeEnum.PRICE.name()); -// coupon.setGetType(CouponGetEnum.FREE.name()); -// coupon.setPrice(10D); -// promotionMap.put(PromotionTypeEnum.COUPON.name(), coupon); -// goodsIndex.setPromotionMap(promotionMap); -// List esGoodsAttributeList = new ArrayList<>(); -// EsGoodsAttribute attribute = new EsGoodsAttribute(); -// attribute.setType(0); -// attribute.setName("颜色"); -// attribute.setValue("14英寸"); -// esGoodsAttributeList.add(attribute); -// esGoodsAttributeList.add(attribute); -// attribute = new EsGoodsAttribute(); -// attribute.setName("版本"); -// attribute.setValue("【战66新品】R5-4500 8G 256G"); -// esGoodsAttributeList.add(attribute); -// attribute = new EsGoodsAttribute(); -// attribute.setName("配置"); -// attribute.setValue("i5 8G 512G 2G独显"); -// esGoodsAttributeList.add(attribute); -// goodsIndex.setAttrList(esGoodsAttributeList); -// GoodsSku goodsSkuByIdFromCache = goodsSkuService.getGoodsSkuByIdFromCache("121"); -// EsGoodsIndex goodsIndex = new EsGoodsIndex(goodsSkuByIdFromCache); EsGoodsIndex byId = esGoodsIndexService.findById("121"); - byId.setPromotionMap(null); esGoodsIndexService.updateIndex(byId); Assertions.assertTrue(true); } @@ -234,7 +207,7 @@ class EsTest { goodsIndex.setGrade(100D); goodsIndex.setHighPraiseNum(100); goodsIndex.setIntro("I'd like a cup of tea, please"); - goodsIndex.setIsAuth("1"); + goodsIndex.setAuthFlag("1"); goodsIndex.setMarketEnable("1"); goodsIndex.setMobileIntro("I want something cold to drink"); goodsIndex.setPoint(0); diff --git a/manager-api/src/test/java/cn/lili/test/order/OrderServiceTest.java b/manager-api/src/test/java/cn/lili/test/order/OrderServiceTest.java index deb13a82..98521a24 100644 --- a/manager-api/src/test/java/cn/lili/test/order/OrderServiceTest.java +++ b/manager-api/src/test/java/cn/lili/test/order/OrderServiceTest.java @@ -2,16 +2,16 @@ package cn.lili.test.order; import cn.lili.modules.order.order.service.OrderService; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; /** * @author paulG * @since 2020/12/1 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class OrderServiceTest { @@ -21,12 +21,12 @@ class OrderServiceTest { @Test void QueryParam() { -// OrderSearchParams orderSearchParams = new OrderSearchParams(); -// orderSearchParams.setPageSize(0); -// orderSearchParams.setPageNumber(10); -// IPage orderVOIPage = orderService.queryByParams(orderSearchParams); -// Assertions.assertNotNull(orderVOIPage); -// orderVOIPage.getRecords().forEach(System.out::println); +// OrderSearchParams orderSearchParams = new OrderSearchParams(); +// orderSearchParams.setPageSize(0); +// orderSearchParams.setPageNumber(10); +// IPage orderVOIPage = orderService.queryByParams(orderSearchParams); +// Assertions.assertNotNull(orderVOIPage); +// orderVOIPage.getRecords().forEach(System.out::println); } diff --git a/manager-api/src/test/java/cn/lili/test/promotion/CouponTest.java b/manager-api/src/test/java/cn/lili/test/promotion/CouponTest.java index 157b9c14..0104a869 100644 --- a/manager-api/src/test/java/cn/lili/test/promotion/CouponTest.java +++ b/manager-api/src/test/java/cn/lili/test/promotion/CouponTest.java @@ -1,23 +1,23 @@ package cn.lili.test.promotion; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.vo.PageVO; -import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; -import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.promotion.entity.dos.Coupon; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.*; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams; +import cn.lili.modules.promotion.entity.enums.CouponGetEnum; +import cn.lili.modules.promotion.entity.enums.CouponTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.service.CouponService; import com.baomidou.mybatisplus.core.metadata.IPage; -import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.ArrayList; import java.util.List; @@ -26,22 +26,13 @@ import java.util.List; * @author paulG * @since 2020/10/29 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class CouponTest { @Autowired private CouponService couponService; - @Autowired - private GoodsSkuService goodsSkuService; - - @Autowired - private RocketMQTemplate rocketMQTemplate; - - @Autowired - private RocketmqCustomProperties rocketmqCustomProperties; - @Test void addCoupon() { CouponVO couponVO = new CouponVO(); @@ -49,18 +40,17 @@ class CouponTest { couponVO.setCouponType(CouponTypeEnum.DISCOUNT.name()); couponVO.setDescription(couponVO.getCouponName() + " are expensive"); couponVO.setGetType(CouponGetEnum.FREE.name()); - couponVO.setPromotionStatus(PromotionStatusEnum.NEW.name()); -// couponVO.setStoreId("0"); -// couponVO.setStoreName("platform"); +// couponVO.setStoreId("0"); +// couponVO.setStoreName("platform"); couponVO.setStoreId("131"); couponVO.setStoreName("小米自营旗舰店"); couponVO.setPublishNum(1000); couponVO.setCouponLimitNum(0); couponVO.setConsumeThreshold(500D); -// couponVO.setPrice(200D); +// couponVO.setPrice(200D); couponVO.setCouponDiscount(0.1D); - couponVO.setScopeType(CouponScopeTypeEnum.PORTION_GOODS.name()); + couponVO.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name()); couponVO.setScopeId("121"); couponVO.setStartTime(cn.hutool.core.date.DateUtil.parse("2020-11-30 15:58:00")); couponVO.setEndTime(cn.hutool.core.date.DateUtil.parse("2020-12-30 23:50:00")); @@ -71,7 +61,7 @@ class CouponTest { couponVO.setPromotionName(couponVO.getPrice() + "元券"); } List promotionGoodsList = new ArrayList<>(); -// GoodsSku sku121 = goodsSkuService.getGoodsSkuByIdFromCache("121"); +// GoodsSku sku121 = goodsSkuService.getGoodsSkuByIdFromCache("121"); PromotionGoods promotionGoods = new PromotionGoods(); promotionGoods.setPrice(0.0); promotionGoods.setLimitNum(0); @@ -81,24 +71,23 @@ class CouponTest { promotionGoods.setTitle(couponVO.getPromotionName()); promotionGoods.setPromotionId(couponVO.getId()); promotionGoods.setQuantity(1000); - promotionGoods.setPromotionStatus(couponVO.getPromotionStatus()); promotionGoods.setPromotionType(PromotionTypeEnum.COUPON.name()); promotionGoodsList.add(promotionGoods); // -// GoodsSku sku50112 = goodsSkuService.getGoodsSkuByIdFromCache("50112"); -// promotionGoods = new PromotionGoods(sku50112); -// promotionGoods.setPrice(80000d); -// promotionGoods.setLimitNum(0); -// promotionGoods.setPromotionQuantity(1000); -// promotionGoods.setNum(1000); -// promotionGoods.setStartTime(couponVO.getStartTime()); -// promotionGoods.setEndTime(couponVO.getEndTime()); -// promotionGoods.setTitle(couponVO.getPromotionName()); -// promotionGoods.setPromotionStatus(couponVO.getPromotionStatus()); -// promotionGoodsList.add(promotionGoods); +// GoodsSku sku50112 = goodsSkuService.getGoodsSkuByIdFromCache("50112"); +// promotionGoods = new PromotionGoods(sku50112); +// promotionGoods.setPrice(80000d); +// promotionGoods.setLimitNum(0); +// promotionGoods.setPromotionQuantity(1000); +// promotionGoods.setNum(1000); +// promotionGoods.setStartTime(couponVO.getStartTime()); +// promotionGoods.setEndTime(couponVO.getEndTime()); +// promotionGoods.setTitle(couponVO.getPromotionName()); +// promotionGoods.setPromotionStatus(couponVO.getPromotionStatus()); +// promotionGoodsList.add(promotionGoods); // couponVO.setPromotionGoodsList(promotionGoodsList); - Assertions.assertNotNull(couponService.add(couponVO)); + Assertions.assertNotNull(couponService.savePromotions(couponVO)); } @Test @@ -109,7 +98,6 @@ class CouponTest { couponVO.setCouponType(CouponTypeEnum.DISCOUNT.name()); couponVO.setDescription(couponVO.getId() + " is expensive"); couponVO.setGetType(CouponGetEnum.FREE.name()); - couponVO.setPromotionStatus(PromotionStatusEnum.START.name()); couponVO.setStoreId("132"); couponVO.setStoreName("联想自营旗舰店"); couponVO.setStoreCommission(99.99D); @@ -118,7 +106,7 @@ class CouponTest { couponVO.setCouponDiscount(10D); couponVO.setPrice(0D); - couponVO.setScopeType(CouponScopeTypeEnum.PORTION_GOODS.name()); + couponVO.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name()); couponVO.setScopeId("134,133"); couponVO.setStartTime(cn.hutool.core.date.DateUtil.parse("2020-11-10 17:01:00")); couponVO.setEndTime(cn.hutool.core.date.DateUtil.parse("2020-11-10 17:10:00")); @@ -143,7 +131,6 @@ class CouponTest { promotionGoods.setStartTime(couponVO.getStartTime()); promotionGoods.setEndTime(couponVO.getEndTime()); promotionGoods.setTitle(couponVO.getPromotionName()); - promotionGoods.setPromotionStatus(couponVO.getPromotionStatus()); promotionGoodsList.add(promotionGoods); promotionGoods = new PromotionGoods(); @@ -159,40 +146,27 @@ class CouponTest { promotionGoods.setStartTime(couponVO.getStartTime()); promotionGoods.setEndTime(couponVO.getEndTime()); promotionGoods.setTitle(couponVO.getPromotionName()); - promotionGoods.setPromotionStatus(couponVO.getPromotionStatus()); promotionGoodsList.add(promotionGoods); couponVO.setPromotionGoodsList(promotionGoodsList); - Assertions.assertNotNull(couponService.updateCoupon(couponVO)); + Assertions.assertTrue(couponService.updatePromotions(couponVO)); } @Test - void searchFromMongo() { + void search() { CouponSearchParams queryParam = new CouponSearchParams(); queryParam.setStoreId(""); PageVO pageVo = new PageVO(); pageVo.setPageNumber(0); pageVo.setPageSize(10); - IPage couponsByPageFromMongo = couponService.getCouponsByPageFromMongo(queryParam, pageVo); - Assertions.assertNotNull(couponsByPageFromMongo); - couponsByPageFromMongo.getRecords().forEach(System.out::println); - } - - @Test - void searchFromMysql() { - CouponSearchParams queryParam = new CouponSearchParams(); - - PageVO pageVo = new PageVO(); - pageVo.setPageNumber(0); - pageVo.setPageSize(10); - IPage coupons = couponService.getCouponsByPage(queryParam, pageVo); - Assertions.assertNotNull(coupons); - coupons.getRecords().forEach(System.out::println); + IPage couponsByPage = couponService.pageFindAll(queryParam, pageVo); + Assertions.assertNotNull(couponsByPage); + couponsByPage.getRecords().forEach(System.out::println); } @Test void delete() { -// Assertions.assertTrue(couponService.deleteCoupon("1326001296591577088")); +// Assertions.assertTrue(couponService.deleteCoupon("1326001296591577088")); GoodsStatusEnum goodsStatusEnum = GoodsStatusEnum.DOWN; System.out.println("name:: " + goodsStatusEnum.name()); System.out.println("description:: " + goodsStatusEnum.description()); diff --git a/manager-api/src/test/java/cn/lili/test/promotion/FullDiscountTest.java b/manager-api/src/test/java/cn/lili/test/promotion/FullDiscountTest.java index 854ea0aa..aad4e24c 100644 --- a/manager-api/src/test/java/cn/lili/test/promotion/FullDiscountTest.java +++ b/manager-api/src/test/java/cn/lili/test/promotion/FullDiscountTest.java @@ -1,33 +1,32 @@ package cn.lili.test.promotion; import cn.hutool.core.util.RandomUtil; -import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.promotion.entity.dos.FullDiscount; import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams; +import cn.lili.modules.promotion.entity.dto.search.FullDiscountSearchParams; import cn.lili.modules.promotion.service.FullDiscountService; -import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** * @author paulG * @since 2020/10/22 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class FullDiscountTest { @@ -42,13 +41,11 @@ class FullDiscountTest { FullDiscountVO fullDiscountVO = new FullDiscountVO(); fullDiscountVO.setStoreId("131"); fullDiscountVO.setStoreName("小米自营旗舰店"); - fullDiscountVO.setNumber(1); fullDiscountVO.setDescription("full discount test " + RandomUtil.randomNumber()); - fullDiscountVO.setIsFullMinus(true); + fullDiscountVO.setFullMinusFlag(true); fullDiscountVO.setFullMoney(130D); fullDiscountVO.setFullMinus(100D); - fullDiscountVO.setPromotionStatus(PromotionStatusEnum.NEW.name()); - fullDiscountVO.setIsFreeFreight(true); + fullDiscountVO.setFreeFreightFlag(true); fullDiscountVO.setPromotionName("FullDiscount-" + fullDiscountVO.getId()); fullDiscountVO.setTitle("满" + fullDiscountVO.getFullMoney() + "减" + fullDiscountVO.getFullMinus()); @@ -65,17 +62,16 @@ class FullDiscountTest { promotionGoods.setNum(10); promotionGoods.setQuantity(100); promotionGoods.setPromotionId(fullDiscountVO.getId()); - promotionGoods.setPromotionStatus(PromotionStatusEnum.NEW.name()); promotionGoods.setPromotionType(PromotionTypeEnum.FULL_DISCOUNT.name()); promotionGoods.setTitle("满" + fullDiscountVO.getFullMoney() + "减" + fullDiscountVO.getFullMinus()); promotionGoodsLis.add(promotionGoods); fullDiscountVO.setPromotionGoodsList(promotionGoodsLis); - Assertions.assertNotNull(fullDiscountService.addFullDiscount(fullDiscountVO)); + Assertions.assertTrue(fullDiscountService.savePromotions(fullDiscountVO)); } @Test - void searchFromMongo() { + void search() { PageVO pageVo = new PageVO(); pageVo.setPageSize(10); pageVo.setPageNumber(0); @@ -83,12 +79,9 @@ class FullDiscountTest { pageVo.setSort("startTime"); pageVo.setOrder("asc"); - IPage fullDiscountByPageFromMongo = fullDiscountService.getFullDiscountByPageFromMongo(new FullDiscountSearchParams(), null); + IPage fullDiscountByPage = fullDiscountService.pageFindAll(new FullDiscountSearchParams(), null); - Assertions.assertNotNull(fullDiscountByPageFromMongo); - FullDiscount fullDiscount = JSONUtil.toBean(JSONUtil.parseObj(fullDiscountByPageFromMongo.getPages()), FullDiscount.class); - System.out.println(fullDiscount); -// fullDiscountByPageFromMongo.forEach(System.out::println); + Assertions.assertNotNull(fullDiscountByPage); } @Test @@ -97,13 +90,11 @@ class FullDiscountTest { fullDiscountVO.setId("1325981729404248064"); fullDiscountVO.setStoreId("132"); fullDiscountVO.setStoreName("联想自营旗舰店"); - fullDiscountVO.setNumber(1); fullDiscountVO.setDescription("Not worth"); - fullDiscountVO.setIsFullMinus(true); + fullDiscountVO.setFullMinusFlag(true); fullDiscountVO.setFullMoney(100D); fullDiscountVO.setFullMinus(80D); - fullDiscountVO.setPromotionStatus(PromotionStatusEnum.NEW.name()); - fullDiscountVO.setIsFreeFreight(true); + fullDiscountVO.setFreeFreightFlag(true); fullDiscountVO.setPromotionName("FullDiscount-" + fullDiscountVO.getId()); fullDiscountVO.setTitle("满" + fullDiscountVO.getFullMoney() + "减" + fullDiscountVO.getFullMinus()); @@ -113,7 +104,6 @@ class FullDiscountTest { List promotionGoodsLis = new ArrayList<>(); PromotionGoods promotionGoods = new PromotionGoods(); promotionGoods.setSkuId("134"); - promotionGoods.setPromotionStatus(PromotionStatusEnum.NEW.name()); promotionGoods.setPrice(18000D); promotionGoods.setStartTime(fullDiscountVO.getStartTime()); promotionGoods.setEndTime(fullDiscountVO.getEndTime()); @@ -126,12 +116,12 @@ class FullDiscountTest { promotionGoods.setStoreId("132"); promotionGoodsLis.add(promotionGoods); fullDiscountVO.setPromotionGoodsList(promotionGoodsLis); - Assertions.assertNotNull(fullDiscountService.modifyFullDiscount(fullDiscountVO)); + Assertions.assertTrue(fullDiscountService.updatePromotions(fullDiscountVO)); } @Test void delete() { - Assertions.assertTrue(fullDiscountService.deleteFullDiscount("1325995092947525632")); + Assertions.assertTrue(fullDiscountService.removePromotions(Collections.singletonList("1325995092947525632"))); } diff --git a/manager-api/src/test/java/cn/lili/test/promotion/PromotionPriceTest.java b/manager-api/src/test/java/cn/lili/test/promotion/PromotionPriceTest.java deleted file mode 100644 index 3e8ffaeb..00000000 --- a/manager-api/src/test/java/cn/lili/test/promotion/PromotionPriceTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.lili.test.promotion; - -import cn.hutool.json.JSONUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.promotion.entity.dto.BasePromotion; -import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.service.PromotionPriceService; -import cn.lili.modules.promotion.service.PromotionService; -import cn.lili.modules.promotion.service.PromotionGoodsService; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.Map; - -/** - * @author paulG - * @since 2020/11/23 - **/ -@RunWith(SpringRunner.class) -@SpringBootTest -class PromotionPriceTest { - - @Autowired - private PromotionPriceService promotionPriceService; - - @Autowired - private PromotionService promotionService; - - @Autowired - private PromotionGoodsService promotionGoodsServiceService; - - @Test - void testSeckillPrice() { - Map currentPromotion = promotionService.getCurrentPromotion(); - for (Map.Entry entry : currentPromotion.entrySet()) { - BasePromotion promotion = (BasePromotion) entry.getValue(); - System.out.println(entry.getKey() + "-" + promotion.getId()); - } - Assertions.assertTrue(true); - } - - @Test - void testSeckillPrice1() { - IPage promotionGoods = promotionGoodsServiceService.getCurrentPromotionGoods(PromotionTypeEnum.FULL_DISCOUNT.name(), new PageVO()); - - ResultMessage> data = ResultUtil.data(promotionGoods); - String s = JSONUtil.toJsonStr(data); - System.out.println(s); - Assertions.assertTrue(true); - } - -} diff --git a/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java b/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java index 835b0716..b5de0d58 100644 --- a/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java +++ b/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java @@ -1,19 +1,22 @@ package cn.lili.test.promotion; -import cn.hutool.core.date.DateUtil; -import cn.lili.modules.promotion.entity.enums.PromotionApplyStatusEnum; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.enums.SeckillApplyStatusEnum; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.promotion.entity.dos.Seckill; +import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum; import cn.lili.modules.promotion.entity.vos.SeckillApplyVO; -import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SeckillSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import com.google.gson.Gson; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.ArrayList; import java.util.List; @@ -22,7 +25,7 @@ import java.util.List; * @author paulG * @since 2020/10/29 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class SeckillTest { @@ -32,61 +35,59 @@ class SeckillTest { @Autowired private SeckillApplyService seckillApplyService; + @Autowired + private MemberService memberService; + + /** + * 系统设置 + */ + @Autowired + private SettingService settingService; + @Test void add() { - SeckillVO seckillVO = new SeckillVO(); - seckillVO.setId("123456"); - seckillVO.setStoreIds("132"); - seckillVO.setSeckillApplyStatus(SeckillApplyStatusEnum.NOT_APPLY.name()); - seckillVO.setPromotionStatus(PromotionStatusEnum.NEW.name()); - seckillVO.setApplyEndTime(DateUtil.parse("2020-11-13 23:50:00")); - seckillVO.setStartTime(DateUtil.parse("2020-11-14 12:00:00")); - seckillVO.setEndTime(DateUtil.parse("2020-11-14 18:00:00")); - seckillVO.setHours("13,14,15,16,17"); - seckillVO.setPromotionName("Seckill" + seckillVO.getId()); - seckillVO.setSeckillRule("rule" + seckillVO.getId()); - seckillVO.setStoreId("0"); - seckillVO.setStoreName("platform"); - Assertions.assertTrue(seckillService.saveSeckill(seckillVO)); + Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); + System.out.println(setting); + SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); + System.out.println(seckillSetting); + boolean result = true; + for (int i = 1; i <= SeckillService.PRE_CREATION; i++) { + Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule()); + seckillService.savePromotions(seckill); + } + Assertions.assertTrue(result); } @Test void addApply() { List seckillApplyVOS = new ArrayList<>(); SeckillApplyVO seckillApplyVO = new SeckillApplyVO(); - seckillApplyVO.setGoodsName("Apple MacBook Pro 13.3 新款八核M1芯片 8G 256G SSD 深空灰 笔记本电脑 轻薄本 MYD82CH/A"); - seckillApplyVO.setSkuId("50111"); - seckillApplyVO.setOriginalPrice(20000D); - seckillApplyVO.setPrice(19000D); - seckillApplyVO.setPromotionApplyStatus(PromotionApplyStatusEnum.APPLY.name()); - seckillApplyVO.setQuantity(100); + seckillApplyVO.setGoodsName("Apple iPhone 12"); + seckillApplyVO.setSkuId("1387977574860193792"); + seckillApplyVO.setOriginalPrice(4000D); + seckillApplyVO.setPrice(3600D); + seckillApplyVO.setPromotionApplyStatus(PromotionsApplyStatusEnum.APPLY.name()); + seckillApplyVO.setQuantity(1); seckillApplyVO.setSalesNum(0); - seckillApplyVO.setSeckillId("123456"); - seckillApplyVO.setStoreId("501"); - seckillApplyVO.setStoreName("Apple产品自营旗舰店"); - seckillApplyVO.setTimeLine(17); + seckillApplyVO.setSeckillId("10000"); + seckillApplyVO.setStoreId("1376369067769724928"); + seckillApplyVO.setStoreName("Lilishop自营店"); + seckillApplyVO.setTimeLine(15); seckillApplyVOS.add(seckillApplyVO); seckillApplyVO = new SeckillApplyVO(); - seckillApplyVO.setGoodsName("RedmiBook 16 锐龙版 超轻薄全面屏(6核R5-4500U 16G 512G 100% sRGB高色域)灰 手提 笔记本电脑 小米 红米"); - seckillApplyVO.setSkuId("141"); - seckillApplyVO.setOriginalPrice(10000D); - seckillApplyVO.setPrice(9000D); - seckillApplyVO.setPromotionApplyStatus(PromotionApplyStatusEnum.APPLY.name()); - seckillApplyVO.setQuantity(100); + seckillApplyVO.setGoodsName("Apple iPhone 12"); + seckillApplyVO.setSkuId("1387977574864388096"); + seckillApplyVO.setOriginalPrice(4000D); + seckillApplyVO.setPrice(3600D); + seckillApplyVO.setPromotionApplyStatus(PromotionsApplyStatusEnum.APPLY.name()); + seckillApplyVO.setQuantity(1); seckillApplyVO.setSalesNum(0); - seckillApplyVO.setSeckillId("123456"); - seckillApplyVO.setStoreId("131"); - seckillApplyVO.setStoreName("小米自营旗舰店"); - seckillApplyVO.setTimeLine(16); + seckillApplyVO.setSeckillId("10000"); + seckillApplyVO.setStoreId("1376369067769724928"); + seckillApplyVO.setStoreName("Lilishop自营店"); + seckillApplyVO.setTimeLine(15); seckillApplyVOS.add(seckillApplyVO); - seckillApplyService.addSeckillApply("123456", "501", seckillApplyVOS); - Assertions.assertTrue(true); - } - - - @Test - void audit() { - seckillApplyService.auditBatchApply(new String[]{"1327169604003061760"}, "123456", PromotionApplyStatusEnum.PASS.name(), ""); + seckillApplyService.addSeckillApply("10000", "1376369067769724928", seckillApplyVOS); Assertions.assertTrue(true); } diff --git a/manager-api/src/test/java/cn/lili/test/rocketmq/MsgExtRocketMqTest.java b/manager-api/src/test/java/cn/lili/test/rocketmq/MsgExtRocketMqTest.java index f5f34bf1..b33633a4 100644 --- a/manager-api/src/test/java/cn/lili/test/rocketmq/MsgExtRocketMqTest.java +++ b/manager-api/src/test/java/cn/lili/test/rocketmq/MsgExtRocketMqTest.java @@ -1,23 +1,23 @@ package cn.lili.test.rocketmq; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.MqOrderTagsEnum; -import cn.lili.config.rocketmq.RocketmqCustomProperties; +import cn.lili.common.properties.RocketmqCustomProperties; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.OrderTagsEnum; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; /** * @author paulG * @since 2021/1/15 **/ -@RunWith(SpringRunner.class) +@ExtendWith(SpringExtension.class) @SpringBootTest class MsgExtRocketMqTest { @@ -29,7 +29,7 @@ class MsgExtRocketMqTest { @Test void searchAll() { - String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.STATUS_CHANGE.name(); + String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name(); Message message = MessageBuilder.withPayload("Context").build(); rocketMQTemplate.asyncSend(destination, message, RocketmqSendCallbackBuilder.commonCallback()); rocketMQTemplate.send(destination, message); diff --git a/manager-api/src/test/resources/application.yml b/manager-api/src/test/resources/application.yml new file mode 100644 index 00000000..968b2746 --- /dev/null +++ b/manager-api/src/test/resources/application.yml @@ -0,0 +1,319 @@ +server: + servlet: + context-path: / + + tomcat: + uri-encoding: UTF-8 + threads: + min-spare: 50 + max: 1000 + +# 与Spring Boot 2一样,默认情况下,大多数端点都不通过http公开,我们公开了所有端点。对于生产,您应该仔细选择要公开的端点。 +management: + # health: + # elasticsearch: + # enabled: false + # datasource: + # enabled: false + endpoints: + web: + exposure: + include: '*' +spring: + # 要在其中注册的Spring Boot Admin Server的URL。 + boot: + admin: + client: + url: http://192.168.0.116:8000 + cache: + type: redis + # Redis + redis: + host: 192.168.0.108 + port: 30379 + password: lilishop + lettuce: + pool: + # 连接池最大连接数(使用负值表示没有限制) 默认 8 + max-active: 200 + # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 + max-wait: 20 + # 连接池中的最大空闲连接 默认 8 + max-idle: 10 + # 连接池中的最小空闲连接 默认 8 + min-idle: 8 + # 文件大小上传配置 + servlet: + multipart: + max-file-size: 20MB + max-request-size: 20MB + jackson: + time-zone: GMT+8 + serialization: + #关闭jackson 对json做解析 + fail-on-empty-beans: false + + shardingsphere: + datasource: + # 数据库名称,可自定义,可以为多个,以逗号隔开,每个在这里定义的库,都要在下面定义连接属性 + names: default-datasource + default-datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://192.168.0.108:30306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: lilishop + maxActive: 50 + initialSize: 20 + maxWait: 60000 + minIdle: 5 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + #是否缓存preparedStatement,也就是PSCache。在mysql下建议关闭。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。 + poolPreparedStatements: false + #要启用PSCache,-1为关闭 必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true 可以把这个数值配置大一些,比如说100 + maxOpenPreparedStatements: -1 + #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,log4j2 + #通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + #合并多个DruidDataSource的监控数据 + useGlobalDataSourceStat: true + loginUsername: druid + loginPassword: druid + # sharding: + # default-data-source-name: default-datasource + # #需要拆分的表,可以设置多个 在 li_order 级别即可 + # tables: + # #需要进行分表的逻辑表名 + # li_order: + # #实际的表结点,下面代表的是li_order_为开头的所有表,如果能确定表的范围例如按月份分表,这里的写法是data2020.li_order_$->{2020..2021}_$->{01..12} 表示例如 li_order_2020_01 li_order_2020_03 li_order_2021_01 + # actual-data-nodes: data2020.li_order_$->{2019..2021}_$->{01..12} + # table-strategy: + # # 分表策略,根据创建日期 + # standard: + # sharding-column: create_time + # #分表策略 + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm + # #范围查询实现 + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm + props: + #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 + sql: + show: true + +# 忽略鉴权url +ignored: + urls: + - /editor-app/** + - /actuator** + - /actuator/** + - /MP_verify_qSyvBPhDsPdxvOhC.txt + - /weixin/** + - /source/** + - /store/passport/login/** + - /store/passport/login/refresh/** + - /common/common/slider/** + - /common/common/sms/** + - /buyer/payment/cashier/** + - /buyer/other/pageData/** + - /buyer/other/article/** + - /buyer/goods/** + - /buyer/store/** + - /buyer/passport/connect/** + - /buyer/members/** + - /buyer/passport/member/** + - /buyer/passport/member/refresh/** + - /buyer/promotion/pintuan/** + - /buyer/promotion/seckill/** + - /buyer/promotion/pointsGoods/** + - /buyer/promotion/coupon + - /buyer/member/evaluation/**/goodsEvaluation + - /buyer/member/evaluation/**/evaluationNumber + - /buyer/other/appVersion/** + - /buyer/broadcast/studio/** + - /manager/passport/user/login + - /manager/passport/user/refresh/** + - /manager/other/elasticsearch + - /manager/other/customWords + - /druid/** + - /swagger-ui.html + - /doc.html + - /swagger-resources/** + - /swagger/** + - /webjars/** + - /v2/api-docs** + - /configuration/ui + - /boot-admin + - /manager/promotion/seckill/init + - /**/*.js + - /**/*.css + - /**/*.png + - /**/*.ico + +# Swagger界面内容配置 +swagger: + title: lilishop API接口文档 + description: lilishop Api Documentation + version: 4.2.2 + termsOfServiceUrl: https://pickmall.cn + contact: + name: lili + url: https://pickmall.cn + email: admin@pickmall.com + +# Mybatis-plus +mybatis-plus: + mapper-locations: classpath*:mapper/*.xml + configuration: + #缓存开启 + cache-enabled: true + #日志 +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 日志 +logging: + # 输出级别 + level: + cn.lili: info + # org.hibernate: debug + # org.springframework: debug + file: + # 指定路径 + path: logs + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB +#加密参数 +jasypt: + encryptor: + password: lili + + +lili: + #验证码设置 + verification-code: + #图形验证码有效时间 秒 包含滑块验证码有效时间, 以及验证通过之后,缓存中存储的验证结果有效时间 + effectiveTime: 300 + #水印 + watermark: LILI-SHOP + #干扰项数量 最大2 默认0 + interfereNum: 1 + #允许误差像素 + faultTolerant: 3 + #短信模版配置 + sms: + #登录 + LOGIN: SMS_205755300 + #注册 + REGISTER: SMS_205755298 + #找回密码 + FIND_USER: SMS_205755301 + #设置密码 + UPDATE_PASSWORD: SMS_205755297 + #支付密码 + WALLET_PASSWORD: SMS_205755301 + system: + isDemoSite: false + isTestModel: true + # 脱敏级别: + # 0:不做脱敏处理 + # 1:管理端用户手机号等信息脱敏 + # 2:商家端信息脱敏(为2时,表示管理端,商家端同时脱敏) + sensitiveLevel: 1 + + statistics: + # 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数 + onlineMember: 48 + # 当前在线人数刷新时间间隔,单位秒,设置为600,则每10分钟刷新一次 + currentOnlineUpdate: 600 + #qq lbs 申请 + lbs: + key: 4BYBZ-7MT6S-PUAOA-6BNWL-FJUD7-UUFXT + sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6 + #域名 + domain: + pc: http://192.168.0.116:8888 + wap: http://192.168.0.116:8888 + seller: http://192.168.0.116:8888 + admin: http://192.168.0.116:8888 + #api地址 + api: + buyer: https://z171l91606.51mypc.cn + base: http://192.168.0.116:8888 + manager: http://192.168.0.116:8888 + seller: http://192.168.0.116:8888 + + # jwt 细节设定 + jwt-setting: + # token过期时间(分钟) + tokenExpireTime: 30 + + # 使用Spring @Cacheable注解失效时间 + cache: + # 过期时间 单位秒 永久不过期设为-1 + timeout: 1500 + #多线程配置 + thread: + corePoolSize: 5 + maxPoolSize: 50 + queueCapacity: 50 + data: + elasticsearch: + cluster-name: elasticsearch + cluster-nodes: 192.168.0.108:30920 + index: + number-of-replicas: 0 + number-of-shards: 3 + index-prefix: lili + schema: http + # account: + # username: elastic + # password: LiLiShopES + + logstash: + server: 192.168.0.108:30560 + rocketmq: + promotion-topic: lili_promotion_topic + promotion-group: lili_promotion_group + msg-ext-topic: lili_msg_topic + msg-ext-group: lili_msg_group + goods-topic: lili_goods_topic + goods-group: lili_goods_group + order-topic: lili_order_topic + order-group: lili_order_group + member-topic: lili_member_topic + member-group: lili_member_group + other-topic: lili_other_topic + other-group: lili_other_group + notice-topic: lili_notice_topic + notice-group: lili_notice_group + notice-send-topic: lili_send_notice_topic + notice-send-group: lili_send_notice_group + after-sale-topic: lili_after_sale_topic + after-sale-group: lili_after_sale_group +rocketmq: + name-server: 192.168.0.108:30876 + isVIPChannel: false + producer: + group: lili_group + send-message-timeout: 30000 + +xxl: + job: + admin: + addresses: http://192.168.0.108:30001/xxl-job-admin + executor: + appname: xxl-job-executor-lilishop + address: + ip: + port: 8891 + logpath: ./xxl-job/executor + logretentiondays: 7 \ No newline at end of file diff --git a/pom.xml b/pom.xml index b957fccf..84a36127 100644 --- a/pom.xml +++ b/pom.xml @@ -7,51 +7,92 @@ org.springframework.boot spring-boot-starter-parent - 2.3.4.RELEASE + 2.4.10 + cn.lili lili-shop-parent - 1.0.1 + ${revision} + pom + 1.8 + 4.2.5 + UTF-8 + UTF-8 + true registry.cn-beijing.aliyuncs.com/lili-images - 0.0.5 + 1 + 4.22.32.ALL + 3.5.1 + 5.8.14 + 2.0.3.RELEASE + 3.0.4 + 2.9.10 + 1.18.24 + 3.15.6 + 4.5.18 + 3.11.1 + 2.0.8 + 4.6.0 + 3.14.0 + 2.0.9 + 2.2.2 + 0.11.2 + 4.0.0 + 1.2.16 + 1.0.3 + 4.7.2 + 4.7.2 + 2.0.9 + 2.6.6 + 1.21 + 5.1.0 + 5.1.0 + 7.1.1 + 3.5.0 + 1.7.36 + 3.2.3 + 1.9 + 4.3 + 2.3.0 + 1.2.2 + 2.3.1 + 20211018.2 + 8.0.3 + 3.20.6.2 + 5.6.97 + 3.1.693 + 1.0.11 + framework buyer-api manager-api seller-api - socket-api common-api consumer + admin + im-api - - pom - - - org.codehaus.mojo - versions-maven-plugin - 2.7 - - false - + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 - com.spotify docker-maven-plugin - 1.2.2 + ${spotify} - ${docker-registry}/${project.build.finalName}:${images-version} + ${docker-registry}/${project.artifactId}:${revision}.${images-version} java ["java", "-jar", "/${project.build.finalName}.jar"] - true / @@ -61,6 +102,12 @@ + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + @@ -68,7 +115,7 @@ central aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ + https://maven.aliyun.com/repository/public default diff --git a/pushGithub.sh b/pushGithub.sh new file mode 100644 index 00000000..6c14fa03 --- /dev/null +++ b/pushGithub.sh @@ -0,0 +1,18 @@ +echo '开始推送github' +echo '切换git地址' +git remote rm origin + +git remote add origin git@github.com:lilishop/lilishop.git +echo '设置上传代码分支,推送github' +git push --set-upstream origin master --force +echo '推送github完成' +git remote rm origin + +git remote add origin git@gitee.com:beijing_hongye_huicheng/lilishop.git + +git pull origin master + +echo '切回gitee资源' +git branch --set-upstream-to=origin/master master +echo '设置git跟踪资源' + diff --git a/seller-api/pom.xml b/seller-api/pom.xml index 934079d4..0e9b7798 100644 --- a/seller-api/pom.xml +++ b/seller-api/pom.xml @@ -8,14 +8,15 @@ cn.lili lili-shop-parent - 1.0.1 + ${revision} + ../pom.xml cn.lili framework - 1.0.1 + ${revision} diff --git a/seller-api/src/main/java/cn/lili/StoreApiApplication.java b/seller-api/src/main/java/cn/lili/StoreApiApplication.java index 26ced53e..284df1b6 100644 --- a/seller-api/src/main/java/cn/lili/StoreApiApplication.java +++ b/seller-api/src/main/java/cn/lili/StoreApiApplication.java @@ -6,7 +6,6 @@ import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.core.task.TaskExecutor; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -14,10 +13,9 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; * 商家后台 API * * @author Chopper - * @date 2020/11/16 10:03 下午 + * @since 2020/11/16 10:03 下午 */ @SpringBootApplication -@EnableJpaAuditing @EnableCaching @EnableAsync public class StoreApiApplication { @@ -30,7 +28,7 @@ public class StoreApiApplication { } public static void main(String[] args) { - + System.setProperty("rocketmq.client.logUseSlf4j","true"); System.setProperty("es.set.netty.runtime.available.processors", "false"); SpringApplication.run(StoreApiApplication.class, args); } diff --git a/seller-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsStoreController.java b/seller-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsStoreController.java index 1b663820..9cbb89cb 100644 --- a/seller-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/distribution/DistributionGoodsStoreController.java @@ -1,7 +1,8 @@ package cn.lili.controller.distribution; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.DistributionGoods; import cn.lili.modules.distribution.entity.dos.DistributionSelectedGoods; @@ -14,33 +15,34 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; +import java.util.Objects; /** * 店铺端,分销商品接口 * * @author Bulbasaur - * @date 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ @RestController @Api(tags = "店铺端,分销商品接口") -@RequestMapping("/store/distributionGoods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/distribution/goods") public class DistributionGoodsStoreController { /** * 分销商品 */ - private final DistributionGoodsService distributionGoodsService; + @Autowired + private DistributionGoodsService distributionGoodsService; /** * 已选择分销商品 */ - private final DistributionSelectedGoodsService distributionSelectedGoodsService; + @Autowired + private DistributionSelectedGoodsService distributionSelectedGoodsService; @ApiOperation(value = "获取分销商商品列表") @GetMapping @@ -54,18 +56,21 @@ public class DistributionGoodsStoreController { @PutMapping(value = "/checked/{skuId}") public ResultMessage distributionCheckGoods(@NotNull(message = "规格ID不能为空") @PathVariable String skuId, @NotNull(message = "佣金金额不能为空") @RequestParam Double commission) { - return ResultUtil.data(distributionGoodsService.checked(skuId, commission)); + + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(distributionGoodsService.checked(skuId, commission, storeId)); } @ApiOperation(value = "取消分销商品") @ApiImplicitParam(name = "id", value = "分销商商品ID", required = true, paramType = "path") @DeleteMapping(value = "/cancel/{id}") public ResultMessage cancel(@NotNull @PathVariable String id) { + OperationalJudgment.judgment(distributionGoodsService.getById(id)); //清除分销商已选择分销商品 distributionSelectedGoodsService.remove(new QueryWrapper().eq("distribution_goods_id", id)); //清除分销商品 distributionGoodsService.removeById(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/seller-api/src/main/java/cn/lili/controller/distribution/DistributionOrderStoreController.java b/seller-api/src/main/java/cn/lili/controller/distribution/DistributionOrderStoreController.java index 04c69440..6b714ca8 100644 --- a/seller-api/src/main/java/cn/lili/controller/distribution/DistributionOrderStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/distribution/DistributionOrderStoreController.java @@ -1,7 +1,7 @@ package cn.lili.controller.distribution; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.distribution.entity.dos.DistributionOrder; import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams; @@ -9,35 +9,36 @@ import cn.lili.modules.distribution.service.DistributionOrderService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Objects; + /** * 店铺端,分销订单接口 * * @author Bulbasaur - * @date 2020/11/16 10:06 下午 + * @since 2020/11/16 10:06 下午 */ @RestController @Api(tags = "店铺端,分销订单接口") -@RequestMapping("/store/distributionOrder") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/distribution/order") public class DistributionOrderStoreController { /** * 分销订单 */ - private final DistributionOrderService distributionOrderService; + @Autowired + private DistributionOrderService distributionOrderService; @ApiOperation(value = "获取分销订单列表") @GetMapping public ResultMessage> distributionOrder(DistributionOrderSearchParams distributionOrderSearchParams) { - + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); //获取当前登录商家账号-查询当前店铺的分销订单 - distributionOrderSearchParams.setStoreId(UserContext.getCurrentUser().getId()); + distributionOrderSearchParams.setStoreId(storeId); //查询分销订单列表 IPage distributionOrderPage = distributionOrderService.getDistributionOrderPage(distributionOrderSearchParams); return ResultUtil.data(distributionOrderPage); diff --git a/seller-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupStoreController.java index 9a2affbb..261a0037 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/CategoryParameterGroupStoreController.java @@ -1,21 +1,15 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.goods.entity.dos.CategoryParameterGroup; -import cn.lili.modules.goods.entity.dos.Parameters; import cn.lili.modules.goods.entity.vos.ParameterGroupVO; import cn.lili.modules.goods.service.CategoryParameterGroupService; -import cn.lili.modules.goods.service.ParametersService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; -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.List; @@ -23,17 +17,16 @@ import java.util.List; * 店铺端,分类绑定参数组管理接口 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @RestController @Api(tags = "店铺端,分类绑定参数组管理接口") -@RequestMapping("/store/goods/category/parameters") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/goods/categoryParameters") public class CategoryParameterGroupStoreController { - private final ParametersService parametersService; - private final CategoryParameterGroupService categoryParameterGroupService; + + @Autowired + private CategoryParameterGroupService categoryParameterGroupService; @ApiOperation(value = "查询某分类下绑定的参数信息") @GetMapping(value = "/{category_id}") @@ -42,24 +35,4 @@ public class CategoryParameterGroupStoreController { return categoryParameterGroupService.getCategoryParams(categoryId); } - @ApiOperation(value = "编辑或更新数据") - @PostMapping(value = "/save") - public ResultMessage saveOrUpdate(CategoryParameterGroup categoryParameterGroup) { - - if (categoryParameterGroupService.save(categoryParameterGroup)) { - return ResultUtil.data(categoryParameterGroup); - } - return ResultUtil.error(ResultCode.ERROR); - } - - @ApiOperation(value = "通过id删除参数组") - @DeleteMapping(value = "/{id}") - public ResultMessage delAllByIds(@PathVariable String id) { - //删除参数 - parametersService.remove(new QueryWrapper().eq("group_id", id)); - //删除参数组 - categoryParameterGroupService.removeById(id); - return ResultUtil.success(ResultCode.SUCCESS); - } - } diff --git a/seller-api/src/main/java/cn/lili/controller/goods/CategorySpecificationStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/CategorySpecificationStoreController.java index 2b6122e9..e8c52780 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/CategorySpecificationStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/CategorySpecificationStoreController.java @@ -1,22 +1,15 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.goods.entity.dos.CategorySpecification; -import cn.lili.modules.goods.entity.vos.CategorySpecificationVO; -import cn.lili.modules.goods.entity.vos.GoodsSpecValueVO; +import cn.lili.modules.goods.entity.dos.Specification; import cn.lili.modules.goods.service.CategorySpecificationService; -import cn.lili.modules.goods.service.SpecificationService; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; -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.List; @@ -24,50 +17,22 @@ import java.util.List; * 店铺端,商品分类规格接口 * * @author pikachu - * @date 2020-02-27 15:18:56 + * @since 2020-02-27 15:18:56 */ @RestController @Api(tags = "店铺端,商品分类规格接口") -@RequestMapping("/store/goods/category/spec") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/goods/categorySpec") public class CategorySpecificationStoreController { - - private final CategorySpecificationService categorySpecificationService; - - private final SpecificationService specificationService; + @Autowired + private CategorySpecificationService categorySpecificationService; @ApiOperation(value = "查询某分类下绑定的规格信息") @GetMapping(value = "/{category_id}") @ApiImplicitParam(name = "category_id", value = "分类id", required = true, dataType = "String", paramType = "path") - public List getCategorySpec(@PathVariable("category_id") String categoryId) { + public List getCategorySpec(@PathVariable("category_id") String categoryId) { return categorySpecificationService.getCategorySpecList(categoryId); } - @ApiOperation(value = "查询某分类下绑定的规格信息,商品操作使用") - @GetMapping(value = "/goods/{category_id}") - @ApiImplicitParam(name = "category_id", value = "分类id", required = true, dataType = "String", paramType = "path") - public List getSpec(@PathVariable("category_id") String categoryId) { - return specificationService.getGoodsSpecValue(categoryId); - } - - - @ApiOperation(value = "保存某分类下绑定的规格信息") - @PostMapping(value = "/{category_id}") - @ApiImplicitParams({ - @ApiImplicitParam(name = "category_id", value = "分类id", required = true, paramType = "path", dataType = "String"), - @ApiImplicitParam(name = "category_specs", value = "规格id数组", required = true, paramType = "query", dataType = "String[]") - }) - public ResultMessage saveCategoryBrand(@PathVariable("category_id") String categoryId, @RequestParam("category_specs") String[] categorySpecs) { - //删除分类规格绑定信息 - this.categorySpecificationService.remove(new QueryWrapper().eq("category_id", categoryId)); - //绑定规格信息 - for (String specId : categorySpecs) { - CategorySpecification categoryBrand = new CategorySpecification(categoryId, specId); - categorySpecificationService.save(categoryBrand); - } - return ResultUtil.success(ResultCode.SUCCESS); - } } diff --git a/seller-api/src/main/java/cn/lili/controller/goods/CategoryStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/CategoryStoreController.java index e8901915..362d46b0 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/CategoryStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/CategoryStoreController.java @@ -1,7 +1,7 @@ package cn.lili.controller.goods; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.vos.CategoryBrandVO; import cn.lili.modules.goods.entity.vos.CategoryVO; @@ -12,49 +12,50 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; -import org.springframework.transaction.annotation.Transactional; 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.List; +import java.util.Objects; /** * 店铺端,商品分类接口 * * @author Chopper - * @date 2021/2/20 2:26 下午 + * @since 2021/2/20 2:26 下午 */ @RestController @Api(tags = "店铺端,商品分类接口") @RequestMapping("/store/goods/category") @CacheConfig(cacheNames = "category") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CategoryStoreController { /** * 分类 */ - private final CategoryService categoryService; + @Autowired + private CategoryService categoryService; /** * 分类品牌 */ - private final CategoryBrandService categoryBrandService; + @Autowired + private CategoryBrandService categoryBrandService; /** * 店铺详情 */ - private final StoreDetailService storeDetailService; + @Autowired + private StoreDetailService storeDetailService; @ApiOperation(value = "获取店铺经营的分类") @GetMapping(value = "/all") public ResultMessage> getListAll() { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); //获取店铺经营范围 - String goodsManagementCategory = storeDetailService.getStoreDetail(UserContext.getCurrentUser().getStoreId()).getGoodsManagementCategory(); + String goodsManagementCategory = storeDetailService.getStoreDetail(storeId).getGoodsManagementCategory(); return ResultUtil.data(this.categoryService.getStoreCategory(goodsManagementCategory.split(","))); } diff --git a/seller-api/src/main/java/cn/lili/controller/goods/DraftGoodsStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/DraftGoodsStoreController.java index 5f936c5e..2e3d1c86 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/DraftGoodsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/DraftGoodsStoreController.java @@ -1,9 +1,10 @@ package cn.lili.controller.goods; import cn.lili.common.enums.ResultCode; -import cn.lili.common.security.AuthUser; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.DraftGoods; import cn.lili.modules.goods.entity.dto.DraftGoodsDTO; @@ -13,65 +14,59 @@ import cn.lili.modules.goods.service.DraftGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Objects; + /** * 店铺端,草稿商品接口 * * @author paulG - * @date 2021/2/20 2:26 下午 - * + * @since 2021/2/20 2:26 下午 */ @RestController @Api(tags = "店铺端,草稿商品接口") -@RequestMapping("/store/draft/goods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/goods/draftGoods") public class DraftGoodsStoreController { - - private final DraftGoodsService draftGoodsService; + @Autowired + private DraftGoodsService draftGoodsService; @ApiOperation(value = "分页获取草稿商品列表") @GetMapping(value = "/page") public ResultMessage> getDraftGoodsByPage(DraftGoodsSearchParams searchParams) { - searchParams.setStoreId(UserContext.getCurrentUser().getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + searchParams.setStoreId(storeId); return ResultUtil.data(draftGoodsService.getDraftGoods(searchParams)); } @ApiOperation(value = "获取草稿商品") @GetMapping(value = "/{id}") public ResultMessage getDraftGoods(@PathVariable String id) { - DraftGoodsVO draftGoods = draftGoodsService.getDraftGoods(id); - if (!UserContext.getCurrentUser().getStoreId().equals(draftGoods.getStoreId())) { - return ResultUtil.error(ResultCode.USER_AUTHORITY_ERROR); - } + DraftGoodsVO draftGoods = OperationalJudgment.judgment(draftGoodsService.getDraftGoods(id)); return ResultUtil.data(draftGoods); } @ApiOperation(value = "保存草稿商品") @PostMapping(value = "/save", consumes = "application/json", produces = "application/json") public ResultMessage saveDraftGoods(@RequestBody DraftGoodsDTO draftGoodsVO) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); if (draftGoodsVO.getStoreId() == null) { - AuthUser currentUser = UserContext.getCurrentUser(); - draftGoodsVO.setStoreId(currentUser.getStoreId()); - } else if (draftGoodsVO.getStoreId() != null && !UserContext.getCurrentUser().getStoreId().equals(draftGoodsVO.getStoreId())) { - return ResultUtil.error(ResultCode.USER_AUTHORITY_ERROR); + draftGoodsVO.setStoreId(storeId); + } else if (draftGoodsVO.getStoreId() != null && !storeId.equals(draftGoodsVO.getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } draftGoodsService.saveGoodsDraft(draftGoodsVO); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "删除草稿商品") @DeleteMapping(value = "/{id}") public ResultMessage deleteDraftGoods(@PathVariable String id) { - DraftGoods draftGoods = draftGoodsService.getById(id); - if (!draftGoods.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { - return ResultUtil.error(ResultCode.USER_AUTHORITY_ERROR); - } + OperationalJudgment.judgment(draftGoodsService.getDraftGoods(id)); draftGoodsService.deleteGoodsDraft(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/seller-api/src/main/java/cn/lili/controller/goods/GoodsGalleryController.java b/seller-api/src/main/java/cn/lili/controller/goods/GoodsGalleryController.java deleted file mode 100644 index cfb68471..00000000 --- a/seller-api/src/main/java/cn/lili/controller/goods/GoodsGalleryController.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.lili.controller.goods; - -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; -import cn.lili.common.vo.SearchVO; -import cn.lili.modules.goods.entity.dos.GoodsGallery; -import cn.lili.modules.goods.service.GoodsGalleryService; -import com.baomidou.mybatisplus.core.metadata.IPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 店铺端,商品相册接口 - * - * @author pikachu - * @date 2020-03-13 11:18:56 - */ -@RestController -@Api(tags = "店铺端,商品相册接口") -@RequestMapping("/store/goodsGallery") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class GoodsGalleryController { - - private final GoodsGalleryService goodsGalleryService; - - @ApiOperation(value = "通过id获取") - @GetMapping(value = "/get/{id}") - public ResultMessage get(@PathVariable String id) { - - GoodsGallery goodsGallery = goodsGalleryService.getById(id); - return ResultUtil.data(goodsGallery); - } - - @ApiOperation(value = "获取全部数据") - @GetMapping(value = "/getAll") - public ResultMessage> getAll() { - - List list = goodsGalleryService.list(); - return ResultUtil.data(list); - } - - @ApiOperation(value = "分页获取") - @GetMapping(value = "/getByPage") - public ResultMessage> getByPage(GoodsGallery entity, - SearchVO searchVo, - PageVO page) { - IPage data = goodsGalleryService.page(PageUtil.initPage(page), PageUtil.initWrapper(entity, searchVo)); - return ResultUtil.data(data); - } - - @ApiOperation(value = "添加商品相册") - @PostMapping(value = "/save") - public ResultMessage save(GoodsGallery goodsGallery) { - - if (goodsGalleryService.save(goodsGallery)) { - return ResultUtil.data(goodsGallery); - } - return ResultUtil.error(ResultCode.ERROR); - } - - @ApiOperation(value = "修改商品相册") - @PostMapping(value = "/update") - public ResultMessage update(GoodsGallery goodsGallery) { - - if (goodsGalleryService.updateById(goodsGallery)) { - return ResultUtil.data(goodsGallery); - } - return ResultUtil.error(ResultCode.ERROR); - } - - @ApiOperation(value = "批量删除") - @DeleteMapping(value = "/delByIds/{ids}") - public ResultMessage delAllByIds(@PathVariable List ids) { - - goodsGalleryService.removeByIds(ids); - return ResultUtil.success(ResultCode.SUCCESS); - } -} diff --git a/seller-api/src/main/java/cn/lili/controller/goods/GoodsImportController.java b/seller-api/src/main/java/cn/lili/controller/goods/GoodsImportController.java new file mode 100644 index 00000000..a2110c7e --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/goods/GoodsImportController.java @@ -0,0 +1,45 @@ +package cn.lili.controller.goods; + +import cn.lili.common.context.ThreadContextHolder; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.goods.service.GoodsImportService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author chc + * @since 2022/6/2114:46 + */ +@Api(tags = "商品导入") +@RestController +@RequestMapping("/store/goods/import") +public class GoodsImportController { + @Autowired + private GoodsImportService goodsImportService; + + + @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @ApiOperation(value = "上传文件,商品批量添加") + public ResultMessage importExcel(@RequestPart("files") MultipartFile files) throws Exception { + goodsImportService.importExcel(files); + return ResultUtil.success(ResultCode.SUCCESS); + } + + + @ApiOperation(value = "下载导入模板", produces = "application/octet-stream") + @GetMapping(value = "/downLoad") + public void download() { + HttpServletResponse response = ThreadContextHolder.getHttpResponse(); + + goodsImportService.download(response); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/goods/GoodsLabelStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/GoodsLabelStoreController.java index fe1a3407..231617b4 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/GoodsLabelStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/GoodsLabelStoreController.java @@ -1,61 +1,66 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.store.entity.dos.StoreGoodsLabel; -import cn.lili.modules.store.entity.vos.StoreGoodsLabelVO; -import cn.lili.modules.store.service.StoreGoodsLabelService; +import cn.lili.modules.goods.entity.dos.StoreGoodsLabel; +import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO; +import cn.lili.modules.goods.service.StoreGoodsLabelService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Objects; /** * 店铺端,店铺分类接口 * * @author Bulbasaur - * @date 2020/11/17 2:32 下午 + * @since 2020/11/17 2:32 下午 */ @Api(tags = "店铺端,店铺分类接口") @RestController @RequestMapping("/store/goods/label") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsLabelStoreController { /** * 店铺分类 */ - private final StoreGoodsLabelService storeGoodsLabelService; + @Autowired + private StoreGoodsLabelService storeGoodsLabelService; @ApiOperation(value = "获取当前店铺商品分类列表") @GetMapping public ResultMessage> list() { - return ResultUtil.data(storeGoodsLabelService.listByStoreId(UserContext.getCurrentUser().getStoreId())); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(storeGoodsLabelService.listByStoreId(storeId)); } @ApiImplicitParam(name = "id", value = "店铺商品分类ID", required = true, paramType = "path") @ApiOperation(value = "获取店铺商品分类详情") @GetMapping("/get/{id}") public ResultMessage getStoreGoodsLabel(@PathVariable String id) { - return ResultUtil.data(storeGoodsLabelService.getById(id)); + return ResultUtil.data(OperationalJudgment.judgment(storeGoodsLabelService.getById(id))); } @ApiOperation(value = "添加店铺商品分类") @PostMapping - public ResultMessage add(StoreGoodsLabel storeGoodsLabel) { + public ResultMessage add(@Validated StoreGoodsLabel storeGoodsLabel) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + storeGoodsLabel.setStoreId(storeId); return ResultUtil.data(storeGoodsLabelService.addStoreGoodsLabel(storeGoodsLabel)); } @ApiOperation(value = "修改店铺商品分类") @PutMapping - public ResultMessage edit(StoreGoodsLabel storeGoodsLabel) { + public ResultMessage edit(@Validated StoreGoodsLabel storeGoodsLabel) { + OperationalJudgment.judgment(storeGoodsLabelService.getById(storeGoodsLabel.getId())); return ResultUtil.data(storeGoodsLabelService.editStoreGoodsLabel(storeGoodsLabel)); } @@ -63,7 +68,8 @@ public class GoodsLabelStoreController { @ApiOperation(value = "删除店铺商品分类") @DeleteMapping("/{id}") public ResultMessage delete(@PathVariable String id) { + OperationalJudgment.judgment(storeGoodsLabelService.getById(id)); storeGoodsLabelService.removeStoreGoodsLabel(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java index 7c037a1a..9862fa33 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java @@ -1,9 +1,11 @@ package cn.lili.controller.goods; +import cn.lili.common.aop.annotation.DemoSite; import cn.lili.common.enums.ResultCode; -import cn.lili.common.security.AuthUser; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.Goods; import cn.lili.modules.goods.entity.dos.GoodsSku; @@ -16,54 +18,70 @@ import cn.lili.modules.goods.entity.vos.GoodsVO; import cn.lili.modules.goods.entity.vos.StockWarningVO; import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.goods.service.GoodsSkuService; +import cn.lili.modules.statistics.aop.PageViewPoint; +import cn.lili.modules.statistics.aop.enums.PageViewEnum; +import cn.lili.modules.store.entity.dos.StoreDetail; import cn.lili.modules.store.service.StoreDetailService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; /** * 店铺端,商品接口 * * @author pikachu - * @date 2020-02-23 15:18:56 + * @since 2020-02-23 15:18:56 */ @RestController +@Slf4j @Api(tags = "店铺端,商品接口") -@RequestMapping("/store/goods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/goods/goods") public class GoodsStoreController { - //商品 - private final GoodsService goodsService; - //商品sku - private final GoodsSkuService goodsSkuService; - //店铺详情 - private final StoreDetailService storeDetailService; + /** + * 商品 + */ + @Autowired + private GoodsService goodsService; + /** + * 商品sku + */ + @Autowired + private GoodsSkuService goodsSkuService; + /** + * 店铺详情 + */ + @Autowired + private StoreDetailService storeDetailService; @ApiOperation(value = "分页获取商品列表") @GetMapping(value = "/list") public ResultMessage> getByPage(GoodsSearchParams goodsSearchParams) { - //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); - goodsSearchParams.setStoreId(tokenUser.getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + goodsSearchParams.setStoreId(storeId); return ResultUtil.data(goodsService.queryByParams(goodsSearchParams)); } @ApiOperation(value = "分页获取商品Sku列表") @GetMapping(value = "/sku/list") public ResultMessage> getSkuByPage(GoodsSearchParams goodsSearchParams) { - //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); - goodsSearchParams.setStoreId(tokenUser.getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + goodsSearchParams.setStoreId(storeId); return ResultUtil.data(goodsSkuService.getGoodsSkuByPage(goodsSearchParams)); } @@ -71,10 +89,11 @@ public class GoodsStoreController { @GetMapping(value = "/list/stock") public ResultMessage getWarningStockByPage(GoodsSearchParams goodsSearchParams) { //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); - Integer stockWarnNum = storeDetailService.getStoreDetail(tokenUser.getStoreId()).getStockWarning(); - goodsSearchParams.setStoreId(tokenUser.getStoreId()); - goodsSearchParams.setQuantity(storeDetailService.getStoreDetail(tokenUser.getStoreId()).getStockWarning()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + StoreDetail storeDetail = OperationalJudgment.judgment(storeDetailService.getStoreDetail(storeId)); + Integer stockWarnNum = storeDetail.getStockWarning(); + goodsSearchParams.setStoreId(storeId); + goodsSearchParams.setLeQuantity(stockWarnNum); goodsSearchParams.setMarketEnable(GoodsStatusEnum.UPPER.name()); IPage goodsSku = goodsSkuService.getGoodsSkuByPage(goodsSearchParams); StockWarningVO stockWarning = new StockWarningVO(stockWarnNum, goodsSku); @@ -85,86 +104,105 @@ public class GoodsStoreController { @ApiOperation(value = "通过id获取") @GetMapping(value = "/get/{id}") public ResultMessage get(@PathVariable String id) { - AuthUser tokenUser = UserContext.getCurrentUser(); - GoodsVO goods = goodsService.getGoodsVO(id); - if (tokenUser.getStoreId().equals(goods.getStoreId())) { - return ResultUtil.data(goods); - } - return ResultUtil.error(ResultCode.USER_AUTHORITY_ERROR); + GoodsVO goods = OperationalJudgment.judgment(goodsService.getGoodsVO(id)); + return ResultUtil.data(goods); } @ApiOperation(value = "新增商品") @PostMapping(value = "/create", consumes = "application/json", produces = "application/json") - public ResultMessage save(@RequestBody GoodsOperationDTO goodsOperationDTO) { - + public ResultMessage save(@Valid @RequestBody GoodsOperationDTO goodsOperationDTO) { goodsService.addGoods(goodsOperationDTO); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } @ApiOperation(value = "修改商品") @PutMapping(value = "/update/{goodsId}", consumes = "application/json", produces = "application/json") public ResultMessage update(@RequestBody GoodsOperationDTO goodsOperationDTO, @PathVariable String goodsId) { goodsService.editGoods(goodsOperationDTO, goodsId); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } + @DemoSite @ApiOperation(value = "下架商品", notes = "下架商品时使用") @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "query", allowMultiple = true) @PutMapping(value = "/under") public ResultMessage underGoods(@RequestParam List goodsId) { - if (goodsService.updateGoodsMarketAble(goodsId, GoodsStatusEnum.DOWN, "商家下架")) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + goodsService.updateGoodsMarketAble(goodsId, GoodsStatusEnum.DOWN, "商家下架"); + return ResultUtil.success(); } @ApiOperation(value = "上架商品", notes = "上架商品时使用") @PutMapping(value = "/up") @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "query", allowMultiple = true) public ResultMessage unpGoods(@RequestParam List goodsId) { - if (goodsService.updateGoodsMarketAble(goodsId, GoodsStatusEnum.UPPER, "")) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + goodsService.updateGoodsMarketAble(goodsId, GoodsStatusEnum.UPPER, ""); + return ResultUtil.success(); } + @DemoSite @ApiOperation(value = "删除商品") @PutMapping(value = "/delete") @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "query", allowMultiple = true) public ResultMessage deleteGoods(@RequestParam List goodsId) { - if (goodsService.deleteGoods(goodsId)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + goodsService.deleteGoods(goodsId); + return ResultUtil.success(); } @ApiOperation(value = "设置商品运费模板") @PutMapping(value = "/freight") @ApiImplicitParams({ @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "query", allowMultiple = true), - @ApiImplicitParam(name = "freightPayer", value = "运费承担者", required = true, paramType = "query"), @ApiImplicitParam(name = "templateId", value = "运费模板ID", required = true, paramType = "query") }) - public ResultMessage freight(@RequestParam List goodsId, @RequestParam String freightPayer, @RequestParam String templateId) { - if (goodsService.freight(goodsId, freightPayer, templateId)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + public ResultMessage freight(@RequestParam List goodsId, @RequestParam String templateId) { + goodsService.freight(goodsId, templateId); + return ResultUtil.success(); } @ApiOperation(value = "根据goodsId分页获取商品规格列表") @GetMapping(value = "/sku/{goodsId}/list") public ResultMessage> getSkuByList(@PathVariable String goodsId) { - - return ResultUtil.data(goodsSkuService.getGoodsListByGoodsId(goodsId)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(goodsSkuService.getGoodsSkuVOList(goodsSkuService.list(new LambdaQueryWrapper().eq(GoodsSku::getGoodsId, goodsId).eq(GoodsSku::getStoreId, storeId)))); } @ApiOperation(value = "修改商品库存") @PutMapping(value = "/update/stocks", consumes = "application/json") public ResultMessage updateStocks(@RequestBody List updateStockList) { - goodsSkuService.updateStocks(updateStockList); - return ResultUtil.success(ResultCode.SUCCESS); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + // 获取商品skuId集合 + List goodsSkuIds = updateStockList.stream().map(GoodsSkuStockDTO::getSkuId).collect(Collectors.toList()); + // 根据skuId集合查询商品信息 + List goodsSkuList = goodsSkuService.list(new LambdaQueryWrapper().in(GoodsSku::getId, goodsSkuIds).eq(GoodsSku::getStoreId, storeId)); + // 过滤不符合当前店铺的商品 + List filterGoodsSkuIds = goodsSkuList.stream().map(GoodsSku::getId).collect(Collectors.toList()); + List collect = updateStockList.stream().filter(i -> filterGoodsSkuIds.contains(i.getSkuId())).collect(Collectors.toList()); + goodsSkuService.updateStocks(collect); + return ResultUtil.success(); + } + + @ApiOperation(value = "通过id获取商品信息") + @ApiImplicitParams({ + @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path"), + @ApiImplicitParam(name = "skuId", value = "skuId", required = true, paramType = "path") + }) + @GetMapping(value = "/sku/{goodsId}/{skuId}") + @PageViewPoint(type = PageViewEnum.SKU, id = "#id") + public ResultMessage> getSku(@NotNull(message = "商品ID不能为空") @PathVariable("goodsId") String goodsId, + @NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId) { + try { + // 读取选中的列表 + Map map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId); + return ResultUtil.data(map); + } catch (ServiceException se) { + log.info(se.getMsg(), se); + throw se; + } catch (Exception e) { + log.error(ResultCode.GOODS_ERROR.message(), e); + return ResultUtil.error(ResultCode.GOODS_ERROR); + } + } } diff --git a/seller-api/src/main/java/cn/lili/controller/goods/GoodsUnitStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/GoodsUnitStoreController.java index 5e5d032f..4b9907cc 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/GoodsUnitStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/GoodsUnitStoreController.java @@ -1,18 +1,16 @@ package cn.lili.controller.goods; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.GoodsUnit; import cn.lili.modules.goods.service.GoodsUnitService; +import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,16 +19,14 @@ import org.springframework.web.bind.annotation.RestController; * 店铺端,商品计量单位接口 * * @author Bulbasaur - * @date 2020/11/26 16:15 + * @since 2020/11/26 16:15 */ @RestController @Api(tags = "店铺端,商品计量单位接口") -@RequestMapping("/store/goods/unit") -@Transactional(rollbackFor = Exception.class) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/goods/goodsUnit") public class GoodsUnitStoreController { - - private final GoodsUnitService goodsUnitService; + @Autowired + private GoodsUnitService goodsUnitService; @ApiOperation(value = "分页获取商品计量单位") diff --git a/seller-api/src/main/java/cn/lili/controller/goods/SpecValuesStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/SpecValuesStoreController.java deleted file mode 100644 index 2afcd64c..00000000 --- a/seller-api/src/main/java/cn/lili/controller/goods/SpecValuesStoreController.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.lili.controller.goods; - - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.goods.entity.dos.SpecValues; -import cn.lili.modules.goods.service.SpecValuesService; -import com.baomidou.mybatisplus.core.metadata.IPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 店铺端,规格项管理接口 - * - * @author pikachu - * @date 2020-02-18 15:18:56 - */ -@RestController -@Api(tags = "店铺端,规格项管理接口") -@RequestMapping("/store/goods/spec-values") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class SpecValuesStoreController { - - private final SpecValuesService specValuesService; - - @GetMapping(value = "/values/{id}") - @ApiImplicitParam(name = "id", value = "规格项ID", required = true, dataType = "String", paramType = "path") - @ApiOperation(value = "查询规格值列表") - public ResultMessage> list(@PathVariable("id") String id, String specVal, PageVO pageVo) { - return ResultUtil.data(specValuesService.queryByParams(id, specVal, pageVo)); - } - - @ApiOperation(value = "保存规格值") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "商品规格ID", required = true, paramType = "path"), - @ApiImplicitParam(name = "specValue", value = "商品项", required = true, allowMultiple = true, paramType = "query") - }) - @PostMapping(value = "/save/{id}") - public ResultMessage> saveSpecValue(@PathVariable("id") String specId, - @NotNull(message = "至少添加一个规格值") @RequestParam(value = "spec_value") String[] specValue) { - //重新添加 - List list = specValuesService.addSpecValue(specId, specValue); - return ResultUtil.data(list); - } - - -} diff --git a/seller-api/src/main/java/cn/lili/controller/goods/SpecificationStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/SpecificationStoreController.java index 2c53173f..2d944079 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/SpecificationStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/SpecificationStoreController.java @@ -1,24 +1,16 @@ package cn.lili.controller.goods; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.PageVO; -import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.dos.Specification; -import cn.lili.modules.goods.entity.dto.SpecificationSearchParams; -import cn.lili.modules.goods.entity.vos.SpecificationVO; -import cn.lili.modules.goods.service.SpecificationService; -import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.lili.modules.goods.service.CategorySpecificationService; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -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 javax.validation.Valid; import java.util.List; @@ -26,41 +18,20 @@ import java.util.List; * 店铺端,规格管理接口 * * @author pikachu - * @date 2020-02-18 15:18:56 + * @since 2020-02-18 15:18:56 */ @RestController -@Api(tags = "店铺端,规格管理接口") +@Api(tags = "店铺端,规格接口") @RequestMapping("/store/goods/spec") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SpecificationStoreController { - private final SpecificationService specificationService; + @Autowired + private CategorySpecificationService categorySpecificationService; - - @GetMapping(value = "/page") - @ApiOperation(value = "分页获取") - public ResultMessage> getByPage(SpecificationSearchParams searchParams, PageVO pageVo) { - searchParams.setDeleteFlag(false); - return ResultUtil.data(specificationService.getSpecificationByPage(searchParams, pageVo)); + @GetMapping(value = "/{categoryId}") + @ApiOperation(value = "获取分类规格") + public List getSpecifications(@PathVariable String categoryId) { + return categorySpecificationService.getCategorySpecList(categoryId); } - @PostMapping - @ApiOperation(value = "添加规格") - public ResultMessage save(@Valid SpecificationVO parameters) { - if (parameters.getStoreId() == null) { - parameters.setStoreId(UserContext.getCurrentUser().getId()); - } - if (specificationService.addSpecification(parameters) != null) { - return ResultUtil.data(parameters); - } - return ResultUtil.error(ResultCode.ERROR); - } - - @DeleteMapping(value = "/{ids}") - @ApiImplicitParam(name = "ids", value = "规格ID", required = true, dataType = "String", allowMultiple = true, paramType = "path") - @ApiOperation(value = "批量删除") - public ResultMessage delAllByIds(@PathVariable List ids) { - specificationService.deleteSpecification(ids); - return ResultUtil.success(ResultCode.SUCCESS); - } } diff --git a/seller-api/src/main/java/cn/lili/controller/trade/BillStoreController.java b/seller-api/src/main/java/cn/lili/controller/member/BillStoreController.java similarity index 59% rename from seller-api/src/main/java/cn/lili/controller/trade/BillStoreController.java rename to seller-api/src/main/java/cn/lili/controller/member/BillStoreController.java index 846f8afa..addf91fc 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/BillStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/member/BillStoreController.java @@ -1,10 +1,13 @@ -package cn.lili.controller.trade; +package cn.lili.controller.member; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.context.ThreadContextHolder; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.StoreFlow; +import cn.lili.modules.order.order.service.StoreFlowService; import cn.lili.modules.store.entity.dos.Bill; import cn.lili.modules.store.entity.dto.BillSearchParams; import cn.lili.modules.store.entity.vos.BillListVO; @@ -14,27 +17,34 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.util.Objects; + /** * 店铺端,结算单接口 * * @author Chopper - * @date 2020/11/17 4:29 下午 + * @since 2020/11/17 4:29 下午 */ @RestController @Api(tags = "店铺端,结算单接口") -@RequestMapping("/store/bill") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/order/bill") public class BillStoreController { - private final BillService billService; + @Autowired + private BillService billService; + + @Autowired + private StoreFlowService storeFlowService; @ApiOperation(value = "获取结算单分页") @GetMapping(value = "/getByPage") public ResultMessage> getByPage(BillSearchParams billSearchParams) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + billSearchParams.setStoreId(storeId); return ResultUtil.data(billService.billPage(billSearchParams)); } @@ -42,7 +52,7 @@ public class BillStoreController { @ApiImplicitParam(name = "id", value = "结算单ID", required = true, paramType = "path", dataType = "String") @GetMapping(value = "/get/{id}") public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(billService.getById(id)); + return ResultUtil.data(OperationalJudgment.judgment(billService.getById(id))); } @ApiOperation(value = "获取商家结算单流水分页") @@ -52,7 +62,8 @@ public class BillStoreController { }) @GetMapping(value = "/{id}/getStoreFlow") public ResultMessage> getStoreFlow(@PathVariable String id, String flowType, PageVO pageVO) { - return ResultUtil.data(billService.getStoreFlow(id, flowType, pageVO)); + OperationalJudgment.judgment(billService.getById(id)); + return ResultUtil.data(storeFlowService.getStoreFlow(id, flowType, pageVO)); } @ApiOperation(value = "获取商家分销订单流水分页") @@ -61,16 +72,27 @@ public class BillStoreController { }) @GetMapping(value = "/{id}/getDistributionFlow") public ResultMessage> getDistributionFlow(@PathVariable String id, PageVO pageVO) { - return ResultUtil.data(billService.getDistributionFlow(id, pageVO)); + OperationalJudgment.judgment(billService.getById(id)); + return ResultUtil.data(storeFlowService.getDistributionFlow(id, pageVO)); } @ApiOperation(value = "核对结算单") @ApiImplicitParam(name = "id", value = "结算单ID", required = true, paramType = "path", dataType = "String") @PutMapping(value = "/check/{id}") public ResultMessage examine(@PathVariable String id) { - if (billService.check(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + OperationalJudgment.judgment(billService.getById(id)); + billService.check(id); + return ResultUtil.success(); } + + @ApiOperation(value = "下载结算单", produces = "application/octet-stream") + @ApiImplicitParam(name = "id", value = "结算单ID", required = true, paramType = "path", dataType = "String") + @GetMapping(value = "/downLoad/{id}") + public void downLoadDeliverExcel(@PathVariable String id) { + OperationalJudgment.judgment(billService.getById(id)); + HttpServletResponse response = ThreadContextHolder.getHttpResponse(); + billService.download(response, id); + + } + } diff --git a/seller-api/src/main/java/cn/lili/controller/member/FootprintStoreController.java b/seller-api/src/main/java/cn/lili/controller/member/FootprintStoreController.java new file mode 100644 index 00000000..e879a65b --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/member/FootprintStoreController.java @@ -0,0 +1,39 @@ +package cn.lili.controller.member; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dto.FootPrintQueryParams; +import cn.lili.modules.member.service.FootprintService; +import cn.lili.modules.search.entity.dos.EsGoodsIndex; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 商家端,浏览历史接口 + * + * @author chc + * @since 2022/6/2114:46 + */ +@RestController +@Api(tags = "商家端,浏览历史接口") +@RequestMapping("/store/member/footprint") +public class FootprintStoreController { + + /** + * 会员足迹 + */ + @Autowired + private FootprintService footprintService; + + @ApiOperation(value = "分页获取") + @GetMapping + public ResultMessage> getByPage(FootPrintQueryParams params) { + return ResultUtil.data(footprintService.footPrintPage(params)); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/trade/MemberEvaluationStoreController.java b/seller-api/src/main/java/cn/lili/controller/member/MemberEvaluationStoreController.java similarity index 64% rename from seller-api/src/main/java/cn/lili/controller/trade/MemberEvaluationStoreController.java rename to seller-api/src/main/java/cn/lili/controller/member/MemberEvaluationStoreController.java index 8e017259..007a348a 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/MemberEvaluationStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/member/MemberEvaluationStoreController.java @@ -1,9 +1,10 @@ -package cn.lili.controller.trade; +package cn.lili.controller.member; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.member.entity.dto.StoreEvaluationQueryParams; +import cn.lili.modules.member.entity.dto.EvaluationQueryParams; import cn.lili.modules.member.entity.vo.MemberEvaluationListVO; import cn.lili.modules.member.entity.vo.MemberEvaluationVO; import cn.lili.modules.member.service.MemberEvaluationService; @@ -12,36 +13,38 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Objects; + /** * 店铺端,商品评价管理接口 * * @author Bulbasaur - * @date 2020-02-25 14:10:16 + * @since 2020-02-25 14:10:16 */ @RestController @Api(tags = "店铺端,商品评价管理接口") -@RequestMapping("/store/memberEvaluation") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/member/evaluation") public class MemberEvaluationStoreController { - private final MemberEvaluationService memberEvaluationService; + @Autowired + private MemberEvaluationService memberEvaluationService; @ApiOperation(value = "分页获取会员评论列表") @GetMapping - public ResultMessage> getByPage(StoreEvaluationQueryParams storeEvaluationQueryParams) { - - return ResultUtil.data(memberEvaluationService.queryByParams(storeEvaluationQueryParams)); + public ResultMessage> getByPage(EvaluationQueryParams evaluationQueryParams) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + evaluationQueryParams.setStoreId(storeId); + return ResultUtil.data(memberEvaluationService.queryPage(evaluationQueryParams)); } @ApiOperation(value = "通过id获取") @ApiImplicitParam(name = "id", value = "评价ID", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/get/{id}") public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(memberEvaluationService.queryById(id)); + return ResultUtil.data(OperationalJudgment.judgment(memberEvaluationService.queryById(id))); } @ApiOperation(value = "回复评价") @@ -52,9 +55,8 @@ public class MemberEvaluationStoreController { }) @PutMapping(value = "/reply/{id}") public ResultMessage reply(@PathVariable String id, @RequestParam String reply, @RequestParam String replyImage) { - if (memberEvaluationService.reply(id, reply, replyImage)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + OperationalJudgment.judgment(memberEvaluationService.queryById(id)); + memberEvaluationService.reply(id, reply, replyImage); + return ResultUtil.success(); } } diff --git a/seller-api/src/main/java/cn/lili/controller/member/StoreUserController.java b/seller-api/src/main/java/cn/lili/controller/member/StoreUserController.java index 5ce3b034..3cae66aa 100644 --- a/seller-api/src/main/java/cn/lili/controller/member/StoreUserController.java +++ b/seller-api/src/main/java/cn/lili/controller/member/StoreUserController.java @@ -1,15 +1,17 @@ package cn.lili.controller.member; import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.store.entity.dos.Store; +import cn.lili.modules.store.service.StoreService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,15 +22,17 @@ import org.springframework.web.bind.annotation.RestController; * 店铺端,管理员接口 * * @author Chopper - * @date 2020/11/16 10:57 + * @since 2020/11/16 10:57 */ @RestController @Api(tags = "店铺端,管理员接口") -@RequestMapping("/store/user") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/member/user") public class StoreUserController { + @Autowired + private MemberService memberService; - private final MemberService memberService; + @Autowired + private StoreService storeService; @GetMapping(value = "/info") @@ -40,7 +44,18 @@ public class StoreUserController { member.setPassword(null); return ResultUtil.data(member); } - return ResultUtil.error(ResultCode.USER_NOT_LOGIN); + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + + @GetMapping(value = "") + @ApiOperation(value = "获取当前登录店铺接口") + public ResultMessage getStoreInfo() { + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser != null) { + Store store = storeService.getById(tokenUser.getStoreId()); + return ResultUtil.data(store); + } + throw new ServiceException(ResultCode.USER_NOT_LOGIN); } diff --git a/seller-api/src/main/java/cn/lili/controller/settings/StoreMessageController.java b/seller-api/src/main/java/cn/lili/controller/message/StoreMessageController.java similarity index 81% rename from seller-api/src/main/java/cn/lili/controller/settings/StoreMessageController.java rename to seller-api/src/main/java/cn/lili/controller/message/StoreMessageController.java index 4affe5d0..bac31ad2 100644 --- a/seller-api/src/main/java/cn/lili/controller/settings/StoreMessageController.java +++ b/seller-api/src/main/java/cn/lili/controller/message/StoreMessageController.java @@ -1,8 +1,9 @@ -package cn.lili.controller.settings; +package cn.lili.controller.message; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.message.entity.dos.StoreMessage; @@ -13,37 +14,38 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** * 店铺端,消息接口 * * @author Bulbasaur - * @date: 2020/11/22 14:23 + * @since 2020/11/22 14:23 */ @RestController @Api(tags = "店铺端,消息接口") -@RequestMapping("/store/message") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/message/storeMessage") public class StoreMessageController { /** * 商家消息 */ - private final StoreMessageService storeMessageService; + @Autowired + private StoreMessageService storeMessageService; @ApiOperation(value = "获取商家消息") @ApiImplicitParam(name = "status", value = "状态", required = true, paramType = "query") @GetMapping public ResultMessage> getPage(String status, PageVO pageVo) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); StoreMessageQueryVO storeMessageQueryVO = new StoreMessageQueryVO(); storeMessageQueryVO.setStatus(status); - storeMessageQueryVO.setStoreId(UserContext.getCurrentUser().getStoreId()); + storeMessageQueryVO.setStoreId(storeId); IPage page = storeMessageService.getPage(storeMessageQueryVO, pageVo); return ResultUtil.data(page); } @@ -52,10 +54,11 @@ public class StoreMessageController { @ApiOperation(value = "获取商家消息总汇") @GetMapping("/all") public ResultMessage> getPage(PageVO pageVo) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); //返回值定义 - Map map = new HashMap<>(); + Map map = new HashMap<>(4); StoreMessageQueryVO storeMessageQueryVO = new StoreMessageQueryVO(); - storeMessageQueryVO.setStoreId(UserContext.getCurrentUser().getStoreId()); + storeMessageQueryVO.setStoreId(storeId); //未读消息 storeMessageQueryVO.setStatus(MessageStatusEnum.UN_READY.name()); IPage page = storeMessageService.getPage(storeMessageQueryVO, pageVo); @@ -75,6 +78,7 @@ public class StoreMessageController { @ApiImplicitParam(name = "id", value = "店铺消息id", required = true, paramType = "path") @PutMapping("/{id}/read") public ResultMessage readMessage(@PathVariable String id) { + OperationalJudgment.judgment(storeMessageService.getById(id)); Boolean result = storeMessageService.editStatus(MessageStatusEnum.ALREADY_READY.name(), id); return ResultUtil.data(result); @@ -84,6 +88,7 @@ public class StoreMessageController { @ApiImplicitParam(name = "id", value = "店铺消息id", required = true, paramType = "path") @PutMapping("/{id}/reduction") public ResultMessage reductionMessage(@PathVariable String id) { + OperationalJudgment.judgment(storeMessageService.getById(id)); Boolean result = storeMessageService.editStatus(MessageStatusEnum.ALREADY_READY.name(), id); return ResultUtil.data(result); @@ -93,6 +98,7 @@ public class StoreMessageController { @ApiImplicitParam(name = "id", value = "店铺消息id", required = true, paramType = "path") @DeleteMapping("/{id}/delete") public ResultMessage deleteMessage(@PathVariable String id) { + OperationalJudgment.judgment(storeMessageService.getById(id)); Boolean result = storeMessageService.editStatus(MessageStatusEnum.ALREADY_REMOVE.name(), id); return ResultUtil.data(result); @@ -102,6 +108,7 @@ public class StoreMessageController { @ApiImplicitParam(name = "id", value = "店铺消息id", required = true, paramType = "path") @DeleteMapping("/{id}") public ResultMessage disabled(@PathVariable String id) { + OperationalJudgment.judgment(storeMessageService.getById(id)); Boolean result = storeMessageService.deleteByMessageId(id); return ResultUtil.data(result); } diff --git a/seller-api/src/main/java/cn/lili/controller/trade/AfterSaleStoreController.java b/seller-api/src/main/java/cn/lili/controller/order/AfterSaleStoreController.java similarity index 63% rename from seller-api/src/main/java/cn/lili/controller/trade/AfterSaleStoreController.java rename to seller-api/src/main/java/cn/lili/controller/order/AfterSaleStoreController.java index d7c5f70f..a8e99527 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/AfterSaleStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/order/AfterSaleStoreController.java @@ -1,50 +1,67 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.order.entity.dos.AfterSale; -import cn.lili.modules.order.order.entity.vo.AfterSaleSearchParams; -import cn.lili.modules.order.order.entity.vo.AfterSaleVO; -import cn.lili.modules.order.order.service.AfterSaleService; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams; +import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO; +import cn.lili.modules.order.aftersale.service.AfterSaleService; +import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; import cn.lili.modules.system.entity.vo.Traces; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Objects; /** * 店铺端,售后管理接口 * * @author Chopper - * @date 2020/11/17 4:29 下午 + * @since 2020/11/17 4:29 下午 */ @RestController @Api(tags = "店铺端,售后管理接口") -@RequestMapping("/store/afterSale") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/order/afterSale") public class AfterSaleStoreController { - private final AfterSaleService afterSaleService; + @Autowired + private AfterSaleService afterSaleService; @ApiOperation(value = "查看售后服务详情") @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") @GetMapping(value = "/{sn}") public ResultMessage get(@PathVariable String sn) { - return ResultUtil.data(afterSaleService.getAfterSale(sn)); + AfterSaleVO afterSale = OperationalJudgment.judgment(afterSaleService.getAfterSale(sn)); + return ResultUtil.data(afterSale); } @ApiOperation(value = "分页获取售后服务") @GetMapping(value = "/page") public ResultMessage> getByPage(AfterSaleSearchParams searchParams) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + searchParams.setStoreId(storeId); return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams)); } + @ApiOperation(value = "获取导出售后服务列表列表") + @GetMapping(value = "/exportAfterSaleOrder") + public ResultMessage> exportAfterSaleOrder(AfterSaleSearchParams searchParams) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + searchParams.setStoreId(storeId); + return ResultUtil.data(afterSaleService.exportAfterSaleOrder(searchParams)); + } + + @PreventDuplicateSubmissions @ApiOperation(value = "审核售后申请") @ApiImplicitParams({ @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, paramType = "path"), @@ -61,6 +78,7 @@ public class AfterSaleStoreController { return ResultUtil.data(afterSaleService.review(afterSaleSn, serviceStatus, remark,actualRefundPrice)); } + @PreventDuplicateSubmissions @ApiOperation(value = "卖家确认收货") @ApiImplicitParams({ @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, paramType = "path"), @@ -82,4 +100,11 @@ public class AfterSaleStoreController { return ResultUtil.data(afterSaleService.deliveryTraces(sn)); } + @ApiOperation(value = "获取商家售后收件地址") + @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") + @GetMapping(value = "/getStoreAfterSaleAddress/{sn}") + public ResultMessage getStoreAfterSaleAddress(@NotNull(message = "售后单号") @PathVariable("sn") String sn) { + return ResultUtil.data(afterSaleService.getStoreAfterSaleAddressDTO(sn)); + } + } diff --git a/seller-api/src/main/java/cn/lili/controller/trade/OrderComplaintStoreController.java b/seller-api/src/main/java/cn/lili/controller/order/OrderComplaintStoreController.java similarity index 63% rename from seller-api/src/main/java/cn/lili/controller/trade/OrderComplaintStoreController.java rename to seller-api/src/main/java/cn/lili/controller/order/OrderComplaintStoreController.java index 9f484bb7..72faab7b 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/OrderComplaintStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/order/OrderComplaintStoreController.java @@ -1,9 +1,10 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.OrderComplaint; @@ -16,43 +17,46 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Objects; + /** * 店铺端,交易投诉接口 * * @author paulG - * @date 2020/12/5 + * @since 2020/12/5 **/ @RestController @Api(tags = "店铺端,交易投诉接口") -@RequestMapping("/store/complain") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/order/complain") public class OrderComplaintStoreController { /** * 交易投诉 */ - private final OrderComplaintService orderComplaintService; + @Autowired + private OrderComplaintService orderComplaintService; /** * 投诉沟通 */ - private final OrderComplaintCommunicationService orderComplaintCommunicationService; + @Autowired + private OrderComplaintCommunicationService orderComplaintCommunicationService; @ApiOperation(value = "通过id获取") @ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path") @GetMapping(value = "/{id}") public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(orderComplaintService.getOrderComplainById(id)); + return ResultUtil.data(OperationalJudgment.judgment(orderComplaintService.getOrderComplainById(id))); } @ApiOperation(value = "分页获取") @GetMapping public ResultMessage> get(OrderComplaintSearchParams searchParams, PageVO pageVO) { - searchParams.setStoreId(UserContext.getCurrentUser().getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + searchParams.setStoreId(storeId); return ResultUtil.data(orderComplaintService.getOrderComplainByPage(searchParams, pageVO)); } @@ -63,42 +67,35 @@ public class OrderComplaintStoreController { }) @PostMapping("/communication") public ResultMessage addCommunication(@RequestParam String complainId, @RequestParam String content) { - AuthUser currentUser = UserContext.getCurrentUser(); - OrderComplaintCommunicationVO communicationVO = new OrderComplaintCommunicationVO(complainId, content, CommunicationOwnerEnum.STORE.name(), currentUser.getStoreId(), currentUser.getUsername()); - if (orderComplaintCommunicationService.addCommunication(communicationVO)) { - return ResultUtil.data(communicationVO); - } - return ResultUtil.error(ResultCode.ERROR); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); + OrderComplaintCommunicationVO communicationVO = new OrderComplaintCommunicationVO(complainId, content, CommunicationOwnerEnum.STORE.name(), currentUser.getUsername(), currentUser.getStoreId()); + orderComplaintCommunicationService.addCommunication(communicationVO); + return ResultUtil.success(); } @ApiOperation(value = "修改申诉信息") @PutMapping public ResultMessage update(OrderComplaintVO orderComplainVO) { - orderComplainVO.setStoreId(UserContext.getCurrentUser().getId()); - if (orderComplaintService.updateOrderComplain(orderComplainVO)) { - return ResultUtil.data(orderComplainVO); - } - return ResultUtil.error(ResultCode.ERROR); - + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + orderComplainVO.setStoreId(storeId); + orderComplaintService.updateOrderComplain(orderComplainVO); + return ResultUtil.data(orderComplainVO); } + @PreventDuplicateSubmissions @ApiOperation(value = "申诉") @PutMapping("/appeal") public ResultMessage appeal(StoreAppealVO storeAppealVO) { - //申诉接口 - if (orderComplaintService.appeal(storeAppealVO)) { - return ResultUtil.data(orderComplaintService.getOrderComplainById(storeAppealVO.getOrderComplaintId())); - } - return ResultUtil.error(ResultCode.ERROR); + orderComplaintService.appeal(storeAppealVO); + return ResultUtil.data(orderComplaintService.getOrderComplainById(storeAppealVO.getOrderComplaintId())); } + @PreventDuplicateSubmissions @ApiOperation(value = "修改状态") @PutMapping(value = "/status") public ResultMessage updateStatus(OrderComplaintOperationParams orderComplainVO) { - if (orderComplaintService.updateOrderComplainByStatus(orderComplainVO) != null) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + orderComplaintService.updateOrderComplainByStatus(orderComplainVO); + return ResultUtil.success(); } } diff --git a/seller-api/src/main/java/cn/lili/controller/trade/OrderLogStoreController.java b/seller-api/src/main/java/cn/lili/controller/order/OrderLogStoreController.java similarity index 72% rename from seller-api/src/main/java/cn/lili/controller/trade/OrderLogStoreController.java rename to seller-api/src/main/java/cn/lili/controller/order/OrderLogStoreController.java index 4b4c9852..36d9865e 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/OrderLogStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/order/OrderLogStoreController.java @@ -1,13 +1,14 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.trade.entity.dos.OrderLog; import cn.lili.modules.order.trade.service.OrderLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -20,20 +21,24 @@ import java.util.List; * 店铺端,订单日志接口 * * @author Chopper - * @date 2020/12/5 + * @since 2020/12/5 **/ @RestController @Api(tags = "店铺端,订单日志接口") -@RequestMapping("/store/orderLog") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/order/orderLog") public class OrderLogStoreController { - private final OrderLogService orderLogService; + @Autowired + private OrderLogService orderLogService; + + @Autowired + private OrderService orderService; @ApiOperation(value = "通过订单编号获取订单日志") @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, paramType = "path") @GetMapping(value = "/{orderSn}") public ResultMessage> get(@PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); return ResultUtil.data(orderLogService.getOrderLog(orderSn)); } } diff --git a/seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java b/seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java new file mode 100644 index 00000000..af8893f8 --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java @@ -0,0 +1,220 @@ +package cn.lili.controller.order; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.NumberUtil; +import cn.lili.common.aop.annotation.PreventDuplicateSubmissions; +import cn.lili.common.context.ThreadContextHolder; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dto.MemberAddressDTO; +import cn.lili.modules.member.service.StoreLogisticsService; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; +import cn.lili.modules.order.order.entity.dto.OrderSearchParams; +import cn.lili.modules.order.order.entity.vo.OrderDetailVO; +import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; +import cn.lili.modules.order.order.service.OrderPriceService; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.system.service.LogisticsService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Objects; + +/** + * 店铺端,订单接口 + * + * @author Chopper + * @since 2020/11/17 4:35 下午 + **/ +@Slf4j +@RestController +@RequestMapping("/store/order/order") +@Api(tags = "店铺端,订单接口") +public class OrderStoreController { + + /** + * 订单 + */ + @Autowired + private OrderService orderService; + /** + * 订单价格 + */ + @Autowired + private OrderPriceService orderPriceService; + /** + * 物流公司 + */ + @Autowired + private StoreLogisticsService storeLogisticsService; + + /** + * 快递 + */ + @Autowired + private LogisticsService logisticsService; + + + @ApiOperation(value = "查询订单列表") + @GetMapping + public ResultMessage> queryMineOrder(OrderSearchParams orderSearchParams) { + return ResultUtil.data(orderService.queryByParams(orderSearchParams)); + } + + + @ApiOperation(value = "订单明细") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") + }) + @GetMapping(value = "/{orderSn}") + public ResultMessage detail(@NotNull @PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); + return ResultUtil.data(orderService.queryDetail(orderSn)); + } + + @ApiOperation(value = "修改收货人信息") + @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path") + @PostMapping(value = "/update/{orderSn}/consignee") + public ResultMessage consignee(@NotNull(message = "参数非法") @PathVariable String orderSn, + @Valid MemberAddressDTO memberAddressDTO) { + return ResultUtil.data(orderService.updateConsignee(orderSn, memberAddressDTO)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "修改订单价格") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path"), + @ApiImplicitParam(name = "orderPrice", value = "订单价格", required = true, dataType = "Double", paramType = "query"), + }) + @PutMapping(value = "/update/{orderSn}/price") + public ResultMessage updateOrderPrice(@PathVariable String orderSn, + @NotNull(message = "订单价格不能为空") @RequestParam Double orderPrice) { + if (NumberUtil.isGreater(Convert.toBigDecimal(orderPrice), Convert.toBigDecimal(0))) { + return ResultUtil.data(orderPriceService.updatePrice(orderSn, orderPrice)); + } else { + return ResultUtil.error(ResultCode.ORDER_PRICE_ERROR); + } + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "订单发货") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path"), + @ApiImplicitParam(name = "logisticsNo", value = "发货单号", required = true, dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "logisticsId", value = "物流公司", required = true, dataType = "String", paramType = "query") + }) + @PostMapping(value = "/{orderSn}/delivery") + public ResultMessage delivery(@NotNull(message = "参数非法") @PathVariable String orderSn, + @NotNull(message = "发货单号不能为空") String logisticsNo, + @NotNull(message = "请选择物流公司") String logisticsId) { + return ResultUtil.data(orderService.delivery(orderSn, logisticsNo, logisticsId)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "订单顺丰发货") + @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path") + @PostMapping(value = "/{orderSn}/shunfeng/delivery") + public ResultMessage shunFengDelivery(@NotNull(message = "参数非法") @PathVariable String orderSn) { + return ResultUtil.data(orderService.shunFengDelivery(orderSn)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "取消订单") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path"), + @ApiImplicitParam(name = "reason", value = "取消原因", required = true, dataType = "String", paramType = "query") + }) + @PostMapping(value = "/{orderSn}/cancel") + public ResultMessage cancel(@PathVariable String orderSn, @RequestParam String reason) { + return ResultUtil.data(orderService.cancel(orderSn, reason)); + } + + @ApiOperation(value = "根据核验码获取订单信息") + @ApiImplicitParam(name = "verificationCode", value = "核验码", required = true, paramType = "path") + @GetMapping(value = "/getOrderByVerificationCode/{verificationCode}") + public ResultMessage getOrderByVerificationCode(@PathVariable String verificationCode) { + return ResultUtil.data(orderService.getOrderByVerificationCode(verificationCode)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "订单核验") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单号", required = true, paramType = "path"), + @ApiImplicitParam(name = "verificationCode", value = "核验码", required = true, paramType = "path") + }) + @PutMapping(value = "/take/{orderSn}/{verificationCode}") + public ResultMessage take(@PathVariable String orderSn, @PathVariable String verificationCode) { + return ResultUtil.data(orderService.take(orderSn, verificationCode)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "订单核验") + @ApiImplicitParams({ + @ApiImplicitParam(name = "verificationCode", value = "核验码", required = true, paramType = "path") + }) + @PutMapping(value = "/take/{verificationCode}") + public ResultMessage take(@PathVariable String verificationCode) { + return ResultUtil.data(orderService.take(verificationCode)); + } + + @ApiOperation(value = "查询物流踪迹") + @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") + @GetMapping(value = "/getTraces/{orderSn}") + public ResultMessage getTraces(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); + return ResultUtil.data(orderService.getTraces(orderSn)); + } + + @ApiOperation(value = "下载待发货的订单列表", produces = "application/octet-stream") + @GetMapping(value = "/downLoadDeliverExcel") + public void downLoadDeliverExcel() { + HttpServletResponse response = ThreadContextHolder.getHttpResponse(); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + //获取店铺已经选择物流公司列表 + List logisticsName = storeLogisticsService.getStoreSelectedLogisticsName(storeId); + //下载订单批量发货Excel + this.orderService.getBatchDeliverList(response, logisticsName); + + } + + @PostMapping(value = "/batchDeliver", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @ApiOperation(value = "上传文件进行订单批量发货") + public ResultMessage batchDeliver(@RequestPart("files") MultipartFile files) { + orderService.batchDeliver(files); + return ResultUtil.success(ResultCode.SUCCESS); + } + + @ApiOperation(value = "查询订单导出列表") + @GetMapping("/queryExportOrder") + public ResultMessage> queryExportOrder(OrderSearchParams orderSearchParams) { + return ResultUtil.data(orderService.queryExportOrder(orderSearchParams)); + } + + @PreventDuplicateSubmissions + @ApiOperation(value = "创建电子面单") + @PostMapping(value = "/{orderSn}/createElectronicsFaceSheet") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderSn", value = "订单号", required = true, paramType = "path"), + @ApiImplicitParam(name = "logisticsId", value = "物流公司", required = true, dataType = "String", paramType = "query") + }) + public ResultMessage createElectronicsFaceSheet(@NotNull(message = "参数非法") @PathVariable String orderSn, + @NotNull(message = "请选择物流公司") String logisticsId) { + return ResultUtil.data(logisticsService.labelOrder(orderSn, logisticsId)); + } +} \ No newline at end of file diff --git a/seller-api/src/main/java/cn/lili/controller/trade/ReceiptStoreController.java b/seller-api/src/main/java/cn/lili/controller/order/ReceiptStoreController.java similarity index 73% rename from seller-api/src/main/java/cn/lili/controller/trade/ReceiptStoreController.java rename to seller-api/src/main/java/cn/lili/controller/order/ReceiptStoreController.java index 2c24ba61..25c0e45f 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/ReceiptStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/order/ReceiptStoreController.java @@ -1,39 +1,46 @@ -package cn.lili.controller.trade; +package cn.lili.controller.order; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.order.order.entity.dos.Receipt; import cn.lili.modules.order.order.entity.dto.OrderReceiptDTO; import cn.lili.modules.order.order.entity.dto.ReceiptSearchParams; +import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.ReceiptService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Objects; + /** * 店铺端,发票接口 * * @author Bulbasaur - * @date 2020/11/28 14:09 + * @since 2020/11/28 14:09 **/ @RestController @Api(tags = "店铺端,发票接口") -@RequestMapping("/store/receipt") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/trade/receipt") public class ReceiptStoreController { - private final ReceiptService receiptService; + @Autowired + private ReceiptService receiptService; + + @Autowired + private OrderService orderService; @ApiOperation(value = "分页获取") @GetMapping public ResultMessage> getByPage(PageVO page, ReceiptSearchParams receiptSearchParams) { - receiptSearchParams.setStoreId(UserContext.getCurrentUser().getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + receiptSearchParams.setStoreId(storeId); return ResultUtil.data(receiptService.getReceiptData(receiptSearchParams, page)); } @@ -41,13 +48,14 @@ public class ReceiptStoreController { @ApiImplicitParam(name = "id", value = "发票ID", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/get/{id}") public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(receiptService.getById(id)); + return ResultUtil.data(OperationalJudgment.judgment(receiptService.getById(id))); } @ApiOperation(value = "开发票") @ApiImplicitParam(name = "id", value = "发票ID", required = true, dataType = "String", paramType = "path") @PostMapping(value = "/{id}/invoicing") public ResultMessage invoicing(@PathVariable String id) { + OperationalJudgment.judgment(receiptService.getById(id)); return ResultUtil.data(receiptService.invoicing(id)); } @@ -55,6 +63,7 @@ public class ReceiptStoreController { @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/get/orderSn/{orderSn}") public ResultMessage getByOrderSn(@PathVariable String orderSn) { + OperationalJudgment.judgment(orderService.getBySn(orderSn)); return ResultUtil.data(receiptService.getByOrderSn(orderSn)); } diff --git a/seller-api/src/main/java/cn/lili/controller/other/ArticleStoreController.java b/seller-api/src/main/java/cn/lili/controller/other/ArticleStoreController.java index 0af0cc9f..47375497 100644 --- a/seller-api/src/main/java/cn/lili/controller/other/ArticleStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/other/ArticleStoreController.java @@ -1,6 +1,6 @@ package cn.lili.controller.other; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.Article; import cn.lili.modules.page.entity.dto.ArticleSearchParams; @@ -11,7 +11,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -22,18 +21,18 @@ import org.springframework.web.bind.annotation.RestController; * 店铺端,文章接口 * * @author pikachu - * @date 2020-05-06 15:18:56 + * @since 2020-05-06 15:18:56 */ @RestController @Api(tags = "店铺端,文章接口") -@RequestMapping("/store/article") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/other/article") public class ArticleStoreController { /** * 文章 */ - private final ArticleService articleService; + @Autowired + private ArticleService articleService; @ApiOperation(value = "分页获取") @ApiImplicitParams({ diff --git a/seller-api/src/main/java/cn/lili/controller/other/LogisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/other/LogisticsStoreController.java new file mode 100644 index 00000000..3219474f --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/other/LogisticsStoreController.java @@ -0,0 +1,127 @@ +package cn.lili.controller.other; + + +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.service.StoreLogisticsService; +import cn.lili.modules.store.entity.dos.StoreLogistics; +import cn.lili.modules.store.entity.dto.StoreLogisticsCustomerDTO; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.ImSetting; +import cn.lili.modules.system.entity.dto.LogisticsSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.entity.vo.StoreLogisticsVO; +import cn.lili.modules.system.service.SettingService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 店铺端,物流公司接口 + * + * @author Bulbasaur + * @since 2020/11/22 14:23 + */ +@RestController +@Api(tags = "店铺端,物流公司接口") +@RequestMapping("/store/other/logistics") +public class LogisticsStoreController { + + /** + * 物流公司 + */ + @Autowired + private StoreLogisticsService storeLogisticsService; + + @Autowired + private SettingService settingService; + + @ApiOperation(value = "获取商家物流公司列表,如果已选择则checked有值") + @GetMapping + public ResultMessage> get() { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + //获取已开启的物流公司 + List storeLogistics = storeLogisticsService.getOpenStoreLogistics(storeId); + //获取未开启的物流公司 + List closeStoreLogistics = storeLogisticsService.getCloseStoreLogistics(storeId); + storeLogistics.addAll(closeStoreLogistics); + return ResultUtil.data(storeLogistics); + } + + @ApiOperation(value = "获取商家已选择物流公司列表") + @GetMapping("/getChecked") + public ResultMessage> getChecked() { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(storeLogisticsService.getStoreSelectedLogistics(storeId)); + } + + @ApiOperation(value = "选择物流公司") + @ApiImplicitParams({ + @ApiImplicitParam(name = "logisticsId", value = "物流公司ID", required = true, paramType = "path"), + }) + @PostMapping("/{logisticsId}") + public ResultMessage checked(@PathVariable String logisticsId,@RequestBody StoreLogisticsCustomerDTO storeLogisticsCustomerDTO) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(storeLogisticsService.add(logisticsId, storeId,storeLogisticsCustomerDTO)); + } + + + @ApiOperation(value = "取消选择物流公司") + @ApiImplicitParam(name = "id", value = "物流公司ID", required = true, paramType = "path") + @DeleteMapping(value = "/{id}") + public ResultMessage cancel(@PathVariable String id) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + boolean remove = storeLogisticsService.remove(new LambdaQueryWrapper().eq(StoreLogistics::getLogisticsId, id).eq(StoreLogistics::getStoreId, storeId)); + return ResultUtil.data(remove); + } + + @ApiOperation(value = "修改电子面单参数") + @ApiImplicitParams({ + @ApiImplicitParam(name = "logisticsId", value = "物流公司ID", required = true, paramType = "path"), + }) + @PutMapping("/{logisticsId}/updateStoreLogistics") + public ResultMessage updateStoreLogistics(@PathVariable String logisticsId,StoreLogisticsCustomerDTO storeLogisticsCustomerDTO){ + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(storeLogisticsService.update(logisticsId, storeId,storeLogisticsCustomerDTO)); + } + + @ApiOperation(value = "获取商家已选择物流公司并且使用电子面单列表") + @GetMapping("/getCheckedFaceSheet") + public ResultMessage> getCheckedFaceSheet() { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(storeLogisticsService.getStoreSelectedLogisticsUseFaceSheet(storeId)); + } + + @ApiOperation(value = "获取店铺-物流公司详细信息") + @ApiImplicitParam(name = "logisticsId", value = "物流公司ID", required = true, paramType = "path") + @GetMapping("/{logisticsId}/getStoreLogistics") + public ResultMessage getStoreLogistics(@PathVariable String logisticsId){ + return ResultUtil.data(storeLogisticsService.getStoreLogisticsInfo(logisticsId)); + } + + @ApiOperation(value = "获取IM接口前缀") + @GetMapping("/setting") + public ResultMessage getUrl() { + String logisticsType; + try { + Setting logisticsSettingVal = settingService.get(SettingEnum.LOGISTICS_SETTING.name()); + LogisticsSetting logisticsSetting = JSONUtil.toBean(logisticsSettingVal.getSettingValue(), LogisticsSetting.class); + logisticsType = logisticsSetting.getType(); + } catch (Exception e) { + throw new ServiceException(ResultCode.ORDER_LOGISTICS_ERROR); + } + return ResultUtil.data(logisticsType); + } + +} diff --git a/seller-api/src/main/java/cn/lili/controller/other/broadcast/CommodityStoreController.java b/seller-api/src/main/java/cn/lili/controller/other/broadcast/CommodityStoreController.java new file mode 100644 index 00000000..6a863e73 --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/other/broadcast/CommodityStoreController.java @@ -0,0 +1,64 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.goods.entity.dos.Commodity; +import cn.lili.modules.goods.entity.vos.CommodityVO; +import cn.lili.modules.goods.service.CommodityService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 店铺端,直播商品接口 + * + * @author Bulbasaur + * @since 2021/5/17 2:05 下午 + */ +@RestController +@Api(tags = "店铺端,直播商品接口") +@RequestMapping("/store/broadcast/commodity") +public class CommodityStoreController { + + @Autowired + private CommodityService commodityService; + + @ApiOperation(value = "获取店铺直播商品列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "商品名称", dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "auditStatus", value = "直播商品状态", dataType = "String", paramType = "query") + }) + @GetMapping + public ResultMessage> page(String auditStatus, String name, PageVO pageVO) { + return ResultUtil.data(commodityService.commodityList(pageVO, name, auditStatus)); + } + + @ApiOperation(value = "添加店铺直播商品") + @ApiImplicitParam(name = "commodityList", value = "直播商品列表", paramType = "body", allowMultiple = true, dataType = "Commodity") + @PostMapping + public ResultMessage addCommodity(@RequestBody List commodityList) { + if (commodityService.addCommodity(commodityList)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "删除店铺直播商品") + @ApiImplicitParam(name = "goodsId", value = "直播商品ID", dataType = "String", paramType = "path") + @DeleteMapping("/{goodsId}") + public ResultMessage delete(@PathVariable String goodsId) { + if (commodityService.deleteCommodity(goodsId)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/other/broadcast/StudioStoreController.java b/seller-api/src/main/java/cn/lili/controller/other/broadcast/StudioStoreController.java new file mode 100644 index 00000000..44d90022 --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/other/broadcast/StudioStoreController.java @@ -0,0 +1,98 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.OperationalJudgment; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.goods.entity.dos.Studio; +import cn.lili.modules.goods.entity.vos.StudioVO; +import cn.lili.modules.goods.service.StudioService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 店铺端,直播间接口 + * + * @author Bulbasaur + * @since 2021/5/17 2:05 下午 + */ +@RestController +@Api(tags = "店铺端,直播间接口") +@RequestMapping("/store/broadcast/studio") +public class StudioStoreController { + + @Autowired + private StudioService studioService; + + @ApiOperation(value = "获取店铺直播间列表") + @ApiImplicitParam(name = "status", value = "直播间状态", paramType = "query", dataType = "String") + @GetMapping + public ResultMessage> page(PageVO pageVO, String status) { + return ResultUtil.data(studioService.studioList(pageVO, null, status)); + } + + @ApiOperation(value = "获取店铺直播间详情") + @ApiImplicitParam(name = "studioId", value = "直播间ID", required = true, dataType = "String", paramType = "path") + @GetMapping("/studioInfo/{studioId}") + public ResultMessage studioInfo(@PathVariable String studioId) { + return ResultUtil.data(OperationalJudgment.judgment(studioService.getStudioVO(studioId))); + } + + @ApiOperation(value = "添加直播间") + @PostMapping + public ResultMessage add(@Validated Studio studio) { + if (Boolean.TRUE.equals(studioService.create(studio))) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "修改直播间") + @PutMapping("/edit") + public ResultMessage edit(Studio studio) { + OperationalJudgment.judgment(studioService.getById(studio.getId())); + if (Boolean.TRUE.equals(studioService.edit(studio))) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "店铺直播间添加商品") + @ApiImplicitParams({ + @ApiImplicitParam(name = "roomId", value = "房间ID", required = true, dataType = "Integer", paramType = "path"), + @ApiImplicitParam(name = "liveGoodsId", value = "直播商品ID", required = true, dataType = "Integer", paramType = "path") + }) + @PutMapping(value = "/push/{roomId}/{liveGoodsId}") + public ResultMessage push(@PathVariable Integer roomId, @PathVariable Integer liveGoodsId, @RequestParam String goodsId) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + if (Boolean.TRUE.equals(studioService.push(roomId, liveGoodsId, storeId, goodsId))) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "店铺直播间删除商品") + @ApiImplicitParams({ + @ApiImplicitParam(name = "roomId", value = "房间ID", required = true, dataType = "Integer", paramType = "path"), + @ApiImplicitParam(name = "liveGoodsId", value = "直播商品ID", required = true, dataType = "Integer", paramType = "path") + }) + @DeleteMapping(value = "/deleteInRoom/{roomId}/{liveGoodsId}") + public ResultMessage deleteInRoom(@PathVariable Integer roomId, @PathVariable Integer liveGoodsId) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + if (Boolean.TRUE.equals(studioService.goodsDeleteInRoom(roomId, liveGoodsId, storeId))) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java b/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java index e0825958..d9c95721 100644 --- a/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java +++ b/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java @@ -1,16 +1,25 @@ package cn.lili.controller.passport; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.sms.SmsUtil; +import cn.lili.modules.verification.entity.enums.VerificationEnums; +import cn.lili.modules.verification.service.VerificationService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; @@ -19,20 +28,25 @@ import javax.validation.constraints.NotNull; * 店铺端,商家登录接口 * * @author Chopper - * @date 2020/12/22 15:02 + * @since 2020/12/22 15:02 */ @RestController @Api(tags = "店铺端,商家登录接口 ") -@RequestMapping("/store/login") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/passport/login") public class StorePassportController { /** * 会员 */ - private final MemberService memberService; + @Autowired + private MemberService memberService; + @Autowired + private SmsUtil smsUtil; + + @Autowired + private VerificationService verificationService; @ApiOperation(value = "登录接口") @ApiImplicitParams({ @@ -41,8 +55,62 @@ public class StorePassportController { }) @PostMapping("/userLogin") public ResultMessage userLogin(@NotNull(message = "用户名不能为空") @RequestParam String username, - @NotNull(message = "密码不能为空") @RequestParam String password) { - return ResultUtil.data(this.memberService.usernameStoreLogin(username, password)); + @NotNull(message = "密码不能为空") @RequestParam String password, @RequestHeader String uuid) { + if (verificationService.check(uuid, VerificationEnums.LOGIN)) { + return ResultUtil.data(this.memberService.usernameStoreLogin(username, password)); + } else { + throw new ServiceException(ResultCode.VERIFICATION_ERROR); + } + } + + @ApiOperation(value = "短信登录接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"), + @ApiImplicitParam(name = "code", value = "验证码", required = true, paramType = "query") + }) + @PostMapping("/smsLogin") + public ResultMessage smsLogin(@NotNull(message = "手机号为空") @RequestParam String mobile, + @NotNull(message = "验证码为空") @RequestParam String code, + @RequestHeader String uuid) { + if (smsUtil.verifyCode(mobile, VerificationEnums.LOGIN, uuid, code)) { + return ResultUtil.data(memberService.mobilePhoneStoreLogin(mobile)); + } else { + throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR); + } + } + + @ApiOperation(value = "注销接口") + @PostMapping("/logout") + public ResultMessage logout() { + this.memberService.logout(UserEnums.STORE); + return ResultUtil.success(); + } + + @ApiOperation(value = "通过短信重置密码") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"), + @ApiImplicitParam(name = "password", value = "是否保存登录", required = true, paramType = "query") + }) + @PostMapping("/resetByMobile") + public ResultMessage resetByMobile(@NotNull(message = "手机号为空") @RequestParam String mobile, + @NotNull(message = "验证码为空") @RequestParam String code, + @RequestHeader String uuid) { + //校验短信验证码是否正确 + if (smsUtil.verifyCode(mobile, VerificationEnums.FIND_USER, uuid, code)) { + //校验是否通过手机号可获取会员,存在则将会员信息存入缓存,有效时间3分钟 + memberService.findByMobile(uuid, mobile); + return ResultUtil.success(); + } else { + throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR); + } + } + @ApiOperation(value = "修改密码") + @ApiImplicitParams({ + @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query") + }) + @PostMapping("/resetPassword") + public ResultMessage resetByMobile(@NotNull(message = "密码为空") @RequestParam String password, @RequestHeader String uuid) { + return ResultUtil.data(memberService.resetByMobile(uuid, password)); } @ApiOperation(value = "修改密码") @@ -53,6 +121,10 @@ public class StorePassportController { @PostMapping("/modifyPass") public ResultMessage modifyPass(@NotNull(message = "旧密码不能为空") @RequestParam String password, @NotNull(message = "新密码不能为空") @RequestParam String newPassword) { + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } return ResultUtil.data(memberService.modifyPass(password, newPassword)); } @@ -61,6 +133,4 @@ public class StorePassportController { public ResultMessage refreshToken(@NotNull(message = "刷新token不能为空") @PathVariable String refreshToken) { return ResultUtil.data(this.memberService.refreshStoreToken(refreshToken)); } - - } diff --git a/seller-api/src/main/java/cn/lili/controller/permission/ClerkStoreController.java b/seller-api/src/main/java/cn/lili/controller/permission/ClerkStoreController.java new file mode 100644 index 00000000..c60c98ad --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/ClerkStoreController.java @@ -0,0 +1,160 @@ +package cn.lili.controller.permission; + +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.validation.Phone; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; +import cn.lili.modules.member.entity.dto.ClerkEditDTO; +import cn.lili.modules.member.entity.dto.ClerkQueryDTO; +import cn.lili.modules.member.entity.dto.MemberAddDTO; +import cn.lili.modules.member.entity.vo.ClerkVO; +import cn.lili.modules.member.service.ClerkService; +import cn.lili.modules.member.service.MemberService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + + +/** + * 店员接口 + * + * @author Chopper + * @since 2020/11/16 10:57 + */ +@Slf4j +@RestController +@Api(tags = "店员") +@RequestMapping("/store/clerk") +@Transactional(rollbackFor = Exception.class) +@Validated +public class ClerkStoreController { + @Autowired + private ClerkService clerkService; + + @Autowired + private MemberService memberService; + + + @GetMapping + @ApiOperation(value = "分页获取店员列表") + public ResultMessage> page(ClerkQueryDTO clerkQueryDTO, + PageVO pageVo) { + + IPage page = clerkService.clerkForPage(pageVo, clerkQueryDTO); + return ResultUtil.data(page); + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取店员详细") + public ResultMessage get(@PathVariable String id) { + + return ResultUtil.data(clerkService.get(id)); + } + + + @PostMapping("/{mobile}/check") + @ApiOperation(value = "检测手机号码有效性") + public ResultMessage check(@PathVariable @Phone(message = "手机号码格式不正确") String mobile) { + return ResultUtil.data(clerkService.checkClerk(mobile)); + } + + + @PostMapping + @ApiOperation(value = "添加店员") + public ResultMessage add(@Valid ClerkAddDTO clerkAddDTO) { + int rolesMaxSize = 10; + try { + if (clerkAddDTO.getRoles() != null && clerkAddDTO.getRoles().size() >= rolesMaxSize) { + throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); + } + //校验是否已经是会员 + Member member = memberService.findByMobile(clerkAddDTO.getMobile()); + if (member == null) { + //添加会员 + MemberAddDTO memberAddDTO = new MemberAddDTO(); + memberAddDTO.setMobile(clerkAddDTO.getMobile()); + memberAddDTO.setPassword(clerkAddDTO.getPassword()); + memberAddDTO.setUsername(clerkAddDTO.getUsername()); + member = memberService.addMember(memberAddDTO); + } else { + //校验要添加的会员是否已经是店主 + if (Boolean.TRUE.equals(member.getHaveStore())) { + throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); + } + //校验会员的有效性 + if (Boolean.FALSE.equals(member.getDisabled())) { + throw new ServiceException(ResultCode.USER_STATUS_ERROR); + } + } + //添加店员 + clerkAddDTO.setMemberId(member.getId()); + clerkAddDTO.setShopkeeper(false); + clerkAddDTO.setStoreId(UserContext.getCurrentUser().getStoreId()); + clerkService.saveClerk(clerkAddDTO); + //修改此会员拥有店铺 + List ids = new ArrayList<>(); + ids.add(member.getId()); + memberService.updateHaveShop(true, UserContext.getCurrentUser().getStoreId(), ids); + } catch (ServiceException se) { + log.info(se.getMsg(), se); + throw se; + } catch (Exception e) { + log.error("添加店员出错", e); + } + return ResultUtil.success(); + } + + + @PutMapping("/{id}") + @ApiImplicitParam(name = "id", value = "店员id", required = true, paramType = "path") + @ApiOperation(value = "修改店员") + public ResultMessage edit(@PathVariable String id, @Valid ClerkEditDTO clerkEditDTO) { + clerkEditDTO.setId(id); + return ResultUtil.data(clerkService.updateClerk(clerkEditDTO)); + } + + @PutMapping(value = "/enable/{clerkId}") + @ApiOperation(value = "禁/启 用 店员") + @DemoSite + public ResultMessage disable(@ApiParam("用户唯一id标识") @PathVariable String clerkId, Boolean status) { + clerkService.disable(clerkId, status); + return ResultUtil.success(); + } + + + @DeleteMapping(value = "/delByIds/{ids}") + @ApiOperation(value = "删除店员") + public ResultMessage deleteClerk(@PathVariable List ids) { + clerkService.deleteClerk(ids); + return ResultUtil.success(); + } + + + @PostMapping(value = "/resetPassword/{ids}") + @ApiOperation(value = "重置密码") + @DemoSite + public ResultMessage resetPassword(@PathVariable List ids) { + clerkService.resetPassword(ids); + return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); + } + + +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentController.java new file mode 100644 index 00000000..a5f21f6d --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentController.java @@ -0,0 +1,70 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.ResultMessage; +import cn.lili.common.vo.SearchVO; +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.member.entity.vo.StoreDepartmentVO; +import cn.lili.modules.member.service.StoreDepartmentService; +import cn.lili.mybatis.util.PageUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 管理端,部门管理接口 + * + * @author Chopper + * @since 2020/11/22 12:06 + */ +@RestController +@Api(tags = "店铺端,部门管理接口") +@RequestMapping("/store/department") +public class StoreDepartmentController { + @Autowired + private StoreDepartmentService storeDepartmentService; + + @GetMapping(value = "/{id}") + @ApiOperation(value = "查看部门详情") + public ResultMessage get(@PathVariable String id) { + StoreDepartment storeDepartment = storeDepartmentService.getById(id); + return ResultUtil.data(storeDepartment); + } + + @GetMapping + @ApiOperation(value = "获取树状结构") + public ResultMessage> getByPage(StoreDepartment entity, + SearchVO searchVo) { + entity.setStoreId(UserContext.getCurrentUser().getStoreId()); + return ResultUtil.data(storeDepartmentService.tree(PageUtil.initWrapper(entity, searchVo))); + + } + + @PostMapping + @ApiOperation(value = "新增部门") + public ResultMessage save(StoreDepartment storeDepartment) { + storeDepartment.setStoreId(UserContext.getCurrentUser().getStoreId()); + storeDepartmentService.save(storeDepartment); + return ResultUtil.data(storeDepartment); + } + + @PutMapping("/{id}") + @ApiOperation(value = "更新部门") + public ResultMessage update(@PathVariable String id, StoreDepartment storeDepartment) { + storeDepartment.setId(id); + storeDepartmentService.update(storeDepartment); + return ResultUtil.data(storeDepartment); + } + + @DeleteMapping(value = "/{ids}") + @ApiOperation(value = "删除部门") + public ResultMessage delAllByIds(@PathVariable List ids) { + storeDepartmentService.deleteByIds(ids); + return ResultUtil.success(); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentRoleController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentRoleController.java new file mode 100644 index 00000000..d395abaf --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentRoleController.java @@ -0,0 +1,42 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import cn.lili.modules.permission.entity.dos.DepartmentRole; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 店铺端,部门角色接口 + * + * @author Chopper + * @since 2020/11/22 14:05 + */ +@RestController +@Api(tags = "店铺端,部门角色接口") +@RequestMapping("/store/departmentRole") +public class StoreDepartmentRoleController { + @Autowired + private StoreDepartmentRoleService storeDepartmentRoleService; + + @GetMapping(value = "/{departmentId}") + @ApiOperation(value = "查看部门拥有的角色") + public ResultMessage> get(@PathVariable String departmentId) { + return ResultUtil.data(storeDepartmentRoleService.listByDepartmentId(departmentId)); + } + + @PutMapping("/{departmentId}") + @ApiOperation(value = "更新部门角色") + public ResultMessage update(@PathVariable String departmentId, @RequestBody List storeDepartmentRoles) { + storeDepartmentRoleService.updateByDepartmentId(departmentId, storeDepartmentRoles); + return ResultUtil.success(); + } + +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java new file mode 100644 index 00000000..859ea92d --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java @@ -0,0 +1,49 @@ +package cn.lili.controller.permission; + +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.vo.StoreMenuVO; +import cn.lili.modules.member.service.StoreMenuService; +import cn.lili.modules.permission.entity.dos.Menu; +import cn.lili.modules.permission.entity.dto.MenuSearchParams; +import cn.lili.modules.permission.entity.vo.MenuVO; +import cn.lili.modules.permission.service.MenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 管理端,菜单管理接口 + * + * @author Chopper + * @since 2020/11/20 12:07 + */ +@Slf4j +@RestController +@Api(tags = "店铺端,菜单管理接口") +@RequestMapping("/store/menu") +public class StoreMenuController { + + @Autowired + private StoreMenuService storeMenuService; + + + @ApiOperation(value = "获取所有菜单") + @GetMapping("/tree") + public ResultMessage> getAllMenuList() { + return ResultUtil.data(storeMenuService.tree()); + } + + @ApiOperation(value = "获取所有菜单---根据当前用户角色") + @GetMapping("/memberMenu") + public ResultMessage> memberMenu() { + return ResultUtil.data(storeMenuService.findUserTree()); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuRoleController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuRoleController.java new file mode 100644 index 00000000..ae4f99f7 --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuRoleController.java @@ -0,0 +1,43 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.permission.entity.dos.RoleMenu; +import cn.lili.modules.permission.service.RoleMenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 店铺端,角色菜单接口 + * + * @author Chopper + * @since 2020/11/22 11:40 + */ +@RestController +@Api(tags = "店铺端,角色菜单接口") +@RequestMapping("/store/roleMenu") +public class StoreMenuRoleController { + @Autowired + private StoreMenuRoleService storeMenuRoleService; + + @GetMapping(value = "/{roleId}") + @ApiOperation(value = "查看某角色拥有到菜单") + public ResultMessage> get(@PathVariable String roleId) { + return ResultUtil.data(storeMenuRoleService.findByRoleId(roleId)); + } + + @PostMapping(value = "/{roleId}") + @ApiOperation(value = "保存角色菜单") + public ResultMessage save(@PathVariable String roleId, @RequestBody List roleMenus) { + storeMenuRoleService.updateRoleMenu(roleId, roleMenus); + return ResultUtil.success(); + } + +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreRoleController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreRoleController.java new file mode 100644 index 00000000..83e5761e --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreRoleController.java @@ -0,0 +1,65 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.member.service.StoreRoleService; +import cn.lili.modules.permission.entity.dos.Role; +import cn.lili.modules.permission.service.RoleService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 店铺端,角色管理接口 + * + * @author Chopper + * @since 2020/11/20 18:50 + */ +@RestController +@Api(tags = "店铺端,店铺角色管理接口") +@RequestMapping("/store/role") +public class StoreRoleController { + @Autowired + private StoreRoleService storeRoleService; + + @PostMapping + @ApiOperation(value = "添加角色") + public ResultMessage add(StoreRole storeRole) { + storeRoleService.saveStoreRole(storeRole); + return ResultUtil.data(storeRole); + } + + @GetMapping + @ApiOperation(value = "查询店铺角色") + public ResultMessage page(PageVO pageVo, StoreRole storeRole) { + storeRole.setStoreId(UserContext.getCurrentUser().getStoreId()); + Page page = storeRoleService.page(PageUtil.initPage(pageVo), PageUtil.initWrapper(storeRole)); + return ResultUtil.data(page); + } + + @PutMapping("/{roleId}") + @ApiOperation(value = "编辑店铺角色") + public ResultMessage edit(@PathVariable String roleId, StoreRole storeRole) { + storeRole.setId(roleId); + storeRoleService.update(storeRole); + return ResultUtil.data(storeRole); + } + + @DeleteMapping(value = "/{ids}") + @ApiOperation(value = "批量删除店铺角色") + public ResultMessage delByIds(@PathVariable List ids) { + storeRoleService.deleteRoles(ids); + return ResultUtil.success(); + } + + +} diff --git a/seller-api/src/main/java/cn/lili/controller/promotion/CouponStoreController.java b/seller-api/src/main/java/cn/lili/controller/promotion/CouponStoreController.java index 8a7a64d8..af8f1bf2 100644 --- a/seller-api/src/main/java/cn/lili/controller/promotion/CouponStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/promotion/CouponStoreController.java @@ -1,114 +1,122 @@ package cn.lili.controller.promotion; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.Coupon; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.vos.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams; +import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams; import cn.lili.modules.promotion.entity.vos.CouponVO; +import cn.lili.modules.promotion.entity.vos.MemberCouponVO; import cn.lili.modules.promotion.service.CouponService; +import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * 店铺端,优惠券接口 * * @author paulG - * @date 2020/8/28 + * @since 2020/8/28 **/ @RestController @Api(tags = "店铺端,优惠券接口") @RequestMapping("/store/promotion/coupon") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class CouponStoreController { - private final CouponService couponService; + @Autowired + private CouponService couponService; + + + @Autowired + private MemberCouponService memberCouponService; @GetMapping @ApiOperation(value = "获取优惠券列表") public ResultMessage> getCouponList(CouponSearchParams queryParam, PageVO page) { - page.setNotConvert(true); - AuthUser currentUser = UserContext.getCurrentUser(); - queryParam.setStoreId(currentUser.getStoreId()); - IPage coupons = couponService.getCouponsByPageFromMongo(queryParam, page); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + queryParam.setStoreId(storeId); + IPage coupons = couponService.pageVOFindAll(queryParam, page); return ResultUtil.data(coupons); } @ApiOperation(value = "获取优惠券详情") @GetMapping("/{couponId}") public ResultMessage getCouponList(@PathVariable String couponId) { - AuthUser currentUser = UserContext.getCurrentUser(); - Coupon coupon = couponService.getCouponDetailFromMongo(couponId); - if (coupon == null || !coupon.getStoreId().equals(currentUser.getStoreId())) { - return ResultUtil.error(ResultCode.USER_AUTHORITY_ERROR); - } + CouponVO coupon = OperationalJudgment.judgment(couponService.getDetail(couponId)); return ResultUtil.data(coupon); } @ApiOperation(value = "添加优惠券") @PostMapping(consumes = "application/json", produces = "application/json") public ResultMessage addCoupon(@RequestBody CouponVO couponVO) { - AuthUser currentUser = UserContext.getCurrentUser(); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); couponVO.setStoreId(currentUser.getStoreId()); couponVO.setStoreName(currentUser.getStoreName()); - if (couponService.add(couponVO) != null) { + if (couponService.savePromotions(couponVO)) { return ResultUtil.data(couponVO); } - return ResultUtil.error(ResultCode.ERROR); + return ResultUtil.error(ResultCode.COUPON_SAVE_ERROR); } @PutMapping(consumes = "application/json", produces = "application/json") @ApiOperation(value = "修改优惠券") public ResultMessage updateCoupon(@RequestBody CouponVO couponVO) { - AuthUser currentUser = UserContext.getCurrentUser(); + OperationalJudgment.judgment(couponService.getById(couponVO.getId())); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); couponVO.setStoreId(currentUser.getStoreId()); couponVO.setStoreName(currentUser.getStoreName()); - couponVO.setPromotionStatus(PromotionStatusEnum.NEW.name()); - Coupon byId = couponService.getById(couponVO.getId()); - if (!currentUser.getStoreId().equals(byId.getStoreId())) { - throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + if (couponService.updatePromotions(couponVO)) { + return ResultUtil.data(couponVO); } - CouponVO coupon = couponService.updateCoupon(couponVO); - if (coupon != null) { - - return ResultUtil.data(coupon); - } - return ResultUtil.error(ResultCode.ERROR); + return ResultUtil.error(ResultCode.COUPON_SAVE_ERROR); } @DeleteMapping(value = "/{ids}") @ApiOperation(value = "批量删除") public ResultMessage delAllByIds(@PathVariable List ids) { - AuthUser currentUser = UserContext.getCurrentUser(); - Coupon byId = couponService.getById(ids.get(0)); - if (!currentUser.getStoreId().equals(byId.getStoreId())) { - throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); - } - for (String id : ids) { - couponService.deleteCoupon(id); - } - return ResultUtil.success(ResultCode.SUCCESS); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(Coupon::getId, ids); + queryWrapper.eq(Coupon::getStoreId, storeId); + List list = couponService.list(queryWrapper); + List filterIds = list.stream().map(Coupon::getId).collect(Collectors.toList()); + return couponService.removePromotions(filterIds) ? ResultUtil.success() : ResultUtil.error(ResultCode.COUPON_DELETE_ERROR); + } + + @ApiOperation(value = "获取优惠券领取详情") + @GetMapping(value = "/received") + public ResultMessage> getReceiveByPage(MemberCouponSearchParams searchParams, + PageVO page) { + searchParams.setStoreId(Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId()); + IPage result = memberCouponService.getMemberCouponsPage(PageUtil.initPage(page), searchParams); + return ResultUtil.data(result); } @ApiOperation(value = "修改优惠券状态") @PutMapping("/status") - public ResultMessage updateCouponStatus(String couponIds, String promotionStatus) { + public ResultMessage updateCouponStatus(String couponIds, Long startTime, Long endTime) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); String[] split = couponIds.split(","); - if (couponService.updateCouponStatus(Arrays.asList(split), PromotionStatusEnum.valueOf(promotionStatus))) { + List couponIdList = couponService.list(new LambdaQueryWrapper().in(Coupon::getId, Arrays.asList(split)).eq(Coupon::getStoreId, currentUser.getStoreId())).stream().map(Coupon::getId).collect(Collectors.toList()); + if (couponService.updateStatus(couponIdList, startTime, endTime)) { return ResultUtil.success(ResultCode.COUPON_EDIT_STATUS_SUCCESS); } - return ResultUtil.error(ResultCode.COUPON_EDIT_STATUS_ERROR); + throw new ServiceException(ResultCode.COUPON_EDIT_STATUS_ERROR); } } diff --git a/seller-api/src/main/java/cn/lili/controller/promotion/FullDiscountStoreController.java b/seller-api/src/main/java/cn/lili/controller/promotion/FullDiscountStoreController.java index 9101f601..4a95f6b0 100644 --- a/seller-api/src/main/java/cn/lili/controller/promotion/FullDiscountStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/promotion/FullDiscountStoreController.java @@ -1,79 +1,103 @@ package cn.lili.controller.promotion; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.promotion.entity.dos.FullDiscount; -import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; -import cn.lili.modules.promotion.entity.vos.FullDiscountSearchParams; -import cn.lili.modules.promotion.service.FullDiscountService; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; +import cn.lili.modules.promotion.entity.dos.FullDiscount; +import cn.lili.modules.promotion.entity.dto.search.FullDiscountSearchParams; +import cn.lili.modules.promotion.service.FullDiscountService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Collections; +import java.util.Objects; + /** * 店铺端,满额活动接口 * * @author paulG - * @date 2020/8/19 + * @since 2020/8/19 **/ @RestController @Api(tags = "店铺端,满额活动接口") @RequestMapping("/store/promotion/fullDiscount") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FullDiscountStoreController { - private final FullDiscountService fullDiscountService; + @Autowired + private FullDiscountService fullDiscountService; @ApiOperation(value = "新增满优惠活动") @PostMapping(consumes = "application/json", produces = "application/json") public ResultMessage addFullDiscount(@RequestBody FullDiscountVO fullDiscountVO) { - AuthUser currentUser = UserContext.getCurrentUser(); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); fullDiscountVO.setStoreId(currentUser.getStoreId()); fullDiscountVO.setStoreName(currentUser.getStoreName()); - fullDiscountVO.setPromotionStatus(PromotionStatusEnum.NEW.name()); - FullDiscount fullDiscount = fullDiscountService.addFullDiscount(fullDiscountVO); - return ResultUtil.data(fullDiscount); + if (!fullDiscountService.savePromotions(fullDiscountVO)) { + return ResultUtil.error(ResultCode.PINTUAN_ADD_ERROR); + } + return ResultUtil.data(fullDiscountVO); } @ApiOperation(value = "通过id获取") @GetMapping("/{id}") public ResultMessage get(@PathVariable String id) { - FullDiscountVO fullDiscount = fullDiscountService.getFullDiscount(id); + FullDiscountVO fullDiscount = OperationalJudgment.judgment(fullDiscountService.getFullDiscount(id)); return ResultUtil.data(fullDiscount); } @ApiOperation(value = "根据条件分页查询满优惠活动") @GetMapping - public ResultMessage> getFullDiscountByPage(FullDiscountSearchParams searchParams, PageVO page) { - String storeId = UserContext.getCurrentUser().getStoreId(); + public ResultMessage> getFullDiscountByPage(FullDiscountSearchParams searchParams, PageVO page) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); searchParams.setStoreId(storeId); - IPage fullDiscountByPage = fullDiscountService.getFullDiscountByPageFromMongo(searchParams, page); + IPage fullDiscountByPage = fullDiscountService.pageFindAll(searchParams, page); return ResultUtil.data(fullDiscountByPage); } @ApiOperation(value = "修改满优惠活动") @PutMapping(consumes = "application/json", produces = "application/json") public ResultMessage editFullDiscount(@RequestBody FullDiscountVO fullDiscountVO) { - AuthUser currentUser = UserContext.getCurrentUser(); + OperationalJudgment.judgment(fullDiscountService.getFullDiscount(fullDiscountVO.getId())); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); fullDiscountVO.setStoreId(currentUser.getStoreId()); fullDiscountVO.setStoreName(currentUser.getStoreName()); - fullDiscountService.modifyFullDiscount(fullDiscountVO); + if (!fullDiscountService.updatePromotions(fullDiscountVO)) { + return ResultUtil.error(ResultCode.PINTUAN_EDIT_ERROR); + } return ResultUtil.success(ResultCode.FULL_DISCOUNT_EDIT_SUCCESS); } @ApiOperation(value = "删除满优惠活动") @DeleteMapping("/{id}") public ResultMessage deleteFullDiscount(@PathVariable String id) { - fullDiscountService.deleteFullDiscount(id); + OperationalJudgment.judgment(fullDiscountService.getById(id)); + fullDiscountService.removePromotions(Collections.singletonList(id)); return ResultUtil.success(ResultCode.FULL_DISCOUNT_EDIT_DELETE); } + + @ApiOperation(value = "修改满额活动状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "满额活动ID", required = true, paramType = "path"), + @ApiImplicitParam(name = "promotionStatus", value = "满额活动状态", required = true, paramType = "path") + }) + @PutMapping("/status/{id}") + public ResultMessage updateCouponStatus(@PathVariable String id, Long startTime, Long endTime) { + OperationalJudgment.judgment(fullDiscountService.getFullDiscount(id)); + if (fullDiscountService.updateStatus(Collections.singletonList(id), startTime, endTime)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + return ResultUtil.error(ResultCode.ERROR); + } + } diff --git a/seller-api/src/main/java/cn/lili/controller/promotion/PintuanStoreController.java b/seller-api/src/main/java/cn/lili/controller/promotion/PintuanStoreController.java index 466667a4..80b369bd 100644 --- a/seller-api/src/main/java/cn/lili/controller/promotion/PintuanStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/promotion/PintuanStoreController.java @@ -1,26 +1,33 @@ package cn.lili.controller.promotion; +import cn.hutool.core.util.ArrayUtil; +import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO; -import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.vos.PintuanSearchParams; +import cn.lili.modules.promotion.entity.dos.Pintuan; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dto.search.PintuanSearchParams; +import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; import cn.lili.modules.promotion.entity.vos.PintuanVO; -import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams; import cn.lili.modules.promotion.service.PintuanService; import cn.lili.modules.promotion.service.PromotionGoodsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Date; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * 店铺端,拼团管理接口 @@ -31,88 +38,90 @@ import java.util.Date; @RestController @Api(tags = "店铺端,拼团管理接口") @RequestMapping("/store/promotion/pintuan") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PintuanStoreController { - private final PintuanService pintuanService; - private final PromotionGoodsService promotionGoodsService; + @Autowired + private PintuanService pintuanService; + @Autowired + private PromotionGoodsService promotionGoodsService; @GetMapping @ApiOperation(value = "根据条件分页查询拼团活动列表") - public ResultMessage> getPintuanByPage(PintuanSearchParams queryParam, PageVO pageVo) { - AuthUser currentUser = UserContext.getCurrentUser(); + public ResultMessage> getPintuanByPage(PintuanSearchParams queryParam, PageVO pageVo) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); queryParam.setStoreId(currentUser.getStoreId()); - IPage pintuanByPageFromMongo = pintuanService.getPintuanByPageFromMongo(queryParam, pageVo); - return ResultUtil.data(pintuanByPageFromMongo); + return ResultUtil.data(pintuanService.pageFindAll(queryParam, pageVo)); } @GetMapping(value = "/{id}") @ApiOperation(value = "通过id获取") public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(pintuanService.getPintuanByIdFromMongo(id)); + PintuanVO pintuan = OperationalJudgment.judgment(pintuanService.getPintuanVO(id)); + return ResultUtil.data(pintuan); } @GetMapping("/goods/{pintuanId}") @ApiOperation(value = "根据条件分页查询拼团活动商品列表") - public ResultMessage> getPintuanGoodsByPage(@PathVariable String pintuanId, PageVO pageVo) { + public ResultMessage> getPintuanGoodsByPage(@PathVariable String pintuanId, PageVO pageVo) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setStoreId(currentUser.getStoreId()); searchParams.setPromotionId(pintuanId); searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name()); - IPage promotionGoods = promotionGoodsService.getPromotionGoods(searchParams, pageVo); - return ResultUtil.data(promotionGoods); + return ResultUtil.data(promotionGoodsService.pageFindAll(searchParams, pageVo)); } @PostMapping(consumes = "application/json", produces = "application/json") @ApiOperation(value = "添加拼团活动") - public ResultMessage addPintuan(@RequestBody PintuanVO pintuan) { - AuthUser currentUser = UserContext.getCurrentUser(); + public ResultMessage addPintuan(@RequestBody @Validated PintuanVO pintuan) { + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); pintuan.setStoreId(currentUser.getStoreId()); pintuan.setStoreName(currentUser.getStoreName()); - if (pintuanService.addPintuan(pintuan)) { + if (pintuanService.savePromotions(pintuan)) { return ResultUtil.success(ResultCode.PINTUAN_ADD_SUCCESS); } - return ResultUtil.error(ResultCode.PINTUAN_ADD_ERROR); + throw new ServiceException(ResultCode.PINTUAN_ADD_ERROR); } @PutMapping(consumes = "application/json", produces = "application/json") @ApiOperation(value = "修改拼团活动") - public ResultMessage editPintuan(@RequestBody PintuanVO pintuan) { - AuthUser currentUser = UserContext.getCurrentUser(); + public ResultMessage editPintuan(@RequestBody @Validated PintuanVO pintuan) { + OperationalJudgment.judgment(pintuanService.getById(pintuan.getId())); + AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); pintuan.setStoreId(currentUser.getStoreId()); pintuan.setStoreName(currentUser.getStoreName()); - if (pintuanService.modifyPintuan(pintuan)) { + if (pintuan.getPromotionGoodsList() != null && !pintuan.getPromotionGoodsList().isEmpty()) { + List skuIds = pintuan.getPromotionGoodsList().stream().map(PromotionGoods::getSkuId).collect(Collectors.toList()); + pintuan.setScopeId(ArrayUtil.join(skuIds.toArray(), ",")); + } else { + pintuan.setScopeId(null); + } + if (pintuanService.updatePromotions(pintuan)) { return ResultUtil.success(ResultCode.PINTUAN_EDIT_SUCCESS); } - return ResultUtil.error(ResultCode.PINTUAN_EDIT_ERROR); + throw new ServiceException(ResultCode.PINTUAN_EDIT_ERROR); } - @PutMapping("/open/{pintuanId}") - @ApiOperation(value = "手动开启拼团活动") + @PutMapping("/status/{pintuanId}") + @ApiOperation(value = "操作拼团活动状态") public ResultMessage openPintuan(@PathVariable String pintuanId, Long startTime, Long endTime) { - if (pintuanService.openPintuan(pintuanId, new Date(startTime), new Date(endTime))) { + OperationalJudgment.judgment(pintuanService.getById(pintuanId)); + if (pintuanService.updateStatus(Collections.singletonList(pintuanId), startTime, endTime)) { return ResultUtil.success(ResultCode.PINTUAN_MANUAL_OPEN_SUCCESS); } - return ResultUtil.error(ResultCode.PINTUAN_MANUAL_OPEN_ERROR); + throw new ServiceException(ResultCode.PINTUAN_MANUAL_OPEN_ERROR); } - @PutMapping("/close/{pintuanId}") - @ApiOperation(value = "手动关闭拼团活动") - public ResultMessage closePintuan(@PathVariable String pintuanId) { - if (pintuanService.closePintuan(pintuanId)) { - return ResultUtil.success(ResultCode.PINTUAN_MANUAL_CLOSE_SUCCESS); - } - return ResultUtil.error(ResultCode.PINTUAN_MANUAL_CLOSE_ERROR); - } - @DeleteMapping("/{pintuanId}") @ApiOperation(value = "手动删除拼团活动") public ResultMessage deletePintuan(@PathVariable String pintuanId) { - if (pintuanService.deletePintuan(pintuanId)) { + OperationalJudgment.judgment(pintuanService.getById(pintuanId)); + if (pintuanService.removePromotions(Collections.singletonList(pintuanId))) { return ResultUtil.success(ResultCode.PINTUAN_DELETE_SUCCESS); } - return ResultUtil.error(ResultCode.PINTUAN_DELETE_ERROR); + throw new ServiceException(ResultCode.PINTUAN_DELETE_ERROR); } } diff --git a/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java b/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java index 458a2729..550c6a23 100644 --- a/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java @@ -1,84 +1,83 @@ package cn.lili.controller.promotion; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; +import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillApplyVO; -import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; -import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.Arrays; import java.util.List; +import java.util.Objects; /** - * 店铺端,限时抢购接口 + * 店铺端,秒杀活动接口 * * @author paulG - * @date 2020/8/26 + * @since 2020/8/26 **/ @RestController -@Api(tags = "店铺端,限时抢购接口") +@Api(tags = "店铺端,秒杀活动接口") @RequestMapping("/store/promotion/seckill") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class SeckillStoreController { - - private final SeckillService seckillService; - private final SeckillApplyService seckillApplyService; + @Autowired + private SeckillService seckillService; + @Autowired + private SeckillApplyService seckillApplyService; @GetMapping - @ApiOperation(value = "获取限时抢购列表") - public ResultMessage> getSeckillPage(SeckillSearchParams queryParam, PageVO pageVo) { - IPage seckillPage = seckillService.getSeckillByPageFromMongo(queryParam, pageVo); + @ApiOperation(value = "获取秒杀活动列表") + public ResultMessage> getSeckillPage(SeckillSearchParams queryParam, PageVO pageVo) { + IPage seckillPage = seckillService.pageFindAll(queryParam, pageVo); return ResultUtil.data(seckillPage); } @GetMapping("/apply") - @ApiOperation(value = "获取限时抢购申请列表") + @ApiOperation(value = "获取秒杀活动申请列表") public ResultMessage> getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo) { - String storeId = UserContext.getCurrentUser().getStoreId(); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); queryParam.setStoreId(storeId); - IPage seckillPage = seckillApplyService.getSeckillApplyFromMongo(queryParam, pageVo); + IPage seckillPage = seckillApplyService.getSeckillApplyPage(queryParam, pageVo); return ResultUtil.data(seckillPage); } @GetMapping("/{seckillId}") - @ApiOperation(value = "获取限时抢购") + @ApiOperation(value = "获取秒杀活动信息") public ResultMessage getSeckill(@PathVariable String seckillId) { - return ResultUtil.data(seckillService.getSeckillByIdFromMongo(seckillId)); + return ResultUtil.data(seckillService.getById(seckillId)); } @GetMapping("/apply/{seckillApplyId}") - @ApiOperation(value = "获取限时抢购申请") + @ApiOperation(value = "获取秒杀活动申请") public ResultMessage getSeckillApply(@PathVariable String seckillApplyId) { - return ResultUtil.data(seckillApplyService.getById(seckillApplyId)); + SeckillApply seckillApply = OperationalJudgment.judgment(seckillApplyService.getById(seckillApplyId)); + return ResultUtil.data(seckillApply); } @PostMapping(path = "/apply/{seckillId}", consumes = "application/json", produces = "application/json") - @ApiOperation(value = "添加限时抢购申请") + @ApiOperation(value = "添加秒杀活动申请") public ResultMessage addSeckillApply(@PathVariable String seckillId, @RequestBody List applyVos) { - String storeId = UserContext.getCurrentUser().getStoreId(); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); seckillApplyService.addSeckillApply(seckillId, storeId, applyVos); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } - @DeleteMapping("/apply/{seckillId}/{ids}") - @ApiOperation(value = "删除限时抢购申请") - public ResultMessage deleteSeckillApply(@PathVariable("seckillId") String seckillId, @PathVariable("ids") String ids) { - String[] idsSplit = ids.split(","); - seckillApplyService.removeSeckillApplyByIds(seckillId, Arrays.asList(idsSplit)); - return ResultUtil.success(ResultCode.SUCCESS); + @DeleteMapping("/apply/{seckillId}/{id}") + @ApiOperation(value = "删除秒杀活动商品") + public ResultMessage deleteSeckillApply(@PathVariable String seckillId, @PathVariable String id) { + OperationalJudgment.judgment(seckillApplyService.getById(id)); + seckillApplyService.removeSeckillApply(seckillId, id); + return ResultUtil.success(); } diff --git a/seller-api/src/main/java/cn/lili/controller/settings/FreightTemplateStoreController.java b/seller-api/src/main/java/cn/lili/controller/settings/FreightTemplateStoreController.java index 1c349f7a..21caae1f 100644 --- a/seller-api/src/main/java/cn/lili/controller/settings/FreightTemplateStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/settings/FreightTemplateStoreController.java @@ -1,57 +1,61 @@ package cn.lili.controller.settings; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.store.entity.vos.FreightTemplateVO; import cn.lili.modules.store.service.FreightTemplateService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; +import java.util.Objects; /** * 店铺端,运费模板接口 * * @author paulG - * @date 2020/8/26 + * @since 2020/8/26 **/ @RestController @Api(tags = "店铺端,运费模板接口") -@RequestMapping("/store/freightTemplate") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/setting/freightTemplate") public class FreightTemplateStoreController { - - private final FreightTemplateService freightTemplateService; + @Autowired + private FreightTemplateService freightTemplateService; @ApiOperation(value = "商家运费模板列表") @GetMapping - private ResultMessage> list() { - return ResultUtil.data(freightTemplateService.getFreightTemplateList(UserContext.getCurrentUser().getStoreId())); + public ResultMessage> list() { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(freightTemplateService.getFreightTemplateList(storeId)); } @ApiOperation(value = "获取商家运费模板详情") @ApiImplicitParam(name = "id", value = "商家模板ID", required = true, paramType = "path") @GetMapping("/{id}") - private ResultMessage list(@PathVariable String id) { - return ResultUtil.data(freightTemplateService.getFreightTemplate(id)); + public ResultMessage list(@PathVariable String id) { + FreightTemplateVO freightTemplate = OperationalJudgment.judgment(freightTemplateService.getFreightTemplate(id)); + return ResultUtil.data(freightTemplate); } @ApiOperation(value = "添加商家运费模板") @PostMapping public ResultMessage add(@Valid @RequestBody FreightTemplateVO freightTemplateVO) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + freightTemplateVO.setStoreId(storeId); return ResultUtil.data(freightTemplateService.addFreightTemplate(freightTemplateVO)); } @ApiOperation(value = "修改商家运费模板") @PutMapping("/{id}") public ResultMessage edit(@PathVariable String id, @RequestBody @Valid FreightTemplateVO freightTemplateVO) { + OperationalJudgment.judgment(freightTemplateService.getFreightTemplate(id)); return ResultUtil.data(freightTemplateService.editFreightTemplate(freightTemplateVO)); } @@ -59,9 +63,8 @@ public class FreightTemplateStoreController { @ApiImplicitParam(name = "id", value = "商家模板ID", required = true, paramType = "path") @DeleteMapping("/{id}") public ResultMessage edit(@PathVariable String id) { - if (freightTemplateService.removeFreightTemplate(id)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + OperationalJudgment.judgment(freightTemplateService.getFreightTemplate(id)); + freightTemplateService.removeFreightTemplate(id); + return ResultUtil.success(); } } diff --git a/seller-api/src/main/java/cn/lili/controller/settings/LogStoreController.java b/seller-api/src/main/java/cn/lili/controller/settings/LogStoreController.java index e76db9aa..d3b96c59 100644 --- a/seller-api/src/main/java/cn/lili/controller/settings/LogStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/settings/LogStoreController.java @@ -1,36 +1,34 @@ package cn.lili.controller.settings; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.SearchVO; import cn.lili.modules.permission.service.SystemLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.Objects; + /** * 店铺端,日志管理接口 * * @author Chopper - * @date: 2020/11/22 14:23 + * @since 2020/11/22 14:23 */ -@Transactional @RestController @Api(tags = "店铺端,日志管理接口") -@RequestMapping("/store/log") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/settings/log") public class LogStoreController { - - private final SystemLogService systemLogService; + @Autowired + private SystemLogService systemLogService; @GetMapping(value = "/getAllByPage") @ApiOperation(value = "分页获取全部") @@ -39,6 +37,7 @@ public class LogStoreController { String operatorName, SearchVO searchVo, PageVO pageVo) { - return ResultUtil.data(systemLogService.queryLog(UserContext.getCurrentUser().getStoreId(), operatorName, key, searchVo, pageVo)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(systemLogService.queryLog(storeId, operatorName, key, searchVo, pageVo)); } } diff --git a/seller-api/src/main/java/cn/lili/controller/settings/LogisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/settings/LogisticsStoreController.java deleted file mode 100644 index e8123017..00000000 --- a/seller-api/src/main/java/cn/lili/controller/settings/LogisticsStoreController.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.lili.controller.settings; - - -import cn.lili.common.enums.MessageCode; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.store.entity.dos.StoreLogistics; -import cn.lili.modules.system.entity.vo.StoreLogisticsVO; -import cn.lili.modules.system.service.StoreLogisticsService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 店铺端,物流公司接口 - * - * @author Bulbasaur - * @date: 2020/11/22 14:23 - */ -@RestController -@Api(tags = "店铺端,物流公司接口") -@RequestMapping("/store/logistics") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class LogisticsStoreController { - - /** - * 物流公司 - */ - private final StoreLogisticsService storeLogisticsService; - - @ApiOperation(value = "获取商家物流公司列表,如果已选择则checked有值") - @GetMapping - public ResultMessage> get() { - return ResultUtil.data(storeLogisticsService.getStoreLogistics()); - } - - @ApiOperation(value = "获取商家已选择物流公司列表") - @GetMapping("/getChecked") - public ResultMessage> getChecked() { - return ResultUtil.data(storeLogisticsService.getStoreSelectedLogistics()); - } - - @ApiOperation(value = "选择物流公司") - @ApiImplicitParam(name = "logisticsId", value = "物流公司ID", required = true, paramType = "path") - @PostMapping("/{logisticsId}") - public ResultMessage checked(@PathVariable String logisticsId) { - return ResultUtil.data(storeLogisticsService.add(logisticsId)); - } - - - @ApiOperation(value = "取消选择物流公司") - @ApiImplicitParam(name = "id", value = "物流公司ID", required = true, paramType = "path") - @DeleteMapping(value = "/{id}") - public ResultMessage cancel(@PathVariable String id) { - storeLogisticsService.removeById(id); - return ResultUtil.success(ResultCode.SUCCESS); - } - -} diff --git a/seller-api/src/main/java/cn/lili/controller/settings/StorePageDataController.java b/seller-api/src/main/java/cn/lili/controller/settings/PageDataStoreController.java similarity index 51% rename from seller-api/src/main/java/cn/lili/controller/settings/StorePageDataController.java rename to seller-api/src/main/java/cn/lili/controller/settings/PageDataStoreController.java index 2d2c3ffc..089e5e87 100644 --- a/seller-api/src/main/java/cn/lili/controller/settings/StorePageDataController.java +++ b/seller-api/src/main/java/cn/lili/controller/settings/PageDataStoreController.java @@ -1,7 +1,9 @@ package cn.lili.controller.settings; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.page.entity.dos.PageData; @@ -9,39 +11,42 @@ import cn.lili.modules.page.entity.dto.PageDataDTO; import cn.lili.modules.page.entity.enums.PageEnum; import cn.lili.modules.page.entity.vos.PageDataListVO; import cn.lili.modules.page.service.PageDataService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.Objects; /** - * 店铺端,页面接口 + * 店铺端,页面设置管理接口 * * @author paulGao - * @date: 2020/11/22 14:23 + * @since 2020-05-06 15:18:56 */ @RestController -@Api(tags = "店铺端,页面接口") -@RequestMapping("/store/pageData") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class StorePageDataController { +@Api(tags = "店铺端,页面设置管理接口") +@RequestMapping("/store/settings/pageData") +public class PageDataStoreController { - private final PageDataService pageDataService; + @Autowired + private PageDataService pageDataService; @ApiOperation(value = "页面列表") @ApiImplicitParam(name = "pageClientType", value = "客户端类型", required = true, dataType = "String", paramType = "path") @GetMapping("/{pageClientType}/pageDataList") public ResultMessage> pageDataList(@PathVariable String pageClientType, PageVO pageVO) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); PageDataDTO pageDataDTO = new PageDataDTO(); pageDataDTO.setPageType(PageEnum.STORE.name()); pageDataDTO.setPageClientType(pageClientType); - pageDataDTO.setNum(UserContext.getCurrentUser().getStoreId()); + pageDataDTO.setNum(storeId); return ResultUtil.data(pageDataService.getPageDataList(pageVO, pageDataDTO)); } @@ -49,42 +54,68 @@ public class StorePageDataController { @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/{id}") public ResultMessage getPageData(@PathVariable String id) { - return ResultUtil.data(pageDataService.getById(id)); + //查询当前店铺下的页面数据 + PageData pageData = pageDataService.getOne( + new LambdaQueryWrapper() + .eq(PageData::getPageType, PageEnum.STORE.name()) + .eq(PageData::getNum, UserContext.getCurrentUser().getStoreId()) + .eq(PageData::getId, id)); + return ResultUtil.data(pageData); } - @ApiOperation(value = "添加店铺首页") - @ApiImplicitParams({ - @ApiImplicitParam(name = "name", value = "页面名称", required = true, dataType = "String", paramType = "query"), - @ApiImplicitParam(name = "pageClientType", value = "客户端类型", required = true, dataType = "String", paramType = "query"), - @ApiImplicitParam(name = "pageData", value = "页面数据", required = true, dataType = "String", paramType = "query") - }) + @ApiOperation(value = "添加页面") @PostMapping("/save") - public ResultMessage savePageData(@RequestParam String name, @RequestParam String pageClientType, @RequestParam String pageData) { - return ResultUtil.data(pageDataService.addPageData(new PageData(name, pageClientType, pageData))); + public ResultMessage addPageData(@Valid PageData pageData) { + //添加店铺类型,填写店铺ID + pageData.setPageType(PageEnum.STORE.name()); + pageData.setNum(UserContext.getCurrentUser().getStoreId()); + return ResultUtil.data(pageDataService.addPageData(pageData)); } - @ApiOperation(value = "修改首页") + @ApiOperation(value = "修改页面") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") }) @PutMapping("/update/{id}") - public ResultMessage updatePageData(@Valid PageData pageData, @PathVariable String id) { + public ResultMessage updatePageData(@Valid PageData pageData, @NotNull @PathVariable String id) { + + this.checkAuthority(id); pageData.setId(id); + //添加店铺类型,填写店铺ID + pageData.setPageType(PageEnum.STORE.name()); + pageData.setNum(UserContext.getCurrentUser().getStoreId()); return ResultUtil.data(pageDataService.updatePageData(pageData)); } + @ApiOperation(value = "发布页面") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @PutMapping("/release/{id}") - public ResultMessage releasePageData(@PathVariable String id) { + public ResultMessage release(@PathVariable String id) { + this.checkAuthority(id); return ResultUtil.data(pageDataService.releasePageData(id)); } @ApiOperation(value = "删除页面") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @DeleteMapping("/removePageData/{id}") - public ResultMessage removePageData(@PathVariable String id) { + public ResultMessage remove(@PathVariable String id) { + this.checkAuthority(id); return ResultUtil.data(pageDataService.removePageData(id)); } + + /** + * 店铺权限判定 + * + * @param id + */ + private void checkAuthority(String id) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(PageData::getId, id).eq(PageData::getPageType, PageEnum.STORE.name()).eq(PageData::getNum, storeId); + PageData data = pageDataService.getOne(queryWrapper); + if (data == null) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + } } diff --git a/seller-api/src/main/java/cn/lili/controller/settings/StoreAddressController.java b/seller-api/src/main/java/cn/lili/controller/settings/StoreAddressController.java index 25936734..072a73e1 100644 --- a/seller-api/src/main/java/cn/lili/controller/settings/StoreAddressController.java +++ b/seller-api/src/main/java/cn/lili/controller/settings/StoreAddressController.java @@ -1,10 +1,9 @@ package cn.lili.controller.settings; -import cn.lili.common.enums.MessageCode; -import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.store.entity.dos.StoreAddress; @@ -13,46 +12,49 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.Objects; /** * 店铺端,商家地址(自提点)接口 * * @author Bulbasaur - * @date: 2020/11/22 14:23 + * @since 2020/11/22 14:23 */ @RestController @Api(tags = "店铺端,商家地址(自提点)接口") -@RequestMapping("/store/storeAddress") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/member/storeAddress") public class StoreAddressController { /** * 店铺自提点 */ - private final StoreAddressService storeAddressService; + @Autowired + private StoreAddressService storeAddressService; @ApiOperation(value = "获取商家自提点分页") @GetMapping public ResultMessage> get(PageVO pageVo) { - return ResultUtil.data(storeAddressService.getStoreAddress(pageVo)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + return ResultUtil.data(storeAddressService.getStoreAddress(storeId, pageVo)); } @ApiOperation(value = "获取商家自提点信息") @ApiImplicitParam(name = "id", value = "自提点ID", required = true, paramType = "path") @GetMapping("/{id}") public ResultMessage get(@PathVariable String id) { - return ResultUtil.data(storeAddressService.getById(id)); + StoreAddress address = OperationalJudgment.judgment(storeAddressService.getById(id)); + return ResultUtil.data(address); } @ApiOperation(value = "添加") @PostMapping public ResultMessage add(@Valid StoreAddress storeAddress) { - storeAddress.setStoreId(UserContext.getCurrentUser().getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + storeAddress.setStoreId(storeId); storeAddressService.save(storeAddress); return ResultUtil.data(storeAddress); } @@ -61,8 +63,10 @@ public class StoreAddressController { @ApiImplicitParam(name = "id", value = "自提点ID", required = true, paramType = "path") @PutMapping("/{id}") public ResultMessage edit(@PathVariable String id, @Valid StoreAddress storeAddress) { + OperationalJudgment.judgment(storeAddressService.getById(id)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); storeAddress.setId(id); - storeAddress.setStoreId(UserContext.getCurrentUser().getStoreId()); + storeAddress.setStoreId(storeId); storeAddressService.updateById(storeAddress); return ResultUtil.data(storeAddress); } @@ -71,8 +75,9 @@ public class StoreAddressController { @ApiImplicitParam(name = "id", value = "自提点ID", required = true, paramType = "path") @DeleteMapping(value = "/{id}") public ResultMessage delByIds(@PathVariable String id) { + OperationalJudgment.judgment(storeAddressService.getById(id)); storeAddressService.removeStoreAddress(id); - return ResultUtil.success(ResultCode.SUCCESS); + return ResultUtil.success(); } } diff --git a/seller-api/src/main/java/cn/lili/controller/settings/StoreSettingsController.java b/seller-api/src/main/java/cn/lili/controller/settings/StoreSettingsController.java index cef6fa54..d651b6d5 100644 --- a/seller-api/src/main/java/cn/lili/controller/settings/StoreSettingsController.java +++ b/seller-api/src/main/java/cn/lili/controller/settings/StoreSettingsController.java @@ -1,11 +1,10 @@ package cn.lili.controller.settings; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.utils.ResultUtil; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.store.entity.dos.StoreDetail; import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO; +import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; import cn.lili.modules.store.entity.dto.StoreSettingDTO; import cn.lili.modules.store.entity.vos.StoreVO; import cn.lili.modules.store.service.StoreDetailService; @@ -13,7 +12,6 @@ import cn.lili.modules.store.service.StoreService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -26,22 +24,23 @@ import javax.validation.Valid; * 店铺端,店铺设置接口 * * @author Bulbasaur - * @date: 2020/11/22 14:23 + * @since 2020/11/22 14:23 */ @RestController @Api(tags = "店铺端,店铺设置接口") -@RequestMapping("/store/settings") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/settings/storeSettings") public class StoreSettingsController { /** * 店铺 */ - private final StoreService storeService; + @Autowired + private StoreService storeService; /** * 店铺详情 */ - private final StoreDetailService storeDetailService; + @Autowired + private StoreDetailService storeDetailService; @ApiOperation(value = "获取商家设置") @GetMapping @@ -52,23 +51,27 @@ public class StoreSettingsController { @ApiOperation(value = "修改商家设置") @PutMapping - public ResultMessage edit(@Valid StoreSettingDTO storeSettingDTO) { + public ResultMessage edit(@Valid StoreSettingDTO storeSettingDTO) { //修改商家设置 - if (storeDetailService.editStoreSetting(storeSettingDTO)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + Boolean result = storeDetailService.editStoreSetting(storeSettingDTO); + return ResultUtil.data(result); + } + + @ApiOperation(value = "修改商家设置") + @PutMapping("/merchantEuid") + public ResultMessage edit(String merchantEuid) { + //修改UDESK设置 + Boolean result = storeDetailService.editMerchantEuid(merchantEuid); + return ResultUtil.data(result); } @ApiOperation(value = "修改店铺库存预警数量") @ApiImplicitParam(name = "stockWarning", value = "库存预警数量", required = true, dataType = "Integer", paramType = "query") @PutMapping("/updateStockWarning") - public ResultMessage updateStockWarning(Integer stockWarning) { + public ResultMessage updateStockWarning(Integer stockWarning) { //修改商家设置 - if (storeDetailService.updateStockWarning(stockWarning)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + boolean result = storeDetailService.updateStockWarning(stockWarning); + return ResultUtil.data(result); } @ApiOperation(value = "获取商家退货收件地址") @@ -80,11 +83,24 @@ public class StoreSettingsController { @ApiOperation(value = "修改商家退货收件地址") @PutMapping("/storeAfterSaleAddress") - public ResultMessage editStoreAfterSaleAddress(@Valid StoreAfterSaleAddressDTO storeAfterSaleAddressDTO) { + public ResultMessage editStoreAfterSaleAddress(@Valid StoreAfterSaleAddressDTO storeAfterSaleAddressDTO) { //修改商家退货收件地址 - if (storeDetailService.editStoreAfterSaleAddressDTO(storeAfterSaleAddressDTO)) { - return ResultUtil.success(ResultCode.SUCCESS); - } - return ResultUtil.error(ResultCode.ERROR); + boolean result = storeDetailService.editStoreAfterSaleAddressDTO(storeAfterSaleAddressDTO); + return ResultUtil.data(result); + } + + + @ApiOperation(value = "获取商家发货地址") + @GetMapping("/storeDeliverGoodsAddress") + public ResultMessage getStoreDeliverGoodsAddress(){ + return ResultUtil.data(storeDetailService.getStoreDeliverGoodsAddressDto()); + } + + @ApiOperation(value = "修改商家发货地址") + @PutMapping("/storeDeliverGoodsAddress") + public ResultMessage editStoreDeliverGoodsAddress(@Valid StoreDeliverGoodsAddressDTO storeDeliverGoodsAddressDTO) { + //修改商家退货收件地址 + boolean result = storeDetailService.editStoreDeliverGoodsAddressDTO(storeDeliverGoodsAddressDTO); + return ResultUtil.data(result); } } diff --git a/seller-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsStoreController.java index 4a171d92..75159dd0 100644 --- a/seller-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsStoreController.java @@ -1,42 +1,43 @@ package cn.lili.controller.statistics; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.dto.GoodsStatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import cn.lili.modules.statistics.service.GoodsStatisticsDataService; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.GoodsStatisticsDataVO; +import cn.lili.modules.statistics.service.StoreFlowStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Objects; /** * 店铺端,商品统计接口 * * @author Bulbasaur - * @date: 2020/11/22 14:23 + * @since 2020/11/22 14:23 */ @Api(tags = "店铺端,商品统计接口") @RestController @RequestMapping("/store/statistics/goods") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GoodsStatisticsStoreController { /** * 商品统计 */ - private final GoodsStatisticsDataService goodsStatisticsDataService; + @Autowired + private StoreFlowStatisticsService storeFlowStatisticsService; @ApiOperation(value = "获取统计列表,排行前一百的数据") @GetMapping public ResultMessage> getByPage(GoodsStatisticsQueryParam statisticsQueryParam) { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - return ResultUtil.data(goodsStatisticsDataService.getGoodsStatisticsData(statisticsQueryParam, 100)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + statisticsQueryParam.setStoreId(storeId); + return ResultUtil.data(storeFlowStatisticsService.getGoodsStatisticsData(statisticsQueryParam, 100)); } } diff --git a/seller-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsStoreController.java index 37579ef0..32f11e59 100644 --- a/seller-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsStoreController.java @@ -1,49 +1,51 @@ package cn.lili.controller.statistics; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.dto.GoodsStatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.GoodsStatisticsDataVO; -import cn.lili.modules.statistics.model.vo.StoreIndexStatisticsVO; -import cn.lili.modules.statistics.service.GoodsStatisticsDataService; +import cn.lili.modules.statistics.entity.dto.GoodsStatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.GoodsStatisticsDataVO; +import cn.lili.modules.statistics.entity.vo.StoreIndexStatisticsVO; import cn.lili.modules.statistics.service.IndexStatisticsService; +import cn.lili.modules.statistics.service.StoreFlowStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Objects; /** * 店铺端,首页统计接口 * * @author Bulbasaur - * @date: 2020/12/9 19:04 + * @since 2020/12/9 19:04 */ @Api(tags = "店铺端,首页统计接口") @RestController @RequestMapping("/store/statistics/index") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class IndexStatisticsStoreController { /** * 热卖商品统计 */ - private final GoodsStatisticsDataService goodsStatisticsDataService; + @Autowired + private StoreFlowStatisticsService storeFlowStatisticsService; /** * 首页统计 */ - private final IndexStatisticsService indexStatisticsService; + @Autowired + private IndexStatisticsService indexStatisticsService; @ApiOperation(value = "获取统计列表,排行前一百的数据") @GetMapping("/top100") public ResultMessage> getByPage(GoodsStatisticsQueryParam statisticsQueryParam) { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - return ResultUtil.data(goodsStatisticsDataService.getGoodsStatisticsData(statisticsQueryParam, 100)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + statisticsQueryParam.setStoreId(storeId); + return ResultUtil.data(storeFlowStatisticsService.getGoodsStatisticsData(statisticsQueryParam, 100)); } @ApiOperation(value = "获取首页查询数据") diff --git a/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java index 936614e1..2285e9ad 100644 --- a/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java @@ -1,61 +1,60 @@ package cn.lili.controller.statistics; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.order.order.entity.dos.AfterSale; +import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; -import cn.lili.modules.order.order.service.AfterSaleService; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.OrderOverviewVO; -import cn.lili.modules.statistics.model.vo.OrderStatisticsDataVO; -import cn.lili.modules.statistics.service.OrderStatisticsDataService; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.OrderOverviewVO; +import cn.lili.modules.statistics.entity.vo.OrderStatisticsDataVO; +import cn.lili.modules.statistics.service.AfterSaleStatisticsService; +import cn.lili.modules.statistics.service.OrderStatisticsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Objects; /** * 店铺端,订单统计接口 * * @author Bulbasaur - * @date: 2020/12/9 19:04 + * @since 2020/12/9 19:04 */ +@Slf4j @Api(tags = "店铺端,订单统计接口") @RestController @RequestMapping("/store/statistics/order") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class OrderStatisticsStoreController { - /** - * 订单 - */ - private final OrderService orderService; /** * 售后 */ - private final AfterSaleService afterSaleService; + @Autowired + private AfterSaleStatisticsService afterSaleStatisticsService; /** * 订单统计 */ - private final OrderStatisticsDataService orderStatisticsDataService; + @Autowired + private OrderStatisticsService orderStatisticsService; @ApiOperation(value = "订单概览统计") @GetMapping("/overview") public ResultMessage overview(StatisticsQueryParam statisticsQueryParam) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); try { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - return ResultUtil.data(orderStatisticsDataService.overview(statisticsQueryParam)); + statisticsQueryParam.setStoreId(storeId); + return ResultUtil.data(orderStatisticsService.overview(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单概览统计错误", e); } return null; } @@ -63,11 +62,12 @@ public class OrderStatisticsStoreController { @ApiOperation(value = "订单图表统计") @GetMapping public ResultMessage> statisticsChart(StatisticsQueryParam statisticsQueryParam) { + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); try { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - return ResultUtil.data(orderStatisticsDataService.statisticsChart(statisticsQueryParam)); + statisticsQueryParam.setStoreId(storeId); + return ResultUtil.data(orderStatisticsService.statisticsChart(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单图表统计错误", e); } return null; } @@ -76,12 +76,12 @@ public class OrderStatisticsStoreController { @ApiOperation(value = "订单统计") @GetMapping("/order") public ResultMessage> order(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { - + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); try { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - return ResultUtil.data(orderService.getStatistics(statisticsQueryParam, pageVO)); + statisticsQueryParam.setStoreId(storeId); + return ResultUtil.data(orderStatisticsService.getStatistics(statisticsQueryParam, pageVO)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单统计错误", e); } return null; } @@ -90,7 +90,8 @@ public class OrderStatisticsStoreController { @ApiOperation(value = "退单统计") @GetMapping("/refund") public ResultMessage> refund(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - return ResultUtil.data(afterSaleService.getStatistics(statisticsQueryParam, pageVO)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + statisticsQueryParam.setStoreId(storeId); + return ResultUtil.data(afterSaleStatisticsService.getStatistics(statisticsQueryParam, pageVO)); } } diff --git a/seller-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsStoreController.java index 189148dd..6b13166e 100644 --- a/seller-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/statistics/RefundOrderStatisticsStoreController.java @@ -1,46 +1,49 @@ package cn.lili.controller.statistics; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.RefundOrderStatisticsDataVO; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.RefundOrderStatisticsDataVO; import cn.lili.modules.statistics.service.RefundOrderStatisticsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Objects; + /** * 店铺端,退款统计接口 * * @author Bulbasaur - * @date: 2020/12/9 19:04 + * @since 2020/12/9 19:04 */ @Api(tags = "店铺端,退款统计接口") @RestController -@RequestMapping("/store/statistics/refund/order") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +@RequestMapping("/store/statistics/refundOrder") public class RefundOrderStatisticsStoreController { - private final RefundOrderStatisticsService refundOrderStatisticsService; + @Autowired + private RefundOrderStatisticsService refundOrderStatisticsService; @ApiOperation(value = "获取退款统计列表") @GetMapping("/getByPage") public ResultMessage> getByPage(PageVO pageVO, StatisticsQueryParam statisticsQueryParam) { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + statisticsQueryParam.setStoreId(storeId); return ResultUtil.data(refundOrderStatisticsService.getRefundOrderStatisticsData(pageVO, statisticsQueryParam)); } @ApiOperation(value = "获取退款统计金额") @GetMapping("/getPrice") public ResultMessage getPrice(StatisticsQueryParam statisticsQueryParam) { - statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + statisticsQueryParam.setStoreId(storeId); Double price = refundOrderStatisticsService.getRefundOrderStatisticsPrice(statisticsQueryParam); return ResultUtil.data(price); } diff --git a/seller-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsStoreController.java index ca1c8f86..dca45408 100644 --- a/seller-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/statistics/ViewStatisticsStoreController.java @@ -1,39 +1,39 @@ package cn.lili.controller.statistics; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.security.context.UserContext; -import cn.lili.common.utils.ResultUtil; import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; -import cn.lili.modules.statistics.model.vo.PlatformViewVO; -import cn.lili.modules.statistics.service.PlatformViewDataService; +import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; +import cn.lili.modules.statistics.entity.vo.PlatformViewVO; +import cn.lili.modules.statistics.service.PlatformViewService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Objects; /** * 店铺端,流量统计接口 * * @author Chopper - * @date 2021/2/9 11:19 + * @since 2021/2/9 11:19 */ @Api(tags = "店铺端,流量统计接口") @RestController @RequestMapping("/store/statistics/view") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class ViewStatisticsStoreController { - - private final PlatformViewDataService platformViewDataService; + @Autowired + private PlatformViewService platformViewService; @ApiOperation(value = "流量数据 表单获取") @GetMapping("/list") public ResultMessage> getByPage(StatisticsQueryParam queryParam) { - queryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); - return ResultUtil.data(platformViewDataService.list(queryParam)); + String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId(); + queryParam.setStoreId(storeId); + return ResultUtil.data(platformViewService.list(queryParam)); } } diff --git a/seller-api/src/main/java/cn/lili/controller/trade/OrderStoreController.java b/seller-api/src/main/java/cn/lili/controller/trade/OrderStoreController.java deleted file mode 100644 index 83f03d06..00000000 --- a/seller-api/src/main/java/cn/lili/controller/trade/OrderStoreController.java +++ /dev/null @@ -1,124 +0,0 @@ -package cn.lili.controller.trade; - -import cn.lili.common.utils.ResultUtil; -import cn.lili.common.vo.ResultMessage; -import cn.lili.modules.member.entity.dto.MemberAddressDTO; -import cn.lili.modules.order.order.entity.dto.OrderSearchParams; -import cn.lili.modules.order.order.entity.vo.OrderDetailVO; -import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; -import cn.lili.modules.order.order.service.OrderPriceService; -import cn.lili.modules.order.order.service.OrderService; -import com.baomidou.mybatisplus.core.metadata.IPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - * 店铺端,订单接口 - * - * @author Chopper - * @date 2020/11/17 4:35 下午 - **/ -@RestController -@RequestMapping("/store/orders") -@Api(tags = "店铺端,订单接口") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class OrderStoreController { - - /** - * 订单 - */ - private final OrderService orderService; - - /** - * 订单价格 - */ - private final OrderPriceService orderPriceService; - - @ApiOperation(value = "查询订单列表") - @GetMapping - public ResultMessage> queryMineOrder(OrderSearchParams orderSearchParams) { - return ResultUtil.data(orderService.queryByParams(orderSearchParams)); - } - - - @ApiOperation(value = "订单明细") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") - }) - @GetMapping(value = "/{orderSn}") - public ResultMessage detail(@NotNull @PathVariable String orderSn) { - - return ResultUtil.data(orderService.queryDetail(orderSn)); - } - - @ApiOperation(value = "修改收货人信息") - @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path") - @PostMapping(value = "/update/{orderSn}/consignee") - public ResultMessage consignee(@NotNull(message = "参数非法") @PathVariable String orderSn, - @Valid MemberAddressDTO memberAddressDTO) { - return ResultUtil.data(orderService.updateConsignee(orderSn, memberAddressDTO)); - } - - @ApiOperation(value = "修改订单价格") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "orderPrice", value = "订单价格", required = true, dataType = "Double", paramType = "query"), - }) - @PutMapping(value = "/update/{orderSn}/price") - public ResultMessage updateOrderPrice(@PathVariable String orderSn, - @NotNull(message = "订单价格不能为空") @RequestParam Double orderPrice) { - return ResultUtil.data(orderPriceService.updatePrice(orderSn, orderPrice)); - } - - @ApiOperation(value = "订单发货") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "logisticsNo", value = "发货单号", required = true, dataType = "String", paramType = "query"), - @ApiImplicitParam(name = "logisticsId", value = "物流公司", required = true, dataType = "String", paramType = "query") - }) - @PostMapping(value = "/{orderSn}/delivery") - public ResultMessage delivery(@NotNull(message = "参数非法") @PathVariable String orderSn, - @NotNull(message = "发货单号不能为空") String logisticsNo, - @NotNull(message = "请选择物流公司") String logisticsId) { - return ResultUtil.data(orderService.delivery(orderSn, logisticsNo, logisticsId)); - } - - @ApiOperation(value = "取消订单") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "reason", value = "取消原因", required = true, dataType = "String", paramType = "query") - }) - @PostMapping(value = "/{orderSn}/cancel") - public ResultMessage cancel(@PathVariable String orderSn, @RequestParam String reason) { - return ResultUtil.data(orderService.cancel(orderSn, reason)); - } - - @ApiOperation(value = "订单核验") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "qrCode", value = "发货单号", required = true, dataType = "String", paramType = "query") - }) - @PostMapping(value = "/{orderSn}/take") - public ResultMessage take(@NotNull(message = "参数非法") @PathVariable String orderSn, - @NotNull(message = "核验码") String qrCode) { - return ResultUtil.data(orderService.take(orderSn, qrCode)); - } - - @ApiOperation(value = "查询物流踪迹") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") - }) - @PostMapping(value = "/getTraces/{orderSn}") - public ResultMessage getTraces(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) { - return ResultUtil.data(orderService.getTraces(orderSn)); - } -} \ No newline at end of file diff --git a/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java b/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java index bb4d317b..c0b147af 100644 --- a/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java +++ b/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java @@ -1,12 +1,14 @@ package cn.lili.security; import cn.hutool.core.util.StrUtil; -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; +import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.PermissionEnum; import cn.lili.common.security.enums.SecurityEnum; import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.token.SecretKeyUtil; +import cn.lili.common.security.token.SecretKeyUtil; import cn.lili.common.utils.ResponseUtil; import com.google.gson.Gson; import io.jsonwebtoken.Claims; @@ -20,7 +22,10 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; +import org.springframework.util.PatternMatchUtils; +import org.springframework.web.bind.annotation.RequestMethod; +import javax.naming.NoPermissionException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -28,6 +33,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * @author Chopper @@ -45,20 +51,22 @@ public class StoreAuthenticationFilter extends BasicAuthenticationFilter { @SneakyThrows @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { - - String accessToken = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); - if (StrUtil.isBlank(accessToken)) { + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, + ServletException { + //从header中获取jwt + String jwt = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); + //如果没有token 则return + if (StrUtil.isBlank(jwt)) { chain.doFilter(request, response); return; } - try { - UsernamePasswordAuthenticationToken authentication = getAuthentication(accessToken, response); + //获取用户信息,存入context + UsernamePasswordAuthenticationToken authentication = getAuthentication(jwt, response); + //自定义权限过滤 + if (authentication != null) { + customAuthentication(request, response, authentication); SecurityContextHolder.getContext().setAuthentication(authentication); - } catch (Exception e) { - log.error(e.getMessage()); } - chain.doFilter(request, response); } @@ -81,8 +89,8 @@ public class StoreAuthenticationFilter extends BasicAuthenticationFilter { String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString(); AuthUser authUser = new Gson().fromJson(json, AuthUser.class); - // 校验redis中是否有权限 - if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.STORE) + jwt)) { + //校验redis中是否有权限 + if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.STORE, authUser.getId()) + jwt)) { //用户角色 List auths = new ArrayList<>(); auths.add(new SimpleGrantedAuthority("ROLE_" + authUser.getRole().name())); @@ -100,5 +108,61 @@ public class StoreAuthenticationFilter extends BasicAuthenticationFilter { } return null; } + + + /** + * 自定义权限过滤 + * + * @param request 请求 + * @param response 响应 + * @param authentication 用户信息 + */ + private void customAuthentication(HttpServletRequest request, HttpServletResponse response, UsernamePasswordAuthenticationToken authentication) throws NoPermissionException { + AuthUser authUser = (AuthUser) authentication.getDetails(); + String requestUrl = request.getRequestURI(); + + + //如果不是超级管理员, 则鉴权 + if (!authUser.getIsSuper()) { + //获取缓存中的权限 + Map> permission = + (Map>) cache.get(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + authUser.getId()); + + //获取数据(GET 请求)权限 + if (request.getMethod().equals(RequestMethod.GET.name())) { + //如果用户的超级权限和查阅权限都不包含当前请求的api + if (match(permission.get(PermissionEnum.SUPER.name()), requestUrl) + || match(permission.get(PermissionEnum.QUERY.name()), requestUrl)) { + } else { + ResponseUtil.output(response, ResponseUtil.resultMap(false, 400, "权限不足")); + log.error("当前请求路径:{},所拥有权限:{}", requestUrl, JSONUtil.toJsonStr(permission)); + throw new NoPermissionException("权限不足"); + } + } + //非get请求(数据操作) 判定鉴权 + else { + if (!match(permission.get(PermissionEnum.SUPER.name()), requestUrl)) { + ResponseUtil.output(response, ResponseUtil.resultMap(false, 400, "权限不足")); + log.error("当前请求路径:{},所拥有权限:{}", requestUrl, JSONUtil.toJsonStr(permission)); + throw new NoPermissionException("权限不足"); + } + } + } + } + + /** + * 校验权限 + * + * @param permissions 权限集合 + * @param url 请求地址 + * @return 是否拥有权限 + */ + boolean match(List permissions, String url) { + if (permissions == null || permissions.isEmpty()) { + return false; + } + return PatternMatchUtils.simpleMatch(permissions.toArray(new String[0]), url); + } + } diff --git a/seller-api/src/main/java/cn/lili/security/StoreSecurityConfig.java b/seller-api/src/main/java/cn/lili/security/StoreSecurityConfig.java index 33b57956..50202694 100644 --- a/seller-api/src/main/java/cn/lili/security/StoreSecurityConfig.java +++ b/seller-api/src/main/java/cn/lili/security/StoreSecurityConfig.java @@ -1,10 +1,9 @@ package cn.lili.security; -import cn.lili.common.cache.Cache; +import cn.lili.cache.Cache; import cn.lili.common.security.CustomAccessDeniedHandler; import cn.lili.common.utils.SpringContextUtil; -import cn.lili.config.properties.IgnoredUrlsProperties; -import lombok.RequiredArgsConstructor; +import cn.lili.common.properties.IgnoredUrlsProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -19,27 +18,27 @@ import org.springframework.web.cors.CorsConfigurationSource; * spring Security 核心配置类 Store安全配置中心 * * @author Chopper - * @date 2020/11/14 16:20 + * @since 2020/11/14 16:20 */ @Slf4j @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StoreSecurityConfig extends WebSecurityConfigurerAdapter { - /** * 忽略验权配置 */ - private final IgnoredUrlsProperties ignoredUrlsProperties; + @Autowired + private IgnoredUrlsProperties ignoredUrlsProperties; /** * spring security -》 权限不足处理 */ - private final CustomAccessDeniedHandler accessDeniedHandler; + @Autowired + private CustomAccessDeniedHandler accessDeniedHandler; - - private final Cache cache; + @Autowired + private Cache cache; @Override @@ -47,34 +46,34 @@ public class StoreSecurityConfig extends WebSecurityConfigurerAdapter { ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = http .authorizeRequests(); - // 配置的url 不需要授权 + //配置的url 不需要授权 for (String url : ignoredUrlsProperties.getUrls()) { registry.antMatchers(url).permitAll(); } registry.and() - // 禁止网页iframe + //禁止网页iframe .headers().frameOptions().disable() .and() .logout() .permitAll() .and() .authorizeRequests() - // 任何请求 + //任何请求 .anyRequest() - // 需要身份认证 + //需要身份认证 .authenticated() .and() - // 允许跨域 + //允许跨域 .cors().configurationSource((CorsConfigurationSource) SpringContextUtil.getBean("corsConfigurationSource")).and() - // 关闭跨站请求防护 + //关闭跨站请求防护 .csrf().disable() - // 前后端分离采用JWT 不需要session + //前后端分离采用JWT 不需要session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() - // 自定义权限拒绝处理类 + //自定义权限拒绝处理类 .exceptionHandling().accessDeniedHandler(accessDeniedHandler) .and() - // 添加JWT认证过滤器 + //添加JWT认证过滤器 .addFilter(new StoreAuthenticationFilter(authenticationManager(), cache)); } diff --git a/seller-api/src/main/resources/application.yml b/seller-api/src/main/resources/application.yml index b6854c83..eb93aaa3 100644 --- a/seller-api/src/main/resources/application.yml +++ b/seller-api/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -25,28 +22,15 @@ management: exposure: include: '*' spring: + application: + name: seller-api # 要在其中注册的Spring Boot Admin Server的URL。 boot: admin: client: url: http://127.0.0.1:8000 - # mongodb - data: - mongodb: - host: 127.0.0.1 - port: 27017 - database: lilishop - username: root - password: lilishop - authentication-database: admin - # replica-set-name: mongoreplset cache: type: redis - - jpa: - # 自动生成表结构 - generate-ddl: true - open-in-view: false # Redis redis: host: 127.0.0.1 @@ -118,13 +102,13 @@ spring: # standard: # sharding-column: create_time # #分表策略 - # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # precise-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm # #范围查询实现 - # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # range-algorithm-class-name: cn.lili.mybatis.sharding.CreateTimeShardingTableAlgorithm props: #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 sql: - show: true + show: false # 忽略鉴权url ignored: @@ -135,37 +119,17 @@ ignored: - /MP_verify_qSyvBPhDsPdxvOhC.txt - /weixin/** - /source/** - - /buyer/mini-program/** - - /buyer/cashier/** - - /buyer/pageData/** - - /buyer/article/** - - /buyer/goods/** - - /buyer/category/** - - /buyer/shop/** - - /buyer/connect/** - - /buyer/members/smsLogin - - /buyer/members/refresh/* - - /buyer/members/refresh** - - /buyer/promotion/pintuan - - /buyer/promotion/seckill - - /buyer/memberEvaluation/**/goodsEvaluation - - /buyer/memberEvaluation/**/evaluationNumber - - /store/login/** - - /manager/user/login - - /manager/user/refresh/** + - /store/passport/login/** + - /store/passport/login/refresh/** - /druid/** - /swagger-ui.html - /doc.html - /swagger-resources/** - /swagger/** - - /**/**.js - - /**/**.png - - /**/**.css - /webjars/** - /v2/api-docs - /configuration/ui - /boot-admin - statics: - /**/*.js - /**/*.css - /**/*.png @@ -193,19 +157,21 @@ mybatis-plus: # 日志 logging: + config: classpath:logback-spring.xml # 输出级别 level: cn.lili: info # org.hibernate: debug # org.springframework: debug - # org.springframework.data.mongodb.core: debug file: # 指定路径 path: lili-logs - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-size: 5MB + logback: + rollingpolicy: + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-file-size: 5MB #加密参数 jasypt: encryptor: @@ -262,7 +228,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 127.0.0.1:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group @@ -274,6 +241,8 @@ lili: order-group: lili_order_group member-topic: lili_member_topic member-group: lili_member_group + store-topic: lili_store_topic + store-group: lili_store_group other-topic: lili_other_topic other-group: lili_other_group notice-topic: lili_notice_topic diff --git a/seller-api/src/main/resources/logback-spring.xml b/seller-api/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..b7c9425a --- /dev/null +++ b/seller-api/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE_PATH}/rocketmq.log + + ${LOG_FILE_PATH}/rocketmq/rocketmq-%d{yyyy-MM-dd}.log + 30 + 30MB + + + %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n + + + + + + + + + + + ${LOGSTASH_SERVER} + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/socket-api/src/main/java/cn/lili/SocketApiApplication.java b/socket-api/src/main/java/cn/lili/SocketApiApplication.java deleted file mode 100644 index 947991d7..00000000 --- a/socket-api/src/main/java/cn/lili/SocketApiApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.lili; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -/** - * @author Chopper - */ -@SpringBootApplication -public class SocketApiApplication extends WebMvcConfigurerAdapter { - - - public static void main(String[] args) { - - System.setProperty("es.set.netty.runtime.available.processors", "false"); - SpringApplication.run(SocketApiApplication.class, args); - } - - @Override - public void addCorsMappings(CorsRegistry registry) { - - registry.addMapping("/**") - .allowCredentials(true) - .allowedHeaders("*") //允许任何头 - .allowedOrigins("*") //允许任何域名 - .allowedMethods("*"); //允许任何方法 - } - - -} diff --git a/socket-api/src/main/java/cn/lili/scocket/listener/MessageSendListener.java b/socket-api/src/main/java/cn/lili/scocket/listener/MessageSendListener.java deleted file mode 100644 index a972848c..00000000 --- a/socket-api/src/main/java/cn/lili/scocket/listener/MessageSendListener.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.lili.scocket.listener; - -import cn.hutool.json.JSONUtil; -import cn.lili.common.rocketmq.tags.OtherTagsEnum; -import cn.lili.common.utils.BeanUtil; -import cn.lili.modules.message.entity.dos.Message; -import cn.lili.modules.message.entity.enums.MessageShowType; -import cn.lili.modules.message.entity.vos.MessageShowVO; -import cn.lili.modules.message.mapper.StoreMessageMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; -import org.apache.rocketmq.spring.core.RocketMQListener; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.messaging.simp.SimpMessagingTemplate; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.CrossOrigin; - -/** - * @author paulG - * @since 2020/12/9 - **/ -@Component -@CrossOrigin -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -@RocketMQMessageListener(topic = "${lili.data.rocketmq.other-topic}", consumerGroup = "${lili.data.rocketmq.other-group}") -public class MessageSendListener implements RocketMQListener { - - private final StoreMessageMapper storeMessageMapper; - @Autowired - private SimpMessagingTemplate simpMessagingTemplate; - - @Override - public void onMessage(MessageExt messageExt) { - log.info(messageExt.getTags()); - switch (OtherTagsEnum.valueOf(messageExt.getTags())) { - //站内消息提醒 - case MESSAGE: - System.out.println("消息提醒"); - sendNoticeMessage(messageExt); - break; - default: - break; - } - } - - /** - * 给商家发送站内信息 - * - * @param messageExt - */ - private void sendNoticeMessage(MessageExt messageExt) { - MessageShowVO messageVO = new MessageShowVO(); - Message message = JSONUtil.toBean(new String(messageExt.getBody()), Message.class); - //构建vo - BeanUtil.copyProperties(message, messageVO); - messageVO.setType(MessageShowType.NOTICE.name()); - if (message.getMessageRange().equals("ALL")) { - simpMessagingTemplate.convertAndSend("/topic/subscribe", messageVO); - } else { - for (String id : message.getUserIds()) { - simpMessagingTemplate.convertAndSendToUser("SHOP_" + id, "/queue/subscribe", messageVO); - } - } - } -} diff --git a/xxl-job/README.md b/xxl-job/README.md index 983b99e0..d18c5efb 100644 --- a/xxl-job/README.md +++ b/xxl-job/README.md @@ -1,3 +1,5 @@ **默认登录账号 admin 密码 111111** +建议使用docker-compose一键启动,如果已经在docker-compose启动了基础应用,这里就不用启动了 + ###### **启动命令 java -jar xxl-job-admin-2.3.0-SNAPSHOT.jar --spring.config.location=application.properties** \ No newline at end of file diff --git a/xxl-job/XXLJOB-README.md b/xxl-job/XXLJOB-README.md index 49d97c48..755554ca 100644 --- a/xxl-job/XXLJOB-README.md +++ b/xxl-job/XXLJOB-README.md @@ -1,36 +1,3 @@ -

- -

XXL-JOB

-

- XXL-JOB, a distributed task scheduling framework. -
- -- Home Page -- -
-
- - - - - - - - - - - - - - - - - - - - - -

-

- ## Introduction XXL-JOB is a distributed task scheduling framework.